Android逆向學習(十一) IDA動態調試Android so文件
一、 寫在前面
這是吾愛破解論壇正己大大的第12個教程,并且發現一個神奇的事情,正己大大的教程竟然沒有第11個,感覺很奇怪
寫這個博客的主要原因是希望提供一種新的解法,并且記錄自己android逆向學習的過程,所以本博客會有很多實際操作的方法,喜歡的話可以點個免費的贊
我的操作系統還是用的linux,windows也可以,流程也基本是一樣的
二、課程目標
了解so加載流程,IDA開啟動態調試,SO的防護手段。
三、課程內容
1. android中so文件的加載
直接看源代碼:https://android.googlesource.com/platform/libcore/+/15d8280/luni/src/main/java/java/lang/System.java
可以簡單了解調用so文件的流程:
Java 層 → System.loadLibrary → Runtime → VM ClassLoader → linker(android_dlopen_ext) → mmap so → 解析 ELF → JNI_OnLoad → so 注冊方法 → Java 可以調用
其實就是通過JNI_OnLoad的方法把so文件給加載進來。
2. IDA對android的so文件動態調試
首先在IDA pro的安裝路徑下面找到android_server,選擇對應的架構
然后使用命令將android_server上傳到/data/local/tmp路徑下,賦權并以root用戶運行,這個類似于之前使用frida調試。
adb push android_server /data/local/tmp
上傳之后先使用adb shell 啟動android中的shell,然后按照下面流程走,就可以啟動android_server
apollo:/ $ su
apollo:/ # cd /data/local/tmp
apollo:/data/local/tmp # ls
android_server frida-server-16.7.14-android-arm64
apollo:/data/local/tmp # chmod 755 android_server
apollo:/data/local/tmp # ./android_server
IDA Android 64-bit remote debug server(ST) v9.0.30. Hex-Rays (c) 2004-2024
2025-07-23 21:59:09 Listening on 0.0.0.0:23946...
和上個博客一樣,打開ida pro,并分析對應的so文件
之后轉發手機的23946端口
方法就是打開一個新的命令行窗口,并且輸入
adb forward tcp:11111 tcp:23946
調整IDA pro的debug設置
首先是Debugger -> Switch Debugger選擇遠程android
然后是Debugger -> Debugger options
還有Debugger -> Process options
之后正常安裝應用,并打開運行應用,并且打開加載的so部分的activity,也就是第七關,并且要觸發so文件加載,也就是先隨便一個驗證一下,這樣so文件加載之后,打開之后點擊Debugger -> Attach to Process
然后ctrl+F搜索對應的線程
選擇對應線程就會出現這個窗口,出現這個窗口說明我們加載成功了
然后點same后,從右邊的modules中選擇對應的so文件
并找到對應的check函數
雙擊之后就可以打斷點調試了
然后點擊Debugger ->Continue process,就可以進行調試了,F9 運行,F8 單步步過
點擊手機上的驗證,可以看到線程被卡到標點處了,需要注意的是如圖中,w22代表寄存器的低 32 位,也就是右邊x22的后幾位,可以看到MOV W22, #1后,右邊寄存器也發生了變化
這個有個小失誤,就是在上一個博客中,已經對代碼進行了修改,使其一直返回true,也就是這段代碼,然后忘記改回來了
MOV W22, #1
所以這次為了驗證動態調試修改有效,所以這次就動態修改為返回false,對寄存器進行修改,修改成全0,然后F9繼續
就會發現原來一直成功的變成失敗了,說明之前的修改起效了
3. SO的防護手段
這一段就是代碼混淆技術,這個代碼混淆技術就是比較概念性的東西,這里就不進行描述了,因為寫這個教程主要是為了記錄實際操作的過程。