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>
通过深入研究原始源代码,我发现
.bss
在0x804b264
部分中用于stdin
。 .bss
部分的数据基本上有两种情况:未初始化的数据,将在源代码中未初始化
一些与全局/系统相关的数据(例如上述情况下的stdin) )
因此,当尝试重用
.bss
部分的数据时,我已经尝试过这种方式:也会将相应的地址添加到符号中。.bss
和.text
部分的相同情况也可以正常工作,定位在.rodata
部分中,虽然没有由用户定义的代码初始化,这意味着在我重复使用的asm代码中,此符号变量将始终为零!我尝试手动替换与stdin对应的符号,
但问题是:
如何识别
.data
部分中的哪个符号是一些由初始化的变量系统?例如stdin,stdout *等?如果不可能,那么我是否可以强制系统在我要使用的
.bss
部分中使用内存?我清楚吗?有人可以给我些帮助吗?
#1 楼
在谈论“重用”程序的某些部分时,恐怕您不太清楚。您到底想做什么?将原始程序加载到调试器中,然后仅调用其中一个函数?提取一系列地址并将其转换为新程序?还是从原始程序中提取一个功能(可能与该功能所依赖的所有内容一起),然后将该功能嵌入到更大的程序中?在程序启动时完全没有(至少除了stdout
字节的负载以外)。 nm
之类的东西的初始化是在运行main()之前在运行时完成的。用常量数据初始化的内容进入.data段。类似Unix的系统上的运行时将检查其文件描述符是否到达终端或其他地方,并根据该检查打开/关闭缓冲。)提取一部分代码时,您会发现如果提取的部分依赖于任何库等,则必须检查对.data和.bss的每个引用(以及对.text的代码-以及代码)。对于每个引用,您都必须决定如何处理它们-与新程序共享它们,并保留它们用于提取的功能,无论如何。
如果幸运的话,拥有解压缩的可执行文件,可以使用q4312079q找出哪个符号在哪里;如果不是很幸运,则必须对所有内容进行反汇编/反编译,了解它们,将其重写为新的源代码,然后将其与想要嵌入的内容一起编译。