Hook技术路线
Security Classification: 【C-1】 | Publish Time:2024-02-26 | Category:Reading Notes | EditLatest Version
Expiry Notice: The article was published three months ago. Please independently assess the validity of the technical methods and code mentioned within. :)
AI Summary: 文章介绍了两种Hook技术:PLT Hook和Inline Hook。PLT Hook通过修改GOT表实现函数调用的重定向,适用于动态链接库,但无法精准控制特定调用;Inline Hook则通过插入跳转指令在代码中实现更高精度的控制,适用于整个动态库的可执行代码。两者在精准度、范围、灵活性和技术难度上有所不同。 --- (From Model:gpt-4o-mini-2024-07-18)
主要的两大路线
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来监控内存分配等。
Comment List