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到。但某些场景下我们仍旧适用,例如无法使用Frida,单纯想观测函数的输入输出。 **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来监控内存分配等。 ## Inline Hook 本技术路线的基本原理是在代码段中插入跳转指令,从而把程序执行流程引向用户需要的功能代码中去,以此达到Hook的效果,如下图所示: ![](https://img.meituan.net/imgupload/e0fbd3fa6735ba6643baafa5d365ac8a98457.png) 1、在想要Hook的目标代码处备份下面的几条指令,然后插入跳转指令,把程序流程转移到一个stub段上去。 2、在stub代码段上先把所有寄存器的状态保存好,并调用用户自定义的Hook功能函数,然后把所有寄存器的状态恢复并跳转到备份代码处。 3、在备份代码处把当初备份的那几条指令都执行一下,然后跳转到当初备份代码位置的下面接着执行程序。 ## 对比 | Name | PLT Hook | Inline Hook | | ------------ | ------------ | ------------ | |精准度 | 函数级 | 汇编级 | | 范围 |出现在PLT表中的动态链接函数 | 目标so内全部可执行代码 | | 灵活性 | 只能批量 | 单次或批量都可以 | | 技术难度 | 涉及内存地址计算和修改等 | 涉及寄存器计算、手写汇编、指令修复等 | 评论列表 写评论 您的IP:18.218.162.49,临时用户名:a01dbb0e评论已接入DepyWAF审计与流量系统,请勿频繁操作导致IP拉黑 提交评论 © 版权声明:非标注『转载』情况下本文为原创文章,版权归 Depy's docs 所有,转载请联系博主获得授权。