我如何在运行时(无LD_PRELOAD
)拦截/挂钩Linux上的fopen()
等C函数,以及适用于Windows的Detours?我想从Python中做到这一点(因此,我假设该程序已经在运行CPython VM)并且还要重新路由到Python代码。我只是挂钩共享库函数。我也想这样做而不必改变程序的运行方式。
一个想法是根据ptrace()
推送自己的工具,或者重写代码dlsym()
或PLT中的代码,并定位ctypes
生成的C调用函数,但是我以为我先问这里。感谢。
答案 0 :(得分:2)
google-perftools在src/windows/preamble_patcher*下有自己的Detour实现。这是目前仅限Windows的,但我没有看到任何理由它不能在任何x86机器上工作,除了它使用win32函数查找符号地址。
快速扫描代码,我看到使用的这些win32函数,所有这些函数都有linux版本:
将这个编译并链接到python似乎并不太难,但我会向perftools devs发送一条消息,看看他们的想法。
答案 1 :(得分:2)
您可以从ltrace开发者中找到一种方法来执行此操作。请参阅this post,其中包含完整的补丁以捕获动态加载的库。为了从python中调用它,你可能需要创建一个C模块。