Hook技术路线 密级: 【C-1】 | 时间:2024-02-26 | 目录:读书笔记 | 编辑本文 上一版本 | 版本差异 | 下一版本 文章距今已发表三个月,请自行判断文中技术方法、代码的有效性:) https://gtoad.github.io/2018/07/05/Android-Native-Hook/ ## 主要的两大路线 1、PLT Hook 1、Inline Hook ## PLT Hook ### 原理 Linux在执行动态链接的ELF的时候,为了优化性能使用了一个叫延时绑定的策略。 在动态链接的ELF程序里调用共享库的函数时,第一次调用时先去查找PLT表中相应的项目,而PLT表中再跳跃到GOT表中希望得到该函数的实际地址,但这时GOT表中指向的是PLT中那条跳跃指令下面的代码,最终会执行_dl_runtime_resolve()并执行目标函数。 第二次调用时也是PLT跳转到GOT表,但是GOT中对应项目已经在第一次_dl_runtime_resolve()中被修改为函数实际地址,因此第二次及以后的调用直接就去执行目标函数,不用再去执行_dl_runtime_resolve()了。 因此,PLT Hook通过直接修改GOT表,使得在调用该共享库的函数时跳转到的是用户自定义的Hook功能代码。 ### 特点 **技术特点** 1、由于修改的是GOT表中的数据,因此修改后,所有对该函数进行调用的地方就都会被Hook到。这个效果的影响范围是该PLT和GOT所处的整个so库。因此,当目标so库中多行被执行代码都调用了该PLT项所对应的函数,那它们都会去执行Hook功能。 2、PLT与GOT表中仅仅包含本ELF需要调用的共享库函数项目,因此不在PLT表中的函数无法Hook到。 **Hook结果** 1、可以大量Hook那些系统API,但是难以精准Hook住某次函数调用。 2、对于一些so内部自定义的函数无法Hook到。因为这些函数不在PLT表和GOT表里。例如NDK中实现的一些加密工作,即使使用了共享库中的加密函数,但秘钥的保存管理等依然需要进一步分析,而这些工作对于自定义函数甚至是某行汇编代码的监控能力要求是远远超出PLT Hook所能提供的范围。 3、在回调原函数方面,PLT Hook在hook目标函数时,如果需要回调原来的函数,那就在Hook后的功能函数中直接调用目标函数即可。 ### 典型的PLT Hook工具 爱奇艺开源的xHook工具库,主要是用于开发者开发时把该项目集成进自己的APP,然后使用这个工具库来帮助开发者监控APK运行时那些他们关心的性能数据。比如通过hook malloc来监控内存分配等。 评论列表 写评论 您的IP:18.191.240.249,临时用户名:2adc2e99评论已接入DepyWAF审计与流量系统,请勿频繁操作导致IP拉黑 提交评论 © 版权声明:非标注『转载』情况下本文为原创文章,版权归 Depy's docs 所有,转载请联系博主获得授权。