標籤:android c style a tar http
一般來說,很多APK的校正代碼,都會在程式啟動並執行時候自動載入一些動態so庫,然後執行這些庫中的校正代碼。所以為了能夠通過程式的校正,我們必須在執行這些函數之前下斷點——理想的方法就是在JNI_OnLoad入口函數下斷點。
在2.3.3模擬器中詳細步驟如下:
①在控制台輸入adb shell 進入手機,然後使用 am start -D -n 包名/類名,以等待調試的模式啟動APK應用;
這裡需要說明的是 “包名/類名”的書寫方法:
# am start -n {包(package)名}/{包名}.{活動(activity)名稱}
程式的入口類可以從每個應用的AndroidManifest.xml的檔案中得到,以計算機(calculator)為例,它的
<manifest xmlns:android="http://schemas.android.com/apk/res/android" …
package="com.android.calculator2" …>…
由此計算機(calculator)的啟動方法為:# am start -n com.android.calculator2/com.android.calculator2.Calculator
對於HelloActivity這個樣本工程,AndroidManifest.xml如下所示:
<manifest …
package="com.example.android.helloactivity" …>
由此它的啟動方法為:
# am start -n com.example.android.helloactivity/com.example.android.helloactivity.HelloActivity
②使用adb將IDA(我的是6.1)中的android_server 傳入手機的/data/local/tmp目錄中:
adb push android_server /data/local/tmp
# 再賦予許可權
adb shell
cd /data/local/tmp
chmod 777 android_server
#運行android_server
./android_server
③另起一個cmd視窗,使用命令 adb forward tcp:23946 tcp:23946 進行視窗轉寄
④啟動IDA主程式,點擊菜單 Debugger->Attach->Remote ArmLinux/Android debugger ,開啟偵錯工具對話方塊,在hostname一欄輸入localhost,
點擊ok,然後在IDA彈出的視窗中,選擇自己要附加的進程後點擊OK 即可。
⑤點擊菜單Debugger->Debugger Opitions 在彈出的Debugger setup視窗的Events中選擇 stop on thread start/exit 以及 stop on library load/unload,再點擊OK退出。通過此操作可以設定程式在建立新線程和載入so時自動中斷。
⑥通過DDMS擷取相應進程的連接埠號碼,然後使用jdb -connect com.sun.jdi.SocketAttach:hostname=127.0.0.1,port=8700(DDMS查詢到的連接埠號碼,一般都是8700);
⑦串連成功後,按F9後手機上的“waiting for debugger"提示會自動消失,這個時候應該已經斷在新線程,或者載入so處了。
⑧現在就可以在IDA中按下快速鍵CTRL + S來查看要調試的so是否已經載入了,如果沒有就F9,直到載入了為止;如果已經有了,就記下該so的start位置,然後另開一個ida分析.so庫,找到JNI_ONLOAD的位移地址,那麼該JNI_OnLoad函數在進程中的真真實位址就是so.start + JNI_OnLoad_Offset。
這裡需要說明的是:有可能在快速鍵CTRL + S跳出的視窗中有兩個同名的so,我們應當選擇許可權為RX的這個,RX一般是程式碼片段,RW一般是資料區段。
得到真真實位址後,在IDA中按下快速鍵G跳轉到這個地址,然後按下快速鍵F2就完成在JNI_OnLoad函數入口處下斷點了。