上一篇 《教我兄弟学Android逆向08 IDA爆破签名验证》我带你熟悉了IDA工具的使用,并且用IDA爆破了so层的签名校验 我给你布置的课后作业你也用上节课的方法做出来了 看你上节课学习的不错那么这节课给你带来IDA动态调试so的教程。 你看着我激动地说 大哥,本节课我已经期待很久了,终于来了!!我要认真听课! 要么学!要么不学!学和不学之间没有中间值 不学就放弃,学就要去认真的学! --致选择 下面开始今天的教程: 首先把黑宝宝apk安装到手机上 随便输入一个用户名和密码 程序弹框“登陆失败” 于是在jeb中搜索登陆失败 发现搜索不到于是猜想字符串可能是在so中 于是开始分析: 注:黑宝宝apk可在附件下载。 一 JEB反编译APK 静态分析Java代码 关于JEB的使用教程可以看番外《教我兄弟学Android逆向番外02 jeb工具的使用》 1.jeb打开黑宝宝.apk 打开AndroidManifest.xml查看程序入口 这里 android:debuggable="true"表示此apk可以动态调试 如果是false动态调试的时候需要改成true,否则不可被动态调试。 <ignore_js_op> 2.找到MainActivity入口类 并反编译成java代码 通过静态分析java代码可知 用户在输入用户名和密码后程序会调用Native方法check来校验用户名和密码是否正确。 <ignore_js_op> <ignore_js_op> 二 IDA静态分析找位置 1.解压黑宝宝软件 找到libarmeabilibJniTest.so 并用IDA打开 找到check函数并分析此函数,不会用IDA的请从前面课程开始学起 <ignore_js_op> <ignore_js_op> 小结 经过以上分析 在输入用户名和密码后 程序会调用libJniTest.so中的check方法校验用户名和密码是否正确 如果正确check方法返回字符串登陆成功,否则返回字符串登录失败。 这里有两种思路: (1)像上节课爆破签名一样修改so的16进制 改程序的跳转逻辑 实现破解 (2)动态调试so 在程序运行的时候改变程序的跳转逻辑 三 IDA动态调试 对命令不了解的点击《教我兄弟学Android逆向番外03 Android逆向必会命令》 1. 将IDAProdbgsrv 目录下的android_server push 到手机/data/local/tmp/目录下 给777权限 并./运行。 <ignore_js_op> <ignore_js_op> <ignore_js_op> 2.端口转发命令adb forward tcp:23946 tcp:23946 <ignore_js_op> 3.手机上运行黑宝宝apk。 4.打开IDA找到黑宝宝程序的包名 进行附加程序。 <ignore_js_op> <ignore_js_op> <ignore_js_op> <ignore_js_op> <ignore_js_op> 5.在modules窗口中Ctrl+F搜索找到libJniTest.so 点进去会有so中的函数方法的列表 找到check方法并点击 查看Debug窗口的汇编代码。 <ignore_js_op> <ignore_js_op> 6 按F5将ARM汇编转换成c语言 导入jni.h文件并优化代码的可读性。 <ignore_js_op> <ignore_js_op> 7.F5转换成C语言后 再按一次F5键刷新一下代码 这里可以看到程序已经识别出来了strcmp函数。 <ignore_js_op> 8.按Esc键返回到汇编视图 分析check函数汇编 可以看到三处strcmp分别是校验签名,用户名,和密码是否正确 由于我用的是原包测试所以这里签名是正确的 这里在校验用户名和密码处的strcmp分别下一个断点。 <ignore_js_op> <ignore_js_op> 9.按F9运行程序 然后在手机正在运行的黑宝宝程序随便输入一个用户名和密码 用户名:hfdcxy 密码:52pojie 点击登录 看到程序断在了第一个strcmp处 此时R0和R1寄存器分辨是strcmp函数的两个参数 鼠标先点击Hex View-1窗口 然后再点击R0寄存器后面的跳转地址 即可在Hex窗口中看到我刚刚输入的hfdcxy和寄存器R1储存正确的用户名koudai <ignore_js_op> <ignore_js_op> <ignore_js_op> 小结 跟到这一步我们已经把黑宝宝apk用IDA给动态调试起来了 也学会了IDA怎么下断点 但是到这里本节课就要结束了吗? 当然不是 由于我们的目的是动态调试破解程序 也就是输入错误的用户名会提示登陆成功 所以教程还在继续 还请同学们认真听课。 四.置标志位破解 1. 置标志位 改变程序执行逻辑。 <ignore_js_op> 2.重复上述步骤 F9继续运行,程序断在第二个strcmp处 这个strcmp是用来比较密码是否正确的 同样F8执行本条指令 把R0寄存器置为0 强制让strcmp返回0 然后F9运行程序 可以看到手机弹出登陆成功。 五.修改内存16进制破解 1.在Hex窗口中看R1寄存器地址存的正确用户名koudai对应的16进制为6B 6F 75 64 61 69 <ignore_js_op> 2.把R0寄存器地址内容修改成R1寄存器地址的内容 修改完之后F9运行程序 看到程序跳转到了下面一个strcmp <ignore_js_op> <ignore_js_op> 3.同样把下面密码校验的strcmp函数R0寄存器地址所存值的16进制 改成R1寄存器地址所存值的16进制 修改完成后F9运行程序 可以看到手机弹出登陆成功。 六.总结 本节课使用Jeb+IDA两个工具的组合带你分析了黑宝宝apk 然后使用命令和IDA进行配合完成了对黑宝宝进程的附加 实现了用IDA动态调试so 最后用两种方法完成了对黑宝宝登陆程序的破解。相信学完本节课你的收获一定很多,那么趁热打铁把课后作业做了吧。 课后作业 1.完成对重打包后的黑宝宝apk登陆程序的破解 2. 看完《IDA Pro权威指南》剩下的内容 下一篇:《教我兄弟学Android逆向10 静态分析反调试apk》 |
<ignore_js_op>