在安卓脫殼過程中,經常需要用ida動態調試so,並且在解密代碼執行前下斷點,下面介紹用IDA在Android so文件的.init
、.init_array
上和JNI_OnLoad
處下斷點方法。我們以自己編寫的一個小程序initTest.apk
爲例,該apk實現了在.init
、.init_array
上和JNI_OnLoad
中的方法中打印日誌功能.
下載地址:http://download.csdn.net/detail/u012417380/9919842
一、上傳android_server
,啓動android_server
上傳android_server
到手機/data/local/tmp
目錄
adb push android_server /data/local/tmp
賦予 android_server
執行權限
$ chmod 777 android_server
以root身份執行android_server
文件,android_server
文件默認監聽23946
端口,可以通過-p端口
參數進行設置端口,注意p
和端口之間無空格
$ ./android_server -p23946
二、打開DDMS程序
打開DDMS程序,DDMS程序會將應用的調試端口映射到電腦上,使用jdb命令能夠對被掛起的程序恢復執行。
三、進行端口轉發
使用adb命令進行端口轉發
$ adb forward tcp:23946(PC_port) tcp:23946(Phone_port)
四、以調試模式啓動app
我們以debug模式啓動程序。程序會出現waiting for debugger的調試界面
$ adb shell am start -D -n com.example.inittest/.MainActivity
Starting: Intent { cmp=com.example.inittest/.MainActivity }
程序會出現waiting for debugger
的調試界面
這時DDMS顯示,調試端口在8700
五、用IDA 附加到啓動ida並attach這個app的進程。
六、當so加載的時候掛起
我們在debugger setup裏勾選 suspend on library load。然後點擊繼續(按F9鍵繼續)。
七、使用jdb命令恢復程序執行
使用jdb命令恢復程序執行
$ jdb -connect com.sun.jdi.SocketAttach:hostname=127.0.0.1,port=8700
設置未捕獲的java.lang.Throwable
設置延遲的未捕獲的java.lang.Throwable
正在初始化jdb...
>
這時DDMS中該應用的顏色變爲了綠色:
程序加載so,由於之前的設置,程序停在了liner
處
八 確定模塊的加載地址,在linker
和libvm.so
中下斷點
在android4.4.4_r1
源碼中,linker
中 .init
和.init_array
的斷點位置爲0000274C
,JNI_OnLoad
的斷點位置爲00050004
我們先查看內存中segment
中linker
加載的位置
按Ctrl
+S
組合鍵打開內存中的segmets
,知道linker
的內存加載地址4008B000
,那麼斷點的位置是4008B000
+0000274C
=4008D74C
。
按G
鍵輸入地址4008D74C
進行跳轉,將光標移至該處後按P
鍵進行反彙編,看到了彙編代碼,在該處4008D74C
下斷點
同理按Ctrl
+S
組合鍵打開內存中的segmets
,知道libdvm.so
的內存加載地址41503000
,那麼斷點的位置是41503000
+00050004
=41553004
。
按G
鍵輸入地址41553004
進行跳轉,將光標移至該處後按P
鍵進行反彙編,看到了彙編代碼,在該處41553004
下斷點
九、繼續執行
按F9
鍵繼續執行,發現在第一處斷點停了下來
按F7
鍵步入函數執行,發現其首先進入了_init
函數中,調用了自定義的打印日誌函數輸入函數名
接着按F8
跨過執行,直到函數返回
接着按F9
鍵繼續執行到下一斷點,發現第二次在該斷電處停了下來
按F7
鍵步入函數執行,發現其先進入了.init_array
段的myConstructor1
函數中,調用了自定義的打印日誌函數輸入函數名
接着按F8
跨過執行,直到函數返回
接着按F9
鍵繼續執行到下一斷點,發現第三次在該斷電處停了下來
按F7
鍵步入函數執行,發現其先進入了.init_array
段的myConstructor2
函數中,調用了自定義的打印日誌函數輸入函數名
接着按F8
跨過執行,直到函數返回
接着按F9
鍵繼續執行到下一斷點,發現在libdvm處斷點停了下來
按F7
鍵步入函數執行,發現其先進入了JNI_OnLoad
函數中,調用了自定義的打印日誌函數輸入函數名