将静态链接的elf二进制文件转换为动态链接的



我有一个静态链接到libc的elf二进制文件。我没有访问它的C代码。我想使用OpenOnload库,它在用户空间中实现了套接字,因此与标准libc版本相比,它提供了更低的延迟。OpenOnload实现标准套接字api,并使用LD_PRELOAD覆盖libc版本。但是,由于这个elf二进制文件是静态链接的,因此它不能使用套接字API的OpenOnload版本。

我相信将此二进制文件转换为与OpenOnload动态链接是可能的,通过以下步骤:

  1. 添加新的程序头:PT_INTERP, PT_DYNAMIC和PT_LOAD。
  2. 在PT_DYNAMIC中添加项来列出libc的依赖项。
  3. 在新的PT_LOAD节中为所需的libc函数添加PLT存根。
  4. 修改libc函数的现有二进制代码以跳转到相应的PLT存根。

作为第一个切割,我尝试只是添加3个PT_LOAD段。在现有的PT_LOAD段头之后添加了新的段头。也没有修改现有段的vm_addr。现有段的文件偏移量根据p_align向下移动到下一个对齐的地址。在文件末尾添加了新的PT_LOAD段。

重写文件后,当我运行它时,内核正确地加载了它,但随后它立即出现了segfault。

我的问题是:

  1. 如果我只是在elf二进制文件中移动文件偏移量,而不修改vm_address,它会在运行二进制文件时导致任何错误吗?
  2. 有可能做我正在尝试的事情吗?有人试过吗?

您正在尝试的是不可能以任何自动化的方式实现的。在进行静态链接时,所有将对libc的调用标识为对libc的调用的重定位信息都已被解析和删除。如果二进制文件中存在调试符号,则可以识别"文本段中的此字节范围对应于某某libc函数",但无法识别对函数的引用,这些引用将嵌入到指令字节流中,没有标记来识别它们。您可以使用基于反汇编的启发式,但它们将是不完整和不可靠的(假阴性和假阳性的可能性)。

就偏移量而言,您绝对不能更改静态链接二进制文件的加载地址。如果您需要在加载段之前插入头,则必须插入整个页,并更新程序头表中的文件偏移量(向它们添加1页),同时保持虚拟地址加载偏移量相同。然而,由于您试图做的事情是不可能全面实现的,所以偏移问题是您最不需要担心的。

也许,如果程序不需要高性能,您可以在qemu应用级仿真下运行它,让qemu通过套接字仿真/包装器。

OpenOnload……使用LD_PRELOAD覆盖libc版本。但是,由于这个elf二进制文件是静态链接的…

也在拦截静态链接的可执行文件

的系统调用中应答

相关内容

  • 没有找到相关文章

最新更新