Android逆向学习(十一) IDA动态调试Android so文件

发布于:2025-09-12 ⋅ 阅读:(19) ⋅ 点赞:(0)

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的防护手段

这一段就是代码混淆技术,这个代码混淆技术就是比较概念性的东西,这里就不进行描述了,因为写这个教程主要是为了记录实际操作的过程。


网站公告

今日签到

点亮在社区的每一天
去签到