将静态链接的elf二进制转换为dynamic链接

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

我相信,转换这个二进制dynamic链接与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将现有段的文件偏移量转移到下一个alignment的地址。 新的PT_LOAD段被添加到文件末尾的文件中。

在重新写入文件之后,当我运行它时,它已经被内核正确加载了,但是它立即被分割了。

我的问题是:

  1. 如果我只是移动精灵二进制文件偏移量,而不修改vm_addresses,它可以导致运行二进制文件时出现任何错误?
  2. 是否有可能做我正在尝试的? 有人试图吗?

Solutions Collecting From Web of "将静态链接的elf二进制转换为dynamic链接"

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

至于移位偏移量,绝对不能改变静态链接二进制的加载地址。 如果需要在加载段之前插入标题,则必须插入整个页面,并在程序标题表中更新文件偏移量(向其中添加1个页面),同时保持虚拟地址加载偏移量不变。 但是,由于你想要做的事情是不可能的,所以偏移转移问题是你最担心的问题。

也许,如果程序不要求高性能,可以在qemu应用程序级别模拟下运行,qemu通过套接字模拟/包装器运行。