標籤:libc 資料 ida title 問題 XML man 知識庫 key
一、對android app進行分析時, 需要對其進行動態調試。1、IDA 附加進行調試
將ida目錄中的android_server push到安卓手機上
adb push android_server /data/local/tmp
1)、執行android_server:
adb shell /data/local/tmp/android_server
2)、連接埠轉寄:
adb forward tcp:23946 tcp:23946
3)、偵錯模式啟動程式,手機介面會出現Waiting For Debugger頁面
ddms
adb shell am start -D -n 包名/類名
4)、開啟32位的IDA,IDA附加並設定調試選項
GO -> Debugger -> Remote ARMLinux/Android debugger
Debugger — Debugger Options
5)命令列中執行:
ddms(為了使用jdb命令)
jdb -connect com.sun.jdi.SocketAttach:hostname=127.0.0.1,port=8700
其中port=8700是從ddms中看到的。
6)、下斷點
附加完成之後,會停在so模組中。此時按下Ctrl + S,彈出模組列表框,搜尋so檔案名稱。
記錄下基地址。要下斷點的函數加上ida靜態分析時的位移地址,得到記憶體中的地址,G跳轉到該函數處,F2下斷點。
7)、 F9運行8)、 斷下
使用F8進行單步調試,F7進行單步跳入調試。
2、dd命令直接dump記憶體中so的資料
1)、運行app
2)、將記憶體裡的資料拷貝出來。
adb shell
su
ps | grep com.tyomcat.crackme 擷取so的進程ID
cat /proc/(PID)/maps | grep libcrackme.so 擷取so在記憶體中的基地址
dd if=/proc/(PID)/mem of=/sdcard/1.mem bs=1 skip=(so的基地址) count=(so檔案大小)
adb pull /sdcard/1.mem
3、用kill命令殺死進程
1)、執行android_server:adb shell /data/local/tmp/android_server
2)、連接埠轉寄adb forward tcp:23946 tcp:23946
3)、運行程式
4)、ps 擷取pid
5)、命令:kill -19 <pid> 可以讓進程暫停
6)、IDA附加,動態調試。
二、反調試技術1、迴圈檢測TracePid的值,如果為0,那麼代表app進程在被trace,那麼就直接停止退出程式。
IDA是使用android_server在root環境下注入到被調試的進程中,那麼這裡用到一個技術就是Linux中的ptrace,那麼Android中如果一個進程被另外一個進程ptrace了之後,在他的status檔案中有一個欄位:TracerPid 可以標識是被哪個進程trace了,我們可以使用命令查看我們的被調試的進行資訊。
cat /proc/(PID)/status
2、執行jdb命令時報錯
無法串連到目標的VM,那麼這種問題大部分都出現在被偵錯工具不可調試,在AndroidManifest.xml添加android:debuggable屬性:
回編譯:java -jar apktool.jar b -d out -o debug.apk
簽名apk:java -jar .\sign\signapk.jar .\sign\testkey.x509.pem .\sign\testkey.pk8 debug.apk debug.sig.apk
Android 逆向初探(二)