如何在Linux上动态插入Python的C函数(没有LD_PRELOAD)?

时间:2011-02-03 23:28:11

标签: python linux library-interposition

我如何在运行时(无LD_PRELOAD)拦截/挂钩Linux上的fopen()等C函数,以及适用于Windows的Detours?我想从Python中做到这一点(因此,我假设该程序已经在运行CPython VM)并且还要重新路由到Python代码。我只是挂钩共享库函数。我也想这样做而不必改变程序的运行方式。

一个想法是根据ptrace()推送自己的工具,或者重写代码dlsym()或PLT中的代码,并定位ctypes生成的C调用函数,但是我以为我先问这里。感谢。

2 个答案:

答案 0 :(得分:2)

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

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

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

将这个编译并链接到python似乎并不太难,但我会向perftools devs发送一条消息,看看他们的想法。

答案 1 :(得分:2)

您可以从ltrace开发者中找到一种方法来执行此操作。请参阅this post,其中包含完整的补丁以捕获动态加载的库。为了从python中调用它,你可能需要创建一个C模块。