8.动态调试笔记--调试so

以阿里移动安全挑战赛2015年第二题为调试样本
样本是有点久远,但是足够一窥动态调试so的门道。

先上参考连接,有一些概念性的东西这两篇写的很详细,比如下断时机,为什么在那里下断,反调思路是什么。
原创]-------------IDA调试 android so文件的10个技巧
https://bbs.pediy.com/thread-221876.htm

1.android逆向之旅-动态方式破解apk进阶篇ida调试so源码

2.阿里移动安全挑战赛第二题writeup

0.准备工作
首先必须有一台root过的手机,且把ida的android_server文件放到手机/data目录下,修改其执行权限。
这里可能会遇到android_server和ida 目标api不符的提示,所以建议是用android 4.4的手机,且Android_server文件是从你使用的ida文件里拿出来的。

1.下断
姑且认为你已经阅读了上述两篇文章,知道该demo是有反调试的,所以我们需要先静态分析so,在so里下断。
1-1在jni_onLoad下断


ida的左边方法区ctrl+f搜索jni_load

1-2在native方法下断


很好找,java_开头

1-3设置ida的debug options
勾选on library load

2.执行Android_server,供ida 附加一个调试进程
依次执行adb shell ,su,cd data,./android_server
打开ida调试监听

image.png

执行
adb forward tcp:23946 tcp:23946
端口转发

3.打开ida 进行动态调试
3-1执行adb shell am start -D -n com.yaotong.crackme/.MainActivity
唤起样本,使其等待一个调试器
3-2 ida-debugger-attach to process,找到我们的demo 包名

17233就是pid

3-3 执行adb forward tcp:8700 jdwp:17233
端口打通(ddms去做也行,目的都是一样的)

3-4 点ok之后就进入动态调试

此时会卡在libc.so

3-5 执行jdb -connect com.sun.jdi.SocketAttach:hostname=127.0.0.1,port=8700恢复运行状态

正常会显示已经捕获

其余报错,software refused connected,先更改app的清单debuggable值为true,重打包签名再重来一遍步骤。
connection refused ,就操作一遍3-3.

3-6 在ida按f9


点same

然后进入到linker

3-7再按f9运行,会进入我们jni_onLoad断点

4分析代码
f8单步运行

4-1 nop反调试代码


我这里是已经修改过的so

如果想去看方法,f7进入方法,想看源码的,在BLX R7那里按f5,ida会反编译源码

根据地址找到so对应的值,在静态调试so,G快捷键 。
修改为0.保存修改,重新打包一份apk,重签名,从头跑一遍。反调试代码就被干掉了。

4-2 找native方法
反调试之后,输入密码,继续f9运行,会断在我们的native方法里


image.png

根据大家的经验总结,去寻找CMP指令,查看寄存器的值,总会有一个地方值做判断,然后返回结果。
那么做判断的地方,就是正确密码的出现地。
双击可查看寄存器的值


查看到我的输入值

至此,动态调试so结束

你可能感兴趣的:(8.动态调试笔记--调试so)