我有一个静态链接到 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 存根。
作为第一次剪辑,我尝试仅添加 3 个 PT_LOAD 段。在现有的 PT_LOAD 段标头之后添加了新的段标头。此外,未修改现有段的 vm_addr。基于 p_align 将现有段的文件偏移量移至下一个对齐地址。在文件末尾的文件中添加了新的 PT_LOAD 段。
重新编写文件后,当我运行它时,它被内核正确加载,但随后立即出现 seg-faulted。
我的问题是:
- 如果我只是在 elf 二进制文件中移动文件偏移量,而不修改 vm_addresses,它会在运行二进制文件时导致任何错误吗?
- 有可能做我正在尝试的事情吗?有人尝试过吗?