教我兄弟学Android逆向09 IDA动态破解登陆验证

上一篇 教我兄弟学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>
学习时的痛苦是暂时的 未学到的痛苦是终生的
原文地址:https://www.cnblogs.com/grimm/p/15063599.html