got表hook和inlinehook的优缺?(面试题)

高质量文章:

Android Hook技术学习——常见的Hook技术方案总结
https://bbs.kanxue.com/thread-272870.htm

GOT Hook 与 Inline Hook 的优缺点对比

GOT(Global Offset Table)Hook 和 Inline Hook 是两种常见的函数劫持(hooking)技术,广泛用于逆向分析、动态调试、函数拦截等场景。两者各有优缺点,适用于不同需求。


1. GOT Hook

原理

  • GOT 是动态链接的全局偏移表,在 ELF 可执行文件中用于存储动态链接库函数的地址。
  • GOT Hook 通过修改 GOT 表中的函数地址,使程序调用目标函数时跳转到自定义函数(Hook 函数)。

优点

稳定性高

  • 只影响特定的函数指针,而不会修改代码段,避免修改指令带来的潜在崩溃风险。
  • 不依赖特定架构(x86、ARM 都适用)。

适用于共享库(shared library)

  • 可用于拦截动态链接的函数调用,适用于 libclibm 等标准库的 Hook。

绕过部分完整性校验

  • 由于不直接修改代码段(.text),可以绕过部分反调试和完整性检测机制。

缺点

仅适用于动态链接的函数

  • 不能 Hook 静态链接的函数,也不能 Hook 内联的函数。

无法拦截 PLT 之前的调用

  • ELF 采用 PLT(Procedure Linkage Table)延迟解析机制,首次调用函数时仍需解析真实地址,因此可能导致首次调用未被 Hook。

容易被检测

  • 通过 dl_iterate_phdrreadelf -robjdump -R 等方式,可以检测 GOT 表是否被篡改。

2. Inline Hook

原理

  • 直接修改目标函数的 .text 代码段,在函数开头插入跳转指令(JMP/BL),使执行流程跳转到 Hook 函数。
  • 可用于 Hook 任意代码段中的函数(包括静态函数、内联函数、动态库函数等)。

优点

适用范围广

  • 可 Hook 静态链接函数、内联函数,甚至内核函数
  • 可用于 Hook 系统调用(syscall),甚至修改内核态函数行为。

可拦截所有调用

  • Hook 发生在代码执行的最早阶段,不受 PLT/GOT 解析影响。

适用于更深层次的拦截

  • 可以在 Hook 代码中执行指令级修改,例如修改寄存器、修改参数等。

缺点

稳定性低,易崩溃

  • 直接修改 .text 段,若 Hook 代码不当可能导致程序崩溃。
  • 修改 .text 需要关闭写保护(mprotect),某些安全机制(如 SELinux、PIE、PaX)可能会阻止修改。

受架构限制

  • 在不同架构(x86/x86_64、ARM/ARM64)下,指令集不同,Hook 方式不同。
  • 例如,在 x86/x86_64 上通常使用 jmp,而在 ARM 上需要处理 BL 指令和 Thumb 模式。

容易被检测

  • 反调试工具可以检查 .text 段是否被修改,例如:
    objdump -d target_binary | grep <hooked_function>
    
  • 还可以通过校验 memcmp() 比较代码段原始内容和当前内容是否一致。

3. GOT Hook vs. Inline Hook 对比总结

特性GOT HookInline Hook
适用范围仅动态链接的函数所有函数(包括静态/内联)
修改方式修改 GOT 表修改 .text
稳定性低(容易崩溃)
首次调用拦截可能无法拦截能拦截
绕过完整性校验部分有效无效(易检测)
反调试检测读取 GOT 表即可检测比较 .text 段即可检测
适用架构通用受架构指令集限制
修改权限只需要改写 GOT(数据段,可写)需要解除 .text 段写保护
可逆性容易恢复需要恢复原始指令

4. 适用场景

场景推荐 Hook 方式说明
Hook libc 等动态库函数GOT Hook适用于拦截 mallocopen 等标准库调用
Hook 静态链接/内联函数Inline HookGOT Hook 无法拦截
Hook 所有函数调用Inline Hook可以拦截 PLT 解析前的所有调用
需要稳定性高GOT Hook修改数据段,相对稳定
需要广泛适用性Inline Hook可以拦截更多函数
需要隐藏 HookGOT Hook(部分情况)但仍然可以被检测
Android 逆向分析GOT Hook(系统库) / Inline Hook(特定函数)具体情况具体分析

5. 总结

  • GOT Hook 适用于拦截动态库函数,稳定性较高,但无法 Hook 静态/内联函数,容易被检测。
  • Inline Hook 适用于拦截所有函数(包括静态、内联),但修改 .text 段稳定性低,容易导致崩溃,也容易被检测。
  • 选择哪种 Hook 方式,取决于 目标函数类型稳定性要求反检测需求

在实际应用中,通常结合两者使用。例如:

  • GOT Hook 拦截 malloc/freeopen/close 等系统调用。
  • Inline Hook 用于修改特定函数行为(如游戏修改器、反调试)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值