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)
- 可用于拦截动态链接的函数调用,适用于
libc
、libm
等标准库的 Hook。
✅ 绕过部分完整性校验
- 由于不直接修改代码段(
.text
),可以绕过部分反调试和完整性检测机制。
缺点
❌ 仅适用于动态链接的函数
- 不能 Hook 静态链接的函数,也不能 Hook 内联的函数。
❌ 无法拦截 PLT 之前的调用
- ELF 采用 PLT(Procedure Linkage Table)延迟解析机制,首次调用函数时仍需解析真实地址,因此可能导致首次调用未被 Hook。
❌ 容易被检测
- 通过
dl_iterate_phdr
、readelf -r
、objdump -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 Hook | Inline Hook |
---|---|---|
适用范围 | 仅动态链接的函数 | 所有函数(包括静态/内联) |
修改方式 | 修改 GOT 表 | 修改 .text 段 |
稳定性 | 高 | 低(容易崩溃) |
首次调用拦截 | 可能无法拦截 | 能拦截 |
绕过完整性校验 | 部分有效 | 无效(易检测) |
反调试检测 | 读取 GOT 表即可检测 | 比较 .text 段即可检测 |
适用架构 | 通用 | 受架构指令集限制 |
修改权限 | 只需要改写 GOT(数据段,可写) | 需要解除 .text 段写保护 |
可逆性 | 容易恢复 | 需要恢复原始指令 |
4. 适用场景
场景 | 推荐 Hook 方式 | 说明 |
---|---|---|
Hook libc 等动态库函数 | GOT Hook | 适用于拦截 malloc 、open 等标准库调用 |
Hook 静态链接/内联函数 | Inline Hook | GOT Hook 无法拦截 |
Hook 所有函数调用 | Inline Hook | 可以拦截 PLT 解析前的所有调用 |
需要稳定性高 | GOT Hook | 修改数据段,相对稳定 |
需要广泛适用性 | Inline Hook | 可以拦截更多函数 |
需要隐藏 Hook | GOT Hook(部分情况) | 但仍然可以被检测 |
Android 逆向分析 | GOT Hook(系统库) / Inline Hook(特定函数) | 具体情况具体分析 |
5. 总结
- GOT Hook 适用于拦截动态库函数,稳定性较高,但无法 Hook 静态/内联函数,容易被检测。
- Inline Hook 适用于拦截所有函数(包括静态、内联),但修改
.text
段稳定性低,容易导致崩溃,也容易被检测。 - 选择哪种 Hook 方式,取决于 目标函数类型、稳定性要求 和 反检测需求。
在实际应用中,通常结合两者使用。例如:
- GOT Hook 拦截
malloc/free
、open/close
等系统调用。 - Inline Hook 用于修改特定函数行为(如游戏修改器、反调试)。