C ELF的代理共享库(sharedlib、shlib、so)?
在Windows上,创建“代理DLL”来代替原始DLL并转发对它的调用(根据需要在任何附加操作之后)是比较常见的。你可以阅读关于它的文章,例如 然而,Linux下的shlib-munging文化是完全不同的。首先,LD_PRELOAD是Linux下LD.so的内置特性,它只是将单独的shlib注入进程,并使用它定义为覆盖的任何符号。而这种“注入”技术似乎定义了整个思维方向——或者,这位绅士似乎和我有着相同的用例,但首先要问他如何修补现有的二进制文件C ELF的代理共享库(sharedlib、shlib、so)?,c,dll,proxy,shared-libraries,elf,C,Dll,Proxy,Shared Libraries,Elf,在Windows上,创建“代理DLL”来代替原始DLL并转发对它的调用(根据需要在任何附加操作之后)是比较常见的。你可以阅读关于它的文章,例如 然而,Linux下的shlib-munging文化是完全不同的。首先,LD_PRELOAD是Linux下LD.so的内置特性,它只是将单独的shlib注入进程,并使用它定义为覆盖的任何符号。而这种“注入”技术似乎定义了整个思维方向——或者,这位绅士似乎和我有着相同的用例,但首先要问他如何修补现有的二进制文件 不用了,谢谢。我不想注入或修改不属于我的东西。
不用了,谢谢。我不想注入或修改不属于我的东西。我只想做一个独立的代理shlib,它将调用原始代理。理想情况下,会有一个工具,可以提供原始的。所以,创建一个C源代码,只重定向到原始的函数,同时让我可以轻松地覆盖任何我想要的。那么,这种工具在哪里?;-)谢谢。是一个工具,它涵盖了图形库(OpenGL、DirectX)调用的详细跟踪,可用于多种平台。对于通用解决方案来说,它可能过于详细和复杂,但至少提供了一些参考和亲和力。使用
LD\u PRELOAD
实际上并不涉及修改不属于您的内容,注入与正常的动态库加载也没有什么不同。来自ERESI项目的“典型ELF黑客工具”与LD_PRELOAD
无关。你不应该害怕它。下面是一篇很好的介绍如何编写LD_PRELOAD
-able“proxies”
也就是说,如果您想为某个库创建一个系统范围的代理,您可能会认为全局设置LD_PRELOAD
(从而将代理加载到系统上运行过的每个二进制文件中)是不可取的。它通常用于通过诸如或之类的工具重写glibc中的函数,但是如果要重写比glibc更大和/或更不广泛的库中的函数,那么尝试找到另一种方法是有意义的,即真正为该库创建代理
其中一种方法是使用--替换所需的
或--添加所需的
对原始库的完整路径名进行硬编码,然后通过设置LD\u library\u PATH
确保首先找到代理库。因此,完整的程序是:
LD\u PRELOAD
-可覆盖原始库的某些函数的库(继续之前,请测试它是否仅使用LD\u PRELOAD
工作!)ldd libwrapper foo.so
包含如下内容:libfoo.so.0=>/usr/lib/x86_64-linux-gnu/libfoo.so.0(0x0000deadbeef0000)
patchelf
:patchelf——替换所需的libfoo.so.0/usr/lib/x86_64-linux-gnu/libfoo.so.0 libfoo.so
libfoo.so
到libfoo.so.0
LD\u LIBRARY\u PATH=。ldd$(哪个程序使用libfoo)
应该包括以下几行:libfoo.so.0=>。/libfoo.so.0(0x000056780000)
/usr/lib/x86_64-linux-gnu/libfoo.so.0(0x0000dead1234000000)
LD\u LIBRARY\u PATH
设置为.bashrc
或其他位置中包装器库的完整路径也可以将此代理库放入
/usr/local/lib
,但ldconfig
(更新共享库缓存的工具)拒绝使用具有硬编码绝对路径的库