《教我兄弟学Android逆向09 IDA动态调试so》

时间:2023-01-24 02:48:33
上一篇     教我兄弟学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,否则不可被动态调试

《教我兄弟学Android逆向09 IDA动态调试so》

2.找到MainActivity入口类 并反编译成java代码 通过静态分析java代码可知 用户在输入用户名和密码后程序会调用Native方法check来校验用户名和密码是否正确

《教我兄弟学Android逆向09 IDA动态调试so》

《教我兄弟学Android逆向09 IDA动态调试so》

二 IDA静态分析找位置
1.解压黑宝宝软件 找到lib\armeabi\libJniTest.so 并用IDA打开 找到check函数并分析此函数(不会用IDA的请从前面课程开始学起) 

《教我兄弟学Android逆向09 IDA动态调试so》

《教我兄弟学Android逆向09 IDA动态调试so》

小结
经过以上分析 在输入用户名和密码后 程序会调用libJniTest.so中的check方法校验用户名和密码是否正确 如果正确check方法返回字符串登陆成功,否则返回字符串登录失败。
这里有两种破解方式 
1.像上节课爆破签名一样修改so的16进制 改程序的跳转逻辑 实现破解
2.动态调试so 在程序运行的时候改变程序的跳转逻辑


三 IDA动态调试
对命令不了解的点击《教我兄弟学Android逆向番外03 Android逆向必会命令》  
1 将IDAPro\dbgsrv 目录下的android_server push 到手机/data/local/tmp/目录下 给777权限 并./运行

《教我兄弟学Android逆向09 IDA动态调试so》

《教我兄弟学Android逆向09 IDA动态调试so》

《教我兄弟学Android逆向09 IDA动态调试so》

2.端口转发 adb forward tcp:23946 tcp:23946

《教我兄弟学Android逆向09 IDA动态调试so》

3.手机上运行黑宝宝apk

4.打开IDA找到黑宝宝程序的包名 进行附加程序

《教我兄弟学Android逆向09 IDA动态调试so》

《教我兄弟学Android逆向09 IDA动态调试so》

《教我兄弟学Android逆向09 IDA动态调试so》

《教我兄弟学Android逆向09 IDA动态调试so》

《教我兄弟学Android逆向09 IDA动态调试so》

5.在modules窗口中Ctrl+F搜索找到libJniTest.so 点进去会有so中的函数方法的列表 找到check方法并点击 查看Debug窗口的汇编代码

《教我兄弟学Android逆向09 IDA动态调试so》

《教我兄弟学Android逆向09 IDA动态调试so》

6 按F5将ARM汇编转换成c语言 导入jni.h文件并优化代码的可读性

《教我兄弟学Android逆向09 IDA动态调试so》

《教我兄弟学Android逆向09 IDA动态调试so》

7.F5转换成C语言后 再按一次F5键刷新一下代码 这里可以看到程序已经识别出来了strcmp函数

《教我兄弟学Android逆向09 IDA动态调试so》

8.按Esc键返回到汇编视图 分析check函数汇编 可以看到三处strcmp分别是校验签名,用户名,和密码是否正确 由于我用的是原包测试所以这里签名是正确的 这里在校验用户名和密码处的strcmp分别下一个断点

《教我兄弟学Android逆向09 IDA动态调试so》

《教我兄弟学Android逆向09 IDA动态调试so》

9.按F9运行程序 然后在手机正在运行的黑宝宝程序随便输入一个用户名和密码  用户名:hfdcxy 密码:52pojie 点击登录 看到程序断在了第一个strcmp处 此时R0和R1寄存器分辨是strcmp函数的两个参数 鼠标先点击Hex View-1窗口 然后再点击R0寄存器后面的跳转地址 即可在Hex窗口中看到我刚刚输入的hfdcxy
和寄存器R1储存正确的用户名koudai 

《教我兄弟学Android逆向09 IDA动态调试so》

《教我兄弟学Android逆向09 IDA动态调试so》

《教我兄弟学Android逆向09 IDA动态调试so》

小结
跟到这一步我们已经把黑宝宝apk用IDA给动态调试起来了 也学会了IDA怎么下断点 但是到这里本节课就要结束了吗? 当然不是 由于我们的目的是动态调试破解程序 也就是输入错误的用户名会提示登陆成功 所以教程还在继续 请同学们认真听课

四 置标志位破解
1. 置标志位 改变程序执行逻辑

《教我兄弟学Android逆向09 IDA动态调试so》


2.重复上述步骤 F9继续运行,程序断在第二个strcmp处 这个strcmp是用来比较密码是否正确的 同样F8执行本条指令 把R0寄存器置为0 强制让strcmp返回0 然后F9运行程序 可以看到手机弹出登陆成功 

五.修改内存16进制破解
1.在Hex窗口中看R1寄存器地址存的正确用户名koudai对应的16进制为6B 6F 75 64 61 69 00

《教我兄弟学Android逆向09 IDA动态调试so》


2.把R0寄存器地址内容修改成R1寄存器地址的内容 修改完之后F9运行程序 看到程序跳转到了下面一个strcmp

《教我兄弟学Android逆向09 IDA动态调试so》

《教我兄弟学Android逆向09 IDA动态调试so》



3.同样把下面密码校验的strcmp函数R0寄存器地址所存值的16进制 改成R1寄存器地址所存值的16进制 修改完成后F9运行程序 可以看到手机弹出登陆成功 

六.总结
本节课使用Jeb+IDA两个工具的组合带你分析了黑宝宝apk 然后使用命令和IDA进行配合完成了对黑宝宝进程的附加 实现了用IDA动态调试so 最后用两种方法完成了对黑宝宝登陆程序的破解。相信学完本节课你的收获一定很多,那么趁热打铁把课后作业也做了吧。

课后作业
1.完成对重打包后的黑宝宝apk登陆程序的破解
2. 看完 《IDA Pro权威指南》剩下的内容