日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

020 Android之so文件动态调试

發布時間:2025/3/21 Android 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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調試服務端
  • 將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參數可以指定端口

  • 以調試方式啟動apk
  • adb shell am start -D -n 包名/入口類名

    以調試方式啟動進程后

    在monitor可以看到一個紅色的小蟲

  • 設置端口轉發
  • adb forward tcp:23456 tcp:23456

    端口號要和啟動service時監聽的端口一致

  • 啟動ida附加,如果是arm架構選擇ARMLinux/Android debugger,如果是夜神模擬器,選擇linux debugger
  • 最后啟動ida附加調試端口

    輸入hostname和port

    選擇需要調試的進程

    接著就可以愉快的開始debug了

    如果需要讓java層代碼跑起來則需要執行下面一條命令:

    jdb -connect com.sun.jdi.SocketAttach:hostname=localhost,port=8700

    so文件調試技巧

    在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文件动态调试的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。