教我兄弟学Android逆向08 IDA爆破签名验证

上一篇 《 教我兄弟学Android逆向07 IDA破解第一个so》我带你下载了逆向神器IDA,并用IDA修改了我们第6课写的一个Demo 学完上节课的课程有点同学反映说用进制修改器修改so会好些 比如说010EDitor 不可否认的是进制修改器确实好用 但是上节课的目的是让你接触到IDA这个工具  关于010EDitor后面的课程会有讲到。

对于apk的签名我想你一定不陌生  apk如果被反编译 那么原有的签名将不会保留 如果你要想对反编译后的apk重新打包 那么就要对apk重新签名才能安装到手机上。
通过百度知道一个apk只有一个签名 而且这个签名是必须存在的 不然你这个apk就不能安装到手机上 。

要么学!要么不学!学和不学之间没有中间值 不学就放弃,学就要去认真的学!    --致选择
看了上面我的介绍 你有点不耐烦说大哥我要跟你学的是破解 你跟我讲什么签名 我不学了!

大兄弟你别着急,还记得李华吗?咱们儿时的小伙伴 ,有点事想请你帮忙。

下面介绍一下李华 李华是一个很有天赋 的Android程序员 他用了半年时间含辛茹苦,挑灯夜战,摧枯拉朽的编写了一款黑宝宝游戏 当然这几个词形容的并不恰当 但是李华确实为了这个apk的上线付出了很多努力  谁知游戏刚一上线就被破解了,生不生气?难不难过?
吸取了这次的教训 李华决定要反击 他通过书籍 了解到一个apk只有一个签名 于是他有了一个很大胆的想法:
如果别人要破解我的apk他一定会对我的apk进行重打包 但是重打包后的签名就不是我原来的签名了 我可以在代码中判断 如果签名不是我的签名 那么就让程序退出 这样不就达到防止别人破解的目的了,哈哈哈 太佩服我自己了。

他知道你最近在学习Android逆向 他想在游戏上线前让你测试一下他新加的签名验证是否能防住别人的破解。
下面是李华编写的黑宝宝apk
链接:https://pan.baidu.com/s/1h6pX2ARE3qtiKiYbcnJ-3g 密码:duv5

你拿到这个apk直接反编译重打包后安装到手机上,刚一运行程序就退出,你懵了,明明我什么都没改!接着看了一会反编译后的代码说:
他的签名验证是写在so里面的 但是我不会so的破解 大哥你教教我吧!

我说:好吧!

下面开始本节课的课程 请同学们认真听课。

一  打开导出表窗口(Exports)
1.用apktool解包apk后用IDA打开libJniTest.so
下面介绍两个窗口:
(1)Exports窗口是导出表(so中能让外部调用的函数)
(2)Imports窗口是导入表(so调用到外面的函数)

2.通过分析java层知道程序调用了一个native层函数check 既然知道了Exports窗口能列举出so中被外部调用的所有函数 又知道natve函数check是在java层被调用的
所以打开导出表窗口 搜索check  通过第6课知道 so中的函数都是java_包名类名_方法名格式的 所以这里check函数就被找到了
<ignore_js_op>教我兄弟学Android逆向08 IDA爆破签名验证

3.双击进去查看check方法 并按键盘f5将汇编转换成C语言 但是这里看到好多中文乱码 此时按住alt+A键打开ASCII string style窗口
然后点击set default encodings 在弹出框中选择8-bit的change 选择utf-8后点击ok回到c语言界面按f5刷新一下界面 乱码问题解决
<ignore_js_op>教我兄弟学Android逆向08 IDA爆破签名验证
<ignore_js_op>教我兄弟学Android逆向08 IDA爆破签名验证
<ignore_js_op>教我兄弟学Android逆向08 IDA爆破签名验证

4.乱码问题虽然解决了 但是下面的代码可读性很差 此时需要导入jni.h文件 点File->Load file->Parse C header file 找到jni.h所在位置 点打开 此时显示Compilation successful 导入成功
下载链接:https://pan.baidu.com/s/1n16NEx67zLHfGtVpU-CKAA 密码:7xg6
<ignore_js_op>教我兄弟学Android逆向08 IDA爆破签名验证
<ignore_js_op>教我兄弟学Android逆向08 IDA爆破签名验证

5.点击函数第一个参数int 右键Convert to struct* 在弹出的框中选择_JNIEnv点ok后可以看到有一些函数已经显示出来了
<ignore_js_op>教我兄弟学Android逆向08 IDA爆破签名验证

6.虽然现在下面已经显示出来一些函数 但是可读性还是差一点 为了让代码可读性更好 选中下面的函数 右键Force call type
<ignore_js_op>教我兄弟学Android逆向08 IDA爆破签名验证

7 其他的函数也都这样做 然后点住a1按住n键重命名为env 至于为什么这样做 这不是本节课的重点 以后的课程中会讲到的
<ignore_js_op>教我兄弟学Android逆向08 IDA爆破签名验证

8.以后的课程会有JNI的编写 所以这里就不带你分析了 由于本节课的重点是破解 点击回到汇编视图 然后按空格键转化为图形视图  通过图形视图可以对apk的整个逻辑一览无余 快捷键ctrl+鼠标滑轮可以缩小方法视图
<ignore_js_op>教我兄弟学Android逆向08 IDA爆破签名验证
<ignore_js_op>教我兄弟学Android逆向08 IDA爆破签名验证

9 通过图形视图很清晰的可以看出 如果签名正确程序通过BNE指令跳到左视图程序继续执行 否则跳到右视图退出程序
BNE: 数据跳转指令,标志寄存器中Z标志位不等于零时, 跳转到BNE后标签处
BEQ: 数据跳转指令,标志寄存器中Z标志位等于零时, 跳转到BEQ后标签处
这两条汇编指令相当于smali里面的if-eqz,if-nez是相反的
<ignore_js_op>教我兄弟学Android逆向08 IDA爆破签名验证

10.通过上面的分析 现在你知道怎么改了吧 没错就是把BNE改成BEQ 让程序在签名错误的情况下还能继续执行 鼠标选中BNE执行按住空格键 返回到汇编视图 通过上一课你知道修改so就是改16进制
通过鼠标点住BEQ 可以看到BEQ命令对应的16进制是D0 那么这里只要把BNE那行命令BNE对应的16进制改成D0是不是就可以把命令BNE换成BEQ了

11 鼠标点住BNE那行命令 View->Open subviews->Hex dump打开16进制编辑 把BNE
<ignore_js_op>教我兄弟学Android逆向08 IDA爆破签名验证
<ignore_js_op>教我兄弟学Android逆向08 IDA爆破签名验证

12回到汇编窗口可以看到BEN已经被改成了BEQ
<ignore_js_op>教我兄弟学Android逆向08 IDA爆破签名验证

13 保存so 然后重打包 用AndroidKiller给apk进行签名 安装到手机上程序正常运行 成功爆破签名验证  这里就不用我多说了吧 不会做的自己回去看上一节课

二 总结
本节课我带你认识了apk的签名验证 然后通过李华给你测试的apk又熟悉了IDA的使用 了解了IDA的导入和导出窗口接着又学习了两条汇编指令 总体来说从这节课你收货的东西还是挺多的 本节课看不懂的知识一定要自己去百度 不要有老师不讲自己就不学习了这种态度。

课堂作业
1.爆破李华Demo中的用户名和密码 要求输入任意用户名和密码 会提示登陆成功
2.看完《IDA Pro权威指南》6-12章


下一篇:《教我兄弟学Android逆向09 IDA动态破解登陆验证

上一篇:unity调用安卓方法实现安装apk文件(androidx)


下一篇:Android 11源码 修改系统App后进行编译