一、 写在前面
这是吾爱破解论坛正己大大的第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,选择对应的架构

image-20250723215134850.png (60.19 KB, 下载次数: 2)
下载附件
2025-9-11 20:29 上传
然后使用命令将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文件

image-20250724201622772.png (274.17 KB, 下载次数: 3)
下载附件
2025-9-11 20:29 上传
之后转发手机的23946端口
方法就是打开一个新的命令行窗口,并且输入
adb forward tcp:11111 tcp:23946
调整IDA pro的debug设置
首先是Debugger -> Switch Debugger选择远程android

6aecec6a0e0bcaaa0c2dc3a4bbf10011.png (48.04 KB, 下载次数: 2)
下载附件
2025-9-11 20:28 上传
然后是Debugger -> Debugger options

1c1bf78f1a238a835066c2099fc57c5e.png (86.04 KB, 下载次数: 3)
下载附件
2025-9-11 20:28 上传
还有Debugger -> Process options

448e36e22fc6b9a7c8dd6e028bb34b5b.png (96.78 KB, 下载次数: 3)
下载附件
2025-9-11 20:28 上传
之后正常安装应用,并打开运行应用,并且打开加载的so部分的activity,也就是第七关,并且要触发so文件加载,也就是先随便一个验证一下,这样so文件加载之后,打开之后点击Debugger -> Attach to Process
然后ctrl+F搜索对应的线程

797dae8404b90b9f159fd223b51c00cb.png (30.7 KB, 下载次数: 3)
下载附件
2025-9-11 20:28 上传
选择对应线程就会出现这个窗口,出现这个窗口说明我们加载成功了

c26dc6fef9bc2efcfecefa27cf11b64b.png (221.3 KB, 下载次数: 3)
下载附件
2025-9-11 20:28 上传
然后点same后,从右边的modules中选择对应的so文件

54ebc6143137b627a9b53ddbb206e6f0.png (81.62 KB, 下载次数: 3)
下载附件
2025-9-11 20:28 上传
并找到对应的check函数

c47d02689a06e152037360c822d89bc8.png (88.61 KB, 下载次数: 2)
下载附件
2025-9-11 20:28 上传
双击之后就可以打断点调试了

1fdaf81b1d188fbd4f7525624a60934b.png (191.06 KB, 下载次数: 3)
下载附件
2025-9-11 20:28 上传
然后点击Debugger ->Continue process,就可以进行调试了,F9 运行,F8 单步步过
点击手机上的验证,可以看到线程被卡到标点处了,需要注意的是如图中,w22代表寄存器的低 32 位,也就是右边x22的后几位,可以看到MOV W22, #1后,右边寄存器也发生了变化

3a82066f8c20f1abeeec6805fbdc4df6.png (234.26 KB, 下载次数: 2)
下载附件
2025-9-11 20:28 上传
这个有个小失误,就是在上一个博客中,已经对代码进行了修改,使其一直返回true,也就是这段代码,然后忘记改回来了
MOV W22, #1
所以这次为了验证动态调试修改有效,所以这次就动态修改为返回false,对寄存器进行修改,修改成全0,然后F9继续

cfef5357d40a04b4ae5894c7b82f83bd.png (197.44 KB, 下载次数: 3)
下载附件
2025-9-11 20:29 上传
就会发现原来一直成功的变成失败了,说明之前的修改起效了

db8a690b75fd9b03eaece6feb3c677d4_720.jpg (91.98 KB, 下载次数: 2)
下载附件
2025-9-11 20:29 上传
3. SO的防护手段
这一段就是代码混淆技术,这个代码混淆技术就是比较概念性的东西,这里就不进行描述了,因为写这个教程主要是为了记录实际操作的过程。