020 Android之so文件动态调试
文章目錄
- ELF文件格式查看工具
- so文件加載時的函數執行順序
- so文件動態調試
- so文件調試技巧
- 使用ida動態調試的那些坑
- 進程顯示不全
- illegal segment bitness
- more than one special register present
- adb安裝強制應用App以32位運行
ELF文件格式查看工具
和PE文件類似,比PE文件簡單,我們可以用NDK中提供的一個工具readelf去查看ELF文件主要表信息
目錄:
D:\Android\sdk\ndk-bundle\toolchains\x86-4.9\prebuilt\windows-x86_64\bin[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-1s7iWskx-1633180160882)(020 Android之so文件動態調試.assets/1632204382649.png)]
常見命令:
-h 查看頭文件 -S 查看Section header Table -l 查看程序頭表Program Header Table -s 查看符號表 -d 查看動態加載信息查看頭信息
查看區段信息
so文件加載時的函數執行順序
想要調試so文件,首先需要弄清楚so文件加載時的函數執行順序,先看下面的代碼
extern "C" void _init(void){__android_log_print(ANDROID_LOG_DEBUG,"init","_init"); }void __attribute__((constructor)) init1(void){__android_log_print(ANDROID_LOG_DEBUG,"init","init1"); }void __attribute__((constructor)) init2(void){__android_log_print(ANDROID_LOG_DEBUG,"init","init2"); }void __attribute__((constructor)) init3(void){__android_log_print(ANDROID_LOG_DEBUG,"init","init3"); }extern "C" JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM* vm,void *reseverd){__android_log_print(ANDROID_LOG_DEBUG,"init","JNI_Onload");JNIEnv* env;jint ret=vm->GetEnv((void **)&env,JNI_VERSION_1_6);if (ret!=JNI_OK){return 0;}return JNI_VERSION_1_6; }接著執行代碼
so文件第一個執行的函數是**_init函數,接著執行的是init數組中的函數,分別是init1,init2和init3,這個數組中的函數可以自定義,只需要符合對應的格式即可,最后再執行JNI_OnLoad**
**so文件分析流程:**當我們分析so文件時,首先需要分析_init函數,接著分析init_array數組,最后分析JNI_OnLoad函數
接著我們用readelf工具查看動態加載信息,可以看到init和init_array的地址
接著用IDA跳轉到init_arrray的地址,可以找到三個init函數。
so文件動態調試
將IDA目錄下的android_server上傳到android機器中(注意android_server需要和目標系統架構和位數一致)
adb push .\android_server /data/local/tmp/ands修改文件權限
接著測試運行
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-CzT5wPlV-1633180160896)(020 Android之so文件動態調試.assets/1632212563278.png)]
這里提示當前正在監聽23946端口,這個是IDA服務默認監聽的端口
用-p參數可以指定端口
以調試方式啟動進程后
在monitor可以看到一個紅色的小蟲
端口號要和啟動service時監聽的端口一致
最后啟動ida附加調試端口
輸入hostname和port
選擇需要調試的進程
接著就可以愉快的開始debug了
如果需要讓java層代碼跑起來則需要執行下面一條命令:
jdb -connect com.sun.jdi.SocketAttach:hostname=localhost,port=8700so文件調試技巧
在Debugger Option中將模塊加載和線程加載時斷下的復選框勾上
打開模塊窗口,找到需要調試的so文件,雙擊進入
這里可以看到模塊的導出函數
接著找到需要調試的函數,比如_init
F2進行下斷即可。
使用ida動態調試的那些坑
so文件動態調試,看起來簡單,實際操作過程中總會遇到各種問題,這里記錄一下遇到的各種坑和解決方案
進程顯示不全
當我用真機接入adb進行so文件調試時,發現在IDA中的進程顯示不全。
解決方案:這個是因為沒有用管理員權限啟動idaserver,如果在命令行中使用su沒反應,需要使用Magisk對手機進行root獲取管理員權限后,再用管理員權限啟動idaserver,問題即可解決
illegal segment bitness
64位的系統 默認安裝app是64的,出現這個錯誤是因為android_server與需要調試的app位數不一樣,例如64位的手機使用32位的android_server。
我調試的手機是64位的,使用的是android_server進行調試。后來換成了android_server64就解決了。
more than one special register present
接著我又遇到了第三個問題
這個問題出現的原因是由于IDA版本不匹配導致的,我使用的是64位的手機,需要啟動64位的idaserver,然后用ida x64。如果使用x86版本的ida就會出現上面的問題
adb安裝強制應用App以32位運行
之前的流程終于跑通了,但是運行的是64位的程序,需要看64位的arm匯編,對新手來說太不友好了。想要調試32位的匯編需要強制應用以32位運行,并且使用32位的idaserver,然后使用32位的ida進行附加。
直接上命令格式
adb install --abi armeabi-v7a <path to apk>調用這條命令應用以32位在64位終端環境下運行。然后就可以愉快的調試32位arm匯編了。
流程終于跑通了,但是運行的是64位的程序,需要看64位的arm匯編,對新手來說太不友好了。想要調試32位的匯編需要強制應用以32位運行,并且使用32位的idaserver,然后使用32位的ida進行附加。
總結
以上是生活随笔為你收集整理的020 Android之so文件动态调试的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 018 Android加固之实现dex加
- 下一篇: Android之Xposed框架完全使用