一次IDA动态调试安卓apk记录
- 工具清单:IDA Pro9.1 小米手机(MIUI 15.5.2)吾爱破解的教程demo(解压密码:52pj) ADB环境
- 在IDA目录下的dbgsrv,选择跟手机架构一致的server

- 在mt管理器中点开目标app的属性进行手动提权


- 也可以adb进入提权

-
重命名
android_server为as,可以防止一些反调试 -
此处运行编辑好的
.bat文件,也可以用命令行替代

- 运行成功就会显示如下画面(只需点击IDAdebug1.bat即可)

-
打开ida pro,设置
Hostname为127.0.0.1使用默认端口号为23946
-
对check函数下断点
然后

- 附加到对应进程,会出现如下所示窗口,选择same


- 然后程序会停在如图所示的地方,这时候要点开始调试(蓝色小三角),在手机输入任意字符串后点击验证


-
等待程序运行到断点
-
步进到比较函数处

- 点击
_wuaipojie0123456就可以看到比较的值,即为flag

- 在第一次调试过程遇到了反调试,在
JNI_OnLoad中

- 将对应代码patch掉后,右键保存


- 点击
Apply patches覆盖掉原本的so文件,然后将这个so文件替换原本的apk/lib/arm64-v8a中的so文件,重新安装该应用,再次运行上述操作,即可绕过反调试
补充常见寄存器知识
在进行动态调试,以下是一些常用的寄存器介绍:
| 寄存器名称 | 功能介绍 |
|---|---|
R0-R12 |
通用寄存器,用于存储临时数据。在函数调用时,R0-R3用于存储前四个参数,其余的参数通过堆栈传递。返回值也通过R0和R1传递。 |
R13 (SP) |
堆栈指针寄存器,指向当前堆栈的顶部。 |
R14 (LR) |
链接寄存器,存储子程序的返回地址。 |
R15 (PC) |
程序计数器,指向下一条要执行的指令。 |
CPSR |
当前程序状态寄存器,保存程序的状态信息,如算术运算的结果标志、中断禁止标志等。 |
FPSCR |
浮点状态和控制寄存器,如果你在调试的代码中涉及到浮点运算,那么这个寄存器会比较重要。 |
常用快捷键
| 快捷键 | 功能 |
|---|---|
F2 |
在所在行下断点 |
F5 |
可以将ARM指令转化为可读的C代码,同时可以使用Y键,对JNIEnv指针做一个类型转换,从而对JNI里经常使用的JNIEnv方法能够识别 |
F7 |
单步进入调试 |
F8 |
按照顺序一行一行,单步调试 |
F9 |
直接跳到下一个断点处 |
Shift + F12 |
快速查看so文件中的字符串信息,分析过程中通过一些关键字符串能够迅速定位到关键函数 |
Ctrl + s |
有两个用途,在IDA View页面中可以查看文件so文件的所有段信息,在调试页面可以查看程序中所有so文件映射到内存的基地址。tips:在进行so调试过程中,很有用的一个小技巧就是IDA双开,一个用于进行静态分析;一个用于动态调试。比如说调试过程中要找到一个函数的加载到内存中的位置 |
Esc |
回退键,能够倒回上一部操作的视图(只有在反汇编窗口才是这个作用,如果是在其他窗口按下esc,会关闭该窗口) |
g |
直接跳到某个地址 |
y |
更改变量的类型 |
x |
对着某个函数、变量按该快捷键,可以查看它的交叉引用 |
n |
更改变量的名称 |
p |
创建函数 |
可能遇到的问题
- 1.
jdb不是内部或外部命令,也不是可运行的程序或批处理文件。
http://t.csdn.cn/paKAt
|
|
-
3.动态调试中找不到so文件 解决方法:可以尝试手动复制一份对应的so文件放到data/app/包名/lib目录下
-
4.
device offline解决方法:重新插拔usb,再不行就重启机子 -
5.
0.0.0.0:23946: bind: Address already in use解决方案:adb shell "su -c 'lsof | grep 23946'"//获取pidadb shell "su -c 'kill -9 PID'"//这里的pid要根据上一步获取的填写 -
6.常见反调试
-
调试端口检测
检测常见的
23946端口,所以在运行时可以加-p指定一个另外的端口来过掉这个检测例如,使用
./as -p 12345命令启动调试server,将调试端口改为12345,然后在IDA Pro中相应地修改端口号为12345进行连接。 -
调试进程名检测
固定的进程名
android_server gdb_server等等,所以要改个名字,例如as64 -
ptrace检测
每个进程同时刻只能被1个调试进程ptrace ,主动ptrace本进程可以使得其他调试器无法调试
实现代码:
|
|
推荐一个安卓的显示控制软件:QtScrcpy


- 打开如下按钮后可以实现电脑的模拟点击,非常好用

参考文件: