会飞的丑小鸭 发表于 2018-4-30 05:29

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

本帖最后由 会飞的丑小鸭 于 2018-5-22 17:02 编辑

上一篇 《 教我兄弟学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函数就被找到了


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




4.乱码问题虽然解决了 但是下面的代码可读性很差 此时需要导入jni.h文件 点File->Load file->Parse C header file 找到jni.h所在位置 点打开 此时显示Compilation successful 导入成功
下载链接:https://pan.baidu.com/s/1n16NEx67zLHfGtVpU-CKAA 密码:7xg6



5.点击函数第一个参数int 右键Convert to struct* 在弹出的框中选择_JNIEnv点ok后可以看到有一些函数已经显示出来了


6.虽然现在下面已经显示出来一些函数 但是可读性还是差一点 为了让代码可读性更好 选中下面的函数 右键Force call type


7 其他的函数也都这样做 然后点住a1按住n键重命名为env 至于为什么这样做 这不是本节课的重点 以后的课程中会讲到的


8.以后的课程会有JNI的编写 所以这里就不带你分析了 由于本节课的重点是破解 点击回到汇编视图 然后按空格键转化为图形视图通过图形视图可以对apk的整个逻辑一览无余 快捷键ctrl+鼠标滑轮可以缩小方法视图



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


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



12回到汇编窗口可以看到BEN已经被改成了BEQ


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

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

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


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



会飞的丑小鸭 发表于 2018-8-14 18:59

shock-c 发表于 2018-8-14 18:06
楼主,关于arm汇编指令的16进制的值,我没查到是怎么得来的,问一下楼主,关于这些指令的十六进制该怎么算

这个有专门的工具的 或者自己在IDA里面搜索相同指令 查看对应的值

zhengyg 发表于 2018-6-15 15:17

把评论都看完了也没看到有人跟我一样问题

我把三个so的跳转都改掉了,安装成功,登录会闪退是啥情况呀,
06-15 15:14:26.368 1800-1800/? I/JNI_LOG: JNI获取到的签名是3082037f30820267a0030201020204661d0629300d06092a864886f70d01010b0500306f310b300906035504061302636e310b300906035504081302616b310b300906035504071302616b31163014060355040a130d616e64726f69646b696c6c657231163014060355040b130d616e64726f69646b696c6c6572311630140603550403130d616e64726f69646b696c6c65723020170d3134313232333036323734345a180f32303639303932353036323734345a306f310b300906035504061302636e310b300906035504081302616b310b300906035504071302616b31163014060355040a130d616e64726f69646b696c6c657231163014060355040b130d616e64726f69646b696c6c6572311630140603550403130d616e64726f69646b696c6c657230820122300d06092a864886f70d01010105000382010f003082010a02820101008496f35e201d240d56d2adbd87dfccb45282d6bc26e9d2eddf3a39595fdb06715596b435276fe29bb22be676e940dc0c79cab7f668827ba0135817b47db507bda3d309b97499fd3a507d8bbde2a2d36abf72da3221cdd8db871015241781a0d8df931968558fceba1ed87e1487b27b2047c0086700a780a6d6beb05a60e65c00103067d02f8507fcab6f735cfb2e4b7a6c0a8078dc7e674ff2619455c6db41097b09e36db48fefbf8bc1f7f85
06-15 15:14:26.368 2274-2282/? D/AudioPolicyManagerCustom: getNewOutputDevice() selected device 2
06-15 15:14:26.369 2274-2282/? D/APM_AudioPolicyManager: setOutputDevice() device 0002 delayMs 0
06-15 15:14:26.369 2274-2291/? D/audio_hw_primary: out_set_parameters: enter: usecase(1: low-latency-playback) kvpairs: routing=2
06-15 15:14:26.369 1800-1800/? A/libc: Fatal signal 4 (SIGILL), code 1, fault addr 0xee744f10 in tid 1800 (m.myapplication)
                                       
                                       [ 06-15 15:14:26.370   465:465 W/         ]
                                       debuggerd: handling request: pid=1800 uid=10113 gid=10113 tid=1800
06-15 15:14:26.371 2274-2291/? D/audio_hw_primary: select_devices for use case (low-latency-playback)
06-15 15:14:26.371 2274-2291/? D/audio_hw_extn: audio_extn_set_anc_parameters: anc_enabled:0
06-15 15:14:26.371 2274-2291/? D/audio_hw_spkr_prot: audio_extn_fbsp_set_parameters: Speaker protection disabled
06-15 15:14:26.372 2274-2282/? D/APM_AudioPolicyManager: startOutput()--
06-15 15:14:26.464 1822-1822/? A/DEBUG: *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
06-15 15:14:26.464 1822-1822/? A/DEBUG: Build fingerprint: 'OnePlus/OnePlus3/OnePlus3T:7.1.1/NMF26F/10122113:user/release-keys'
06-15 15:14:26.464 1822-1822/? A/DEBUG: Revision: '0'
06-15 15:14:26.465 1822-1822/? A/DEBUG: ABI: 'arm'
06-15 15:14:26.465 1822-1822/? A/DEBUG: pid: 1800, tid: 1800, name: m.myapplication>>> demo2.jni.com.myapplication <<<
06-15 15:14:26.465 1822-1822/? A/DEBUG: signal 4 (SIGILL), code 1 (ILL_ILLOPC), fault addr 0xee744f10
06-15 15:14:26.465 1822-1822/? A/DEBUG:   r0 00000001r1 00333766r2 00316464r3 66373300
06-15 15:14:26.465 1822-1822/? A/DEBUG:   r4 efda3230r5 ee745fb2r6 d0113000r7 df2f9d88
06-15 15:14:26.465 1822-1822/? A/DEBUG:   r8 df2f9da0r9 efd85400sl 00000000fp fff55204
06-15 15:14:26.465 1822-1822/? A/DEBUG:   ip 00000000sp fff55148lr ee744f11pc ee744f10cpsr 200f0030
06-15 15:14:26.466 1822-1822/? A/DEBUG: backtrace:
06-15 15:14:26.466 1822-1822/? A/DEBUG:   #00 pc 00000f10/data/app/demo2.jni.com.myapplication-1/lib/arm/libJniTest.so (Java_demo2_jni_com_myapplication_myJNI_check+87)
06-15 15:14:26.466 1822-1822/? A/DEBUG:   #01 pc 002c10cd/data/app/demo2.jni.com.myapplication-1/oat/arm/base.odex (offset 0x2a7000)
好像是签名那一块儿出问题了,但我看不懂,也不知道怎么解决,大神要是有空可以帮忙解释一下吗

chen4321 发表于 2018-4-30 06:57

666.大佬威武,希望多出点这种干货

szybo 发表于 2018-4-30 06:59

谢谢分享

mylin 发表于 2018-4-30 07:19

rgqqfef 发表于 2018-4-30 07:58

感谢分享

lyghost 发表于 2018-4-30 07:59

厉害了,厉害了

123-木头人 发表于 2018-4-30 09:36

好东西,谢谢分享

iyim 发表于 2018-4-30 09:57

感谢大佬教程

身体被淘空 发表于 2018-4-30 12:04

大早上的很可以

天之哀伤 发表于 2018-4-30 13:00

感谢分享教程{:1_921:}
页: [1] 2 3 4 5 6 7 8 9 10
查看完整版本: 《教我兄弟学Android逆向08 IDA爆破签名验证》