C ELF的代理共享库(sharedlib、shlib、so)?

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注入进程,并使用它定义为覆盖的任何符号。而这种“注入”技术似乎定义了整个思维方向——或者,这位绅士似乎和我有着相同的用例,但首先要问他如何修补现有的二进制文件 不用了,谢谢。我不想注入或修改不属于我的东西。

在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
    (更新共享库缓存的工具)拒绝使用具有硬编码绝对路径的库