因此,基本上,我试图重用objdump从Linux上的32位ELF二进制文件转储的一些汇编代码/数据。这个:

 80486b7:   mov    0x804b264,%eax   <- 0x804b264 is an addr in .bss
 80486bc:   movl   
.section .bss
S_0x804B260 : .byte 0x00
           .byte 0x00
           .byte 0x00
          .byte 0x00
S_0x804B264 : .byte 0x00          <- I lift addr into symbol!
          .byte 0x00
         .byte 0x00
         .byte 0x00
         .byte 0x00
x0,0x4(%esp) 80486c3: 80486c4: mov %eax,(%esp) 80486c7: call 804876c <sum>


通过深入研究原始源代码,我发现.bss0x804b264部分中用于stdin.bss部分的数据基本上有两种情况:


未初始化的数据,将在源代码中未初始化
一些与全局/系统相关的数据(例如上述情况下的stdin) )

因此,当尝试重用.bss部分的数据时,我已经尝试过这种方式:也会将相应的地址添加到符号中。

.bss.text部分的相同情况也可以正常工作,定位在.rodata部分中,虽然没有由用户定义的代码初始化,这意味着在我重复使用的asm代码中,此符号变量将始终为零!

我尝试手动替换与stdin对应的符号,

但问题是:


如何识别.data部分中的哪个符号是一些由初始化的变量系统?例如stdin,stdout *等?
如果不可能,那么我是否可以强制系统在我要使用的.bss部分中使用内存?

我清楚吗?有人可以给我些帮助吗?

#1 楼

在谈论“重用”程序的某些部分时,恐怕您不太清楚。您到底想做什么?将原始程序加载到调试器中,然后仅调用其中一个函数?提取一系列地址并将其转换为新程序?还是从原始程序中提取一个功能(可能与该功能所依赖的所有内容一起),然后将该功能嵌入到更大的程序中?在程序启动时完全没有(至少除了stdout字节的负载以外)。 nm之类的东西的初始化是在运行main()之前在运行时完成的。用常量数据初始化的内容进入.data段。类似Unix的系统上的运行时将检查其文件描述符是否到达终端或其他地方,并根据该检查打开/关闭缓冲。)

提取一部分代码时,您会发现如果提取的部分依赖于任何库等,则必须检查对.data和.bss的每个引用(以及对.text的代码-以及代码)。对于每个引用,您都必须决定如何处理它们-与新程序共享它们,并保留它们用于提取的功能,无论如何。

如果幸运的话,拥有解压缩的可执行文件,可以使用q4312079q找出哪个符号在哪里;如果不是很幸运,则必须对所有内容进行反汇编/反编译,了解它们,将其重写为新的源代码,然后将其与想要嵌入的内容一起编译。