前言
网上有几篇关于Android inline hook的文章,这篇尤其不错,还有对应的示例代码。为了方便调试看结果,我将其改为gradle工程,代码见这里。你需要将其导入的AS中,然后就可以进行native debug来调试分析原理了。
原理分析
在改动后的代码中,我的目标是hook住origin_log,然后在桩函数new_log中执行自己的逻辑,并能够调用原函数。
直接来分析最重要的几步:
- 指令替换
在doInlineHook函数中,直接将origin_log中的前几个指令替换为
LDR.W PC,[?]
addr_new_log
并将原指令保存起来,这样在调用origin_log的时候,直接就跳转到new_log中。
-
指令修复
在调用原函数的时候,需要将原指令取出来执行,但因为此时的上下文(PC),已经不是之前的PC了,所以原封不动的执行原指令肯定不行,需要做修复,修复说白了就是原来基于PC寻址的,在Hook的时候提前计算好绝对地址,然后用绝对地址寻址。
等效的理解就是原来是个相对路径,换个执行环境后,相对路径需要被替换为等效的绝对路径才不会有错。 -
函数跳回
在执行到修复指令的最后,需要和原函数中没有被替换的指令衔接在一起,这时候需要跳回来,在hook时,计算出被替换的指令的位置,最后也是通过LDR.W PC [?]方式跳转回来。
这三部关键位置完成,就完美的将桩插入到目标函数中了。
网友评论