[mobile]真機+IDA調試apk中的so
很多mobile題目需要逆向分析apk中的so(尤其我們公司的比賽),所以這裏簡單總結一下調試apk中的so的方法。
材料:adb調試工具、root的真機一臺(模擬器無法調試so)、IDA
下載&安裝adb
adb是Android platform tools中的工具,可以去Androiddevtools下載:https://www.androiddevtools.cn/
下載完解壓出來:
裏面的這個就是adb,使用方法可以直接在這個目錄用命令號啓動:
也可以把它改名成adb.exe,之後和AdbWinApi.dll一起放在C:\Windows\system32目錄下:
然後就可以命令行直接啓動adb了:
準備調試
首先將apk安裝到手機上,然後手機usb連接電腦,插線的時候提示是否允許usb調試,選擇允許:
接下來在adb查看是否有設備連接: adb devices
可以看到設備已經連接,然後我們要用IDA調試so文件,所以需要把IDA的遠程調試server文件拷貝到手機中,使用adb 的push命令:
adb push .\android_server /data/local/tmp
接下來需要把手機的23946端口用adb forward命令轉發到本機的23946端口:
adb forward tcp:23946 tcp:23946
開始調試
使用adb shell
命令可以開啓 一個手機的shell:
然後su到root,如果不su到root的話會發現一會IDA掛上去之後看不到可以掛的進程,這也是爲什麼要用root手機的原因:
然後在手機上運行我們需要調試的程序:
接下來在adb shell中cd 到剛剛傳了android_server的目錄/data/local/tmp 然後執行 android_server:
之後啓動IDA,選擇Debugger->attach->Remote ARM Linux/Android debugger:
debug options根據自己選擇設置一下,然後選擇自己要掛的進程:
在右側寄存器窗口下面可以看到modules窗口,裏面找到自己要調試的so:
雙擊之後可以查看so中的函數,選擇自己要調試的函數下斷點:
然後我這裏要在手機中輸入一些東西才能走到這:
成功斷住:
然後可以調試了。
用到的命令:
adb devices //查看鏈接設備
adb push .\android_server /data/local/tmp //往手機拷貝東西
adb forward tcp:23946 tcp:23946 //端口轉發
adb shell //鏈接手機shell
補充:以調試模式啓動
上面介紹的方法是先在手機中運行要調試的程序,然後用IDA掛在上去,但有時候可能會有一點點問題(比如一些檢測是否被掛載的等等),這裏我的推薦還是找到程序中所有的反調試,然後patch掉,之後對apk進行重打包重簽名,然後安裝調試。
除此之外還有一種方法是讓apk直接以調試模式啓動,這種可以繞過一部分反調試,進入adb shell,用am命令以調試模式啓動程序:
am start -D -n com.bin.MathGame/.MainActivity
程序的名字可以啓動一下,然後用ps查看
之後手機上已經啓動了:
接下來再使用adb forward命令將這個進程的pid轉發到8700端口上:
adb forward tcp:8700 jdwp:{pid}
然後再使用jdb 的命令給進程一個啓動的信號:
jdb -connect “com.sun.jdi.SocketAttach:hostname=127.0.0.1,port=8700”
然後用IDA掛載就可以正常調試了