如何在Linux上dynamic地从Python中插入C函数(没有LD_PRELOAD)?

我如何在运行时(无LD_PRELOAD )拦截/挂钩Linux上的fopen()这样的C函数? 我想从Python做到这一点(因此,我假设该程序已经在运行CPython虚拟机),并重新路由到Python代码。 我很好,只是挂钩共享库函数。 我也想这样做,而不必改变程序的运行方式。

一个想法是基于ptrace()或者重写用dlsym()或者在PLT中find的代码来编译我自己的工具,并且针对ctypes生成的C-callable函数,但是我想我会先问一下。 谢谢。

Solutions Collecting From Web of "如何在Linux上dynamic地从Python中插入C函数(没有LD_PRELOAD)?"

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

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

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

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

把这个编译和链接到python似乎并不难,但我会发送一个消息给perftools开发人员,看看他们的想法。