从内存中完全恢复二进制文件?

时间:2013-10-16 23:11:35

标签: memory dump elf

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

这就是我尝试过的,

首先阅读/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

非常不同

似乎是重定位表和其他未初始化的数据,因此无法修复内存转储? (让它可以运行)

1 个答案:

答案 0 :(得分:0)

免责声明:我是一名Windows用户,对linux进程内部和ELF格式了解不多,但我希望能提供帮助!

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

另一个问题是操作系统编写的信息可以由有权这样做的系统上的任何内容自由修改。没有正常的程序可以做那样的事情。

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

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

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