上一篇 《教我兄弟学Android逆向10 静态分析反调试apk》我带你用jeb+IDA静态分析了反调试apk,并且了解了init_array和jnionload的执行顺序 通过静态patch的方法 我们过掉了反调试验证,但光是静态patch似乎还不过于完美 有时候还需要配合动态调试来达到破解的目的 基于上节课你表现良好 那么这节课我将为你带来动态调试init_array的教程 注意认真听课不要眨眼睛呀!
要么学!要么不学!学和不学之间没有中间值 不学就放弃,学就要去认真的学! --致选择
环境:IDA7.0 手机:nexus
本节课的内容和上节课相关联 班级新来的同学请从上节课开始学起
开始本节课之前你需要先去了解IDA动态调试的相关方法和技巧
https://blog.csdn.net/feibabeibei_beibei/article/details/52740212
现在课程开始 请同学们回想一下上节课我给出的两种过反调试的方法
1.改android端口号,android_serve的名称和修改内核的方式绕过tracepid的检测
2.通过修改thread_function函数, SearchObjProcess函数和checkport函数的ARM指令来达到静态patch的目的
这节课我将给你带来第三种过反调试的方法 也就是动态调试其实方法和第二种雷同 只不过是把静态patch换成了动态
一 关键函数下断点
1.找到init_array段里面的函数thread_function 并在其第一条ARM指令上面按F2下断点
2.在JNI_OnLoad函数调用SearchObjProcess处下断点 (c代码窗口和汇编指令窗口快速转换按Tab键)
3.动态注册的函数sub_1174第一条指令下断点
二 动态调试
1.打开Android Device Monitor
2.运行android_server
/data/local/tmp/android_server
3.端口转发
adb forward tcp:23946 tcp:23946
4.因为我们要调试init_array所以需要在程序刚启动的时候进行调试 如果你对这条指令不熟悉 复习下第四课吧 《教我兄弟学Android逆向04 动态调试smali代码 》
启动程序am start -D -n demo2.jni.com.myapplication/.MainActivity
5.附加进程
6.附加完成后 如果IDA弹框直接点Yes Debugger option设置一下 因为我们里面会调试到线程所以线程打一个钩
7.上一步完成后F9运行程序 在IDA等待的时候运行命令
jdb -connect com.sun.jdi.SocketAttach:port=8700,hostname=localhost
8.点击完same后程序会断在一个点 不要理会 直接F9(如果弹出框都点Yes) 直到程序断在了我们的断点处 并将函数第二条ARM指令改成POP让函数不执行直接出栈 或者把下面调用exit对应的HEX改成00 00 00 00都是可以的
9.IDA继续F9让程序运行起来 直到程序断在我们下的第二个断点处 ARM指令BL是调用函数的意思 所以将其指令对应的HEX改成00 00 00 00 无意义的指令 直接patch掉达到让其不调用的目的 注:ARM指令不是本节课的重点,关于ARM指令的教程以后的课程会有讲到.
10.IDA继续F9 这时会来到我们下的第三处断点,注意这里是动态注册的函数 对于动态注册的函数我们就不能通过把第二条ARM指令改成POP直接出栈 否则程序会崩溃 那这里怎么改呢?这里可以直接把调用exit退出对应的HEX改成00 00 00 00来过掉
11.到此这三处反调试就都过掉了 现在F9运行遇见 弹框都点确定 然后程序弹框 恭喜你挑战成功!
三 总结
本节课我带你用IDA动态调试了init_array段和JNI_OnLoad里面的方法 并且熟悉了常用的两种patch方法 如果你不想让so中的某一个函数执行 可以直接把这个函数的第二条ARM指令改成POP出栈 但是有一点需要注意 对于动态注册的函数是不可以这样修改的,否则程序会发生异常退出。也可以找到其调用处直接将其对应的HEX改成00 00让其不调用。到此Android逆向基础部分已告一段落,希望大家对课程里面讲解的知识多多练习 毕竟师傅领进门 修行在个人嘛。 下节课我将会带你走进Hook的世界。
四 课后作业
1.了解Xpose的使用
2.搭建Xpose环境,尝试编写Hook代码