gpt4 book ai didi

c - 如何将 'link' 目标文件转换为可执行/编译的二进制文件?

转载 作者:IT王子 更新时间:2023-10-29 00:00:54 26 4
gpt4 key购买 nike

问题

我希望将目标文件注入(inject)现有的二进制文件。作为一个具体的例子,考虑一个源 Hello.c:

#include <stdlib.h>

int main(void)
{
return EXIT_SUCCESS;
}

它可以通过gcc -std=gnu99 -Wall Hello.c -o Hello 编译成名为Hello 的可执行文件。此外,现在考虑 Embed.c:

func1(void)
{
}

目标文件 Embed.o 可以通过 gcc -c Embed.c 创建。我的问题是如何将 Embed.o 一般地插入到 Hello 中,以执行必要的重定位和适当的 ELF 内部表(例如符号表、PLT、等)打补丁了吗?


假设

可以假设要嵌入的目标文件已经静态链接了它的依赖项。可以假定任何动态依赖项(例如 C 运行时)也存在于目标可执行文件中。


当前的尝试/想法

  • 使用libbfd 将对象文件中的部分复制到二进制文件中。我在这方面取得的进步是我可以用原始二进制文件的部分和目标文件的部分创建一个新对象。问题在于,由于目标文件是可重定位的,因此如果不先执行重定位,就无法将其部分正确复制到输出中。
  • 将二进制文件转换回目标文件并使用 ld 重新链接。到目前为止,我尝试使用 objcopy 执行转换 objcopy --input elf64-x86-64 --output elf64-x86-64 Hello Hello.o。显然这并不像我预期的那样工作,因为 ld -o Hello2 Embed.o Hello.o 将导致 ld: error: Hello.o: unsupported ELF file type 2 .我想这应该是预料之中的,因为 Hello 不是目标文件。
  • 找到执行此类插入的现有工具?

基本原理(可选阅读)

我正在制作一个静态可执行编辑器,其愿景是允许将任意用户定义的例程检测到现有的二进制文件中。这将分两步进行:

  1. 将目标文件(包含用户定义的例程)注入(inject)二进制文件。 这是一个强制性步骤,不能通过注入(inject)共享对象等替代方法解决。
  2. 对新二进制文件执行静态分析,并使用它静态绕过从原始代码到新添加代码的例程。

在大多数情况下,我已经完成了步骤 2 所需的工作,但是我在注入(inject)目标文件时遇到了问题。考虑到其他工具使用相同的对象注入(inject)方法(例如 EEL ),这个问题肯定是可以解决的。

最佳答案

如果是我,我会在共享对象 libembed.so 中创建 Embed.c,如下所示:

gcc -Wall -shared -fPIC -o libembed.so Embed.c

这应该从 Embed.c 创建一个可重定位的共享对象。有了它,您可以通过在运行时设置环境变量 LD_PRELOAD 来强制您的目标二进制文件加载此共享对象(请参阅更多信息 here ):

LD_PRELOAD=/path/to/libembed.so Hello

这里的“技巧”是弄清楚如何进行检测,特别是考虑到它是一个静态可执行文件。在那里,我帮不了你,但这是将代码存在于进程内存空间中的一种方法。您可能希望在构造函数中进行某种初始化,您可以使用属性进行初始化(如果您使用的是 gcc,至少):

void __attribute__ ((constructor)) my_init()
{
// put code here!
}

关于c - 如何将 'link' 目标文件转换为可执行/编译的二进制文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9449845/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com