【发布时间】:2021-03-17 17:37:19
【问题描述】:
问题如题所述:是否可以将ELF二进制文件hello_world转换成目标文件hello_world.o,可以用来生成新的二进制hello_world_2,它是@的副本987654329@?
所以从我的搜索来看,这似乎有点困难。我找到了一种最接近的方法:
使用objcopy 或ld 从二进制文件创建目标文件。一个示例命令是:
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 部分(这是一个整个另一个问题,下面将广泛讨论)。建议对目标文件执行此过程,因为二进制文件中新添加的部分将在加载时可读。
提前感谢您的任何建议,
【问题讨论】:
-
我很好奇,多年来我见过很多修补可执行文件的用例,但并不涉及获取源代码。为什么不能像病毒或破解一样将其拼接到 EXE 中并更新任何偏移量?
-
如果代码使用
-g编译以获取调试信息或类似信息,则可能是可能的。否则,优化的二进制文件不会像.o文件那样知道它自己的函数名称。
标签: c executable elf object-files objcopy