当前位置: 首页 > news >正文

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 用于修改特定函数行为(如游戏修改器、反调试)。

相关文章:

  • 深度学习历程
  • 【从零开始学习计算机科学】计算机体系结构(二)指令级并行(ILP)
  • 面试之《技巧》
  • 云服务运维智能时代:阿里云操作系统控制台
  • ctf-WEB: 关于 GHCTF Message in a Bottle plus 与 Message in a Bottle 的非官方wp解法
  • 2025涡轮展技术论坛看点:整机研发-核心部件-材料工艺-运维服务
  • 算法精讲 | 树(二):BFS层序遍历の魔法——像水波纹一样扫描整棵树
  • ⚡ 回声谷即时通讯系统
  • 在Vue中如何高效管理组件状态?
  • C# BlockingCollection
  • 【C#实现手写Ollama服务交互,实现本地模型对话】
  • 【Linux】用户和组
  • 使用miniforge安装python并用pycharm打开使用
  • 开源、创新与人才发展:机器人产业的战略布局与稚晖君成功案例解析
  • 【每日学点HarmonyOS Next知识】span问题、组件标识属性、属性动画回调、图文混排、相对布局问题
  • 【hot100】实现Trie(前缀树)
  • 前端 Webpack 面试题
  • javaEE初阶————多线程进阶(2)
  • PaddleDetection目标检测自定义训练
  • 李彦宏:紧抓AI智能体爆发元年机遇 推动新质生产力加快发展
  • 秦洪看盘|重估叙事主题卷土重来,给A股注入新活力
  • 国家主席习近平同普京总统出席签字和合作文本交换仪式
  • 化学家、台湾地区“中研院”原学术副院长陈长谦逝世
  • 太原一高中生指出博物馆多件藏品标识不当,馆方已邀请他和专家共同探讨
  • 圆桌丨权威专家解读中俄关系:在新形势下共同应对挑战、共创发展机遇
  • 超燃!走过莫斯科街头的“中国排面”