我有一个 ELF 二进制文件,已经静态链接到 libc 库。我无法访问它的 C 代码。我想使用 OpenOnload 库,它在用户空间中实现了套接字,因此与标准 libc 版本相比提供了更低的延迟。
OpenOnload 实现了标准的套接字 API,并使用 LD_PRELOAD 覆盖了 libc 版本。但是,由于这个 ELF 二进制文件是静态链接的,它不能使用 OpenOnload 版本的套接字 API。
我认为可以通过以下步骤将该二进制文件转换为与 OpenOnload 动态链接:
- 添加新的程序头:PT_INTERP、PT_DYNAMIC 和 PT_LOAD。
- 在 PT_DYNAMIC 中添加条目以列出与 libc 的依赖项。
- 在新的 PT_LOAD 部分中添加所需 libc 函数的 PLT 存根。
- 修改现有 libc 函数的二进制代码,使其跳转到相应的 PLT 存根。
首先,我尝试只添加三个 PT_LOAD 段。新段头被添加在现有的 PT_LOAD 段头之后。现有段的 vm_addr 没有被修改。现有段的文件偏移量根据 p_align 在下一个对齐地址下方进行了偏移。新的 PT_LOAD 段被添加到文件的末尾。
在重写文件后,当我运行它时,内核成功加载了它,但它立即崩溃了。
我的问题是:
- 如果我只是移动 ELF 二进制文件中的文件偏移量而不修改 vm_addresses,会在运行二进制文件时引发任何错误吗?
- 我正在尝试的事情是否可能实现?有人尝试过吗?
malloc
)将会不可预测地崩溃。你可能最好运行整个二进制文件通过一个反汇编器,手动修剪掉所有的libc代码,然后重新组装和链接它。 - zwol