zoukankan      html  css  js  c++  java
  • 教我兄弟学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模块

    学习时的痛苦是暂时的 未学到的痛苦是终生的
  • 相关阅读:
    单例模式
    js事件
    oracle_to_excel
    jquery_2
    jquery_1
    4.linux 复制,删除,重命名
    一个tomcat下部署多个springboot项目
    3.centos7 安装oracle
    桥接模式
    组合模式
  • 原文地址:https://www.cnblogs.com/grimm/p/15063624.html
Copyright © 2011-2022 走看看