聊一聊 Linux 上对函数进行 hook 的两种方式 - 一线码农

💡 原文中文,约7600字,阅读约需18分钟。
📝

内容提要

本文介绍了在Linux上进行函数hook的两种方法:LD_PRELOAD和funchook。LD_PRELOAD适用于简单场景,通过共享库拦截函数;而funchook则提供更细粒度的控制,适合复杂需求。选择应根据具体情况。

🎯

关键要点

  • 本文介绍了在Linux上进行函数hook的两种方法:LD_PRELOAD和funchook。
  • LD_PRELOAD适用于简单场景,通过共享库拦截函数,优点是不需要修改源程序。
  • funchook提供更细粒度的控制,适合复杂需求。
  • LD_PRELOAD的加载顺序为主程序可执行文件 -> LD_PRELOAD指定的库 -> glibc标准库 -> 其他依赖库。
  • 通过LD_PRELOAD可以覆盖后续同名符号,实现函数拦截。
  • 示例代码展示了如何使用LD_PRELOAD拦截openat函数。
  • funchook提供了更灵活的函数级拦截,适合需要更细粒度控制的场景。
  • funchook的安装需要通过源码编译生成对应的头文件和库文件。
  • 示例代码展示了如何使用funchook拦截openat函数。
  • 总结:LD_PRELOAD简单但粒度粗,适合无侵入场景;funchook适合需要细粒度控制的复杂需求。

延伸问答

LD_PRELOAD 是什么,它的优点是什么?

LD_PRELOAD 是一种共享库拦截方式,优点是不需要修改源程序,适合简单场景。

funchook 与 LD_PRELOAD 有什么区别?

funchook 提供更细粒度的控制,适合复杂需求,而 LD_PRELOAD 粒度较粗,适合简单场景。

如何使用 LD_PRELOAD 拦截函数?

通过定义共享库并使用 dlsym 获取原始函数地址,然后在 hook 函数中调用原始函数。

funchook 的安装步骤是什么?

需要通过源码编译生成头文件和库文件,使用 cmake 和 make 命令进行安装。

LD_PRELOAD 的加载顺序是怎样的?

加载顺序为主程序可执行文件 -> LD_PRELOAD 指定的库 -> glibc 标准库 -> 其他依赖库。

使用 funchook 拦截函数的基本步骤是什么?

获取原始函数地址,创建 funchook 实例,准备和安装 hook,然后进行测试调用。

➡️

继续阅读