【问题标题】:Converting an ELF binary into an .o file将 ELF 二进制文件转换为 .o 文件
【发布时间】:2021-03-17 17:37:19
【问题描述】:

问题如题所述:是否可以将ELF二进制文件hello_world转换成目标文件hello_world.o,可以用来生成新的二进制hello_world_2,它是@的副本987654329@?

所以从我的搜索来看,这似乎有点困难。我找到了一种最接近的方法:

使用objcopyld 从二进制文件创建目标文件。一个示例命令是:

ld -r -b binary ./hello_world -o hello_world.o

此命令创建一个由类似部分组成的目标文件

00000000 l    d  .data    00000000 .data
00000000 g       .data    00000000 _binary_hello_world_start
00000010 g       .data    00000000 _binary_hello_world_end
00000010 g       *ABS*    00000000 _binary_hello_world_size

如果您将此新生成的目标文件与单独的 C 文件 (https://balau82.wordpress.com/2012/02/19/linking-a-binary-blob-with-gcc/) 链接,则可以访问该文件。但是,这与我希望做的有点不同,因为我需要创建一个单独的代码来访问这个新的目标文件。

这个:Make Executable Binary File From Elf Using GNU objcopy StackOverflow 讨论为类似主题提供了很好的解释。但是,我仍然想知道是否有某种方法可以实现我最初的问题:

binary --> binary.o --> binary_new

旁注:如果有人好奇我为什么要这样做,是因为我试图在我没有源代码的二进制文件中添加一个 .rodata 部分(这是一个整个另一个问题,下面将广泛讨论)。建议对目标文件执行此过程,因为二进制文件中新添加的部分将在加载时可读。

  1. How can the --add-section switch of OBJCOPY be used?

  2. How to replace a section of an elf file with another using objcopy or libelf, such that it does get loaded into the Memory?

  3. Define new code section in assembly code to compile ELF binary

提前感谢您的任何建议,

【问题讨论】:

  • 我很好奇,多年来我见过很多修补可执行文件的用例,但并不涉及获取源代码。为什么不能像病毒或破解一样将其拼接到 EXE 中并更新任何偏移量?
  • 如果代码使用-g 编译以获取调试信息或类似信息,则可能是可能的。否则,优化的二进制文件不会像.o 文件那样知道它自己的函数名称。

标签: c executable elf object-files objcopy


【解决方案1】:

好像有点难

这有点轻描淡写:出于所有实际目的,这是不可能做到的(至少在 ELF 平台上),因为在链接 hello_world 的过程中链接器丢弃包含在包含hello_world 的目标文件中的大部分信息,并且有必要重新构建它。

我正在尝试将 .rodata 部分添加到我没有源代码的二进制文件中

这不太可能是你的真正目标——原始二进制文件不会使用你添加的.rodata,所以你的目标必须是什么else。另见http://xyproblem.info/

【讨论】:

  • 您好,感谢您的回复。我同意你的所有陈述,我认为这是完全不可能的。只是为了回答您的第二点,最终目标是能够使用已修补的二进制文件(使用英特尔 PIN 等二进制工具)读取原始二进制文件的 .rodata 部分。我已经为我拥有.o 文件的二进制文件实现了这一点,因此我想知道是否可以在没有源代码的情况下对二进制文件执行此操作。真诚的。
猜你喜欢
  • 2015-11-07
  • 1970-01-01
  • 1970-01-01
  • 2010-12-23
  • 1970-01-01
  • 1970-01-01
  • 2013-08-20
  • 1970-01-01
  • 2011-10-08
相关资源
最近更新 更多