教我兄弟学Android逆向11 动态调试init_array

上一篇 《教我兄弟学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下断点。
<ignore_js_op>
<ignore_js_op>
<ignore_js_op>

2.在JNI_OnLoad函数调用SearchObjProcess处下断点 (c代码窗口和汇编指令窗口快速转换按Tab键)
<ignore_js_op>
<ignore_js_op>

3.动态注册的函数sub_1174第一条指令下断点。
<ignore_js_op>

二.动态调试
1.打开Android Device Monitor。
<ignore_js_op>
<ignore_js_op>

2.运行android_server
/data/local/tmp/android_server
<ignore_js_op>

3.端口转发adb forward tcp:23946 tcp:23946
<ignore_js_op>

4.因为我们要调试init_array所以需要在程序刚启动的时候进行调试 如果你对这条指令不熟悉 复习下第四课吧《教我兄弟学Android逆向04 动态调试smali代码 》
启动程序 am start -D -n demo2.jni.com.myapplication/.MainActivity
<ignore_js_op>

5.附加进程
<ignore_js_op>
<ignore_js_op>
<ignore_js_op>
<ignore_js_op>
<ignore_js_op>
<ignore_js_op>

6.附加完成后 如果IDA弹框直接点Yes Debugger option设置一下,因为我们里面会调试到线程所以线程打一个钩 。
<ignore_js_op>
<ignore_js_op>

7.上一步完成后F9运行程序 在IDA等待的时候运行命令。
jdb -connect com.sun.jdi.SocketAttach:port=8700,hostname=localhost
<ignore_js_op>
<ignore_js_op>
<ignore_js_op>

8.点击完same后程序会断在一个点,不要理会,直接F9(如果弹出框都点Yes) 直到程序断在了我们的断点处 并将函数第二条ARM指令改成POP让函数不执行直接出栈  或者把下面调用exit对应的HEX改成00 00 00 00都是可以的。
<ignore_js_op>
<ignore_js_op>
<ignore_js_op>
<ignore_js_op>
<ignore_js_op>

9.IDA继续F9让程序运行起来  直到程序断在我们下的第二个断点处 ARM指令BL是调用函数的意思 所以将其指令对应的HEX改成00 00 00 00 无意义的指令 直接patch掉达到让其不调用的目的 注:ARM指令不是本节课的重点,关于ARM指令的教程以后的课程会有讲到.
<ignore_js_op>
<ignore_js_op>

10.IDA继续F9 这时会来到我们下的第三处断点,注意这里是动态注册的函数 对于动态注册的函数我们就不能通过把第二条ARM指令改成POP直接出栈 否则程序会崩溃 那这里怎么改呢?这里可以直接把调用exit退出对应的HEX改成00 00 00 00来过掉。
<ignore_js_op>
<ignore_js_op>

11.到此这三处反调试就都过掉了,现在F9运行遇见弹框都点确定,然后程序弹框 恭喜你挑战成功!


三.总结
本节课我带你用IDA动态调试了init_array段和JNI_OnLoad里面的方法,并且熟悉了常用的两种patch方法,如果你不想让so中的某一个函数执行,可以直接把这个函数的第二条ARM指令改成POP出栈,但是有一点需要注意 对于动态注册的函数是不可以这样修改的,否则程序会发生异常退出。也可以找到其调用处直接将其对应的HEX改成00 00让其不调用。到此Android逆向基础部分已告一段落,希望大家对课程里面讲解的知识多多练习 毕竟师傅领进门 修行在个人嘛。  下节课我将会带你走进Hook的世界。


四.课后作业
1.了解Xpose的使用。
2.搭建Xpose环境,尝试编写Hook代码。


下一篇:《教我兄弟学Android逆向12 编写xpose模块

学习时的痛苦是暂时的 未学到的痛苦是终生的
原文地址:https://www.cnblogs.com/grimm/p/15063624.html