以阿里移动安全挑战赛2015年第二题为调试样本
样本是有点久远,但是足够一窥动态调试so的门道。
先上参考连接,有一些概念性的东西这两篇写的很详细,比如下断时机,为什么在那里下断,反调思路是什么。
原创]-------------IDA调试 android so文件的10个技巧
https://bbs.pediy.com/thread-221876.htm
1.android逆向之旅-动态方式破解apk进阶篇ida调试so源码
0.准备工作
首先必须有一台root过的手机,且把ida的android_server文件放到手机/data目录下,修改其执行权限。
这里可能会遇到android_server和ida 目标api不符的提示,所以建议是用android 4.4的手机,且Android_server文件是从你使用的ida文件里拿出来的。
1.下断
姑且认为你已经阅读了上述两篇文章,知道该demo是有反调试的,所以我们需要先静态分析so,在so里下断。
1-1在jni_onLoad下断
1-2在native方法下断
1-3设置ida的debug options
2.执行Android_server,供ida 附加一个调试进程
依次执行adb shell ,su,cd data,./android_server
打开ida调试监听
执行
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 包名
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
然后进入到linker
3-7再按f9运行,会进入我们jni_onLoad断点
4分析代码
f8单步运行
4-1 nop反调试代码
如果想去看方法,f7进入方法,想看源码的,在BLX R7那里按f5,ida会反编译源码
根据地址找到so对应的值,在静态调试so,G快捷键 。
修改为0.保存修改,重新打包一份apk,重签名,从头跑一遍。反调试代码就被干掉了。
4-2 找native方法
反调试之后,输入密码,继续f9运行,会断在我们的native方法里
根据大家的经验总结,去寻找CMP指令,查看寄存器的值,总会有一个地方值做判断,然后返回结果。
那么做判断的地方,就是正确密码的出现地。
双击可查看寄存器的值
至此,动态调试so结束