11

我如何在运行时(否LD_PRELOAD)拦截/挂钩一个 C 函数,如fopen()Linux 上的一个 la Detours for Windows?我想从 Python 执行此操作(因此,我假设该程序已经在运行 CPython VM)并且还重新路由到 Python 代码。只需挂钩共享库函数就可以了。我也想这样做,而不必改变程序的运行方式。

一个想法是基于ptrace()或重写dlsym()在 PLT 中或在 PLT 中找到的代码,并以ctypes生成的 C 可调用函数为目标来推出我自己的工具,但我想我会先在这里问。谢谢。

4

2 回答 2

2

你会从一个 ltrace 开发者那里找到一种方法来做到这一点。请参阅这篇文章,其中包括一个完整的补丁,以捕获动态加载的库。为了从 python 中调用它,您可能需要创建一个 C 模块。

于 2012-01-24T13:51:47.667 回答
2

google-perftools 在src/windows/preamble_patcher*下有自己的 Detour 实现。目前这是仅限于 Windows 的,但我看不出有任何理由它不能在任何 x86 机器上运行,除了它使用 win32 函数来查找符号地址这一事实。

快速扫描代码,我看到使用了这些 win32 函数,所有这些函数都有 linux 版本:

  • GetModuleHandle/GetProcAddress :获取函数地址。dlsym 可以做到这一点。
  • VirtualProtect :允许修改程序集。保护。
  • 获取当前进程:getpid
  • FlushInstructionCache (根据评论显然是一个 nop)

将其编译并链接到 python 中似乎并不难,但我会向 perftools 开发人员发送一条消息,看看他们的想法。

于 2011-02-12T01:06:24.103 回答