Android Inline Hook 详解

作者: difcareer | 来源:发表于2016-12-23 19:03 被阅读970次

    前言

    网上有几篇关于Android inline hook的文章,这篇尤其不错,还有对应的示例代码。为了方便调试看结果,我将其改为gradle工程,代码见这里。你需要将其导入的AS中,然后就可以进行native debug来调试分析原理了。

    原理分析

    在改动后的代码中,我的目标是hook住origin_log,然后在桩函数new_log中执行自己的逻辑,并能够调用原函数。

    直接来分析最重要的几步:

    1. 指令替换
      在doInlineHook函数中,直接将origin_log中的前几个指令替换为
    LDR.W PC,[?]
    addr_new_log
    

    并将原指令保存起来,这样在调用origin_log的时候,直接就跳转到new_log中。

    1. 指令修复
      在调用原函数的时候,需要将原指令取出来执行,但因为此时的上下文(PC),已经不是之前的PC了,所以原封不动的执行原指令肯定不行,需要做修复,修复说白了就是原来基于PC寻址的,在Hook的时候提前计算好绝对地址,然后用绝对地址寻址。
      等效的理解就是原来是个相对路径,换个执行环境后,相对路径需要被替换为等效的绝对路径才不会有错。

    2. 函数跳回
      在执行到修复指令的最后,需要和原函数中没有被替换的指令衔接在一起,这时候需要跳回来,在hook时,计算出被替换的指令的位置,最后也是通过LDR.W PC [?]方式跳转回来。

    这三部关键位置完成,就完美的将桩插入到目标函数中了。

    如果觉得我的文章对你有帮助,想要打赏我,请扫下面的微信(吐槽下简书的打赏提现略坑)

    Paste_Image.png

    相关文章

      网友评论

      本文标题:Android Inline Hook 详解

      本文链接:https://www.haomeiwen.com/subject/ltokvttx.html