2

我想知道是否可以完全恢复在内存中运行的二进制文件。

这是我试过的

首先 read /proc/PID/maps,然后用 gdb 转储所有相关部分(忽略所有库)。

grep sleep /proc/1524/maps | awk -F '[- ]' \
     '{print "dump memory sleep." $1 " 0x" $1 " 0x" $2 }'  \
   | gdb -p 1524

然后我按顺序连接所有转储:

cat sleep.* > sleep-bin

但是该文件与/bin/sleep

好像是重定位表等未初始化的数据,是不是无法修复内存转储?(使其可运行)

4

1 回答 1

0

免责声明:我是一个 windows 人,对 linux 进程内部和 ELF 格式不太了解,但我希望能帮上忙!

我会说这绝对是可能的,但不适用于所有程序。操作系统加载程序将可执行文件的所有部分加载到文件中明确定义的位置的内存中。例如,一些卸载程序存储附加到可执行文件的数据 - 这不会加载到内存中,因此这将是您无法仅通过转储内存来恢复的信息。

另一个问题是操作系统写入的信息可以自由地被系统上有权这样做的任何东西修改。没有正常的程序会做这样的事情。

起点是在内存中找到可执行模块的 ELF 标头并将其转储。它将包含您完成任务所需的几乎所有数据。例如:

  • 节的数量以及它们在内存和文件中的位置
  • 文件中的部分如何映射到虚拟内存中的部分(它们通常具有不同的基地址和大小!)
  • 重定位数据在哪里

对于 reloc,您必须阅读 reloc 数据是如何使用 ELF 格式存储和处理的。一旦您知道撤消转储的更改应该很容易。

于 2013-10-16T23:54:32.690 回答