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

Memory 从内存中完全恢复二进制文件?,memory,dump,elf,Memory,Dump,Elf,我想知道是否有可能完全恢复内存中运行的二进制文件 这就是我试过的 首先读取/proc/PID/maps,然后使用gdb转储所有相关部分(忽略所有库) 然后,我按顺序连接所有转储: cat sleep.* > sleep-bin 但是该文件与/bin/sleep 它看起来像是重新定位表和其他未初始化的数据,所以不可能修复内存转储吗?(使其可运行)免责声明:我是一个windows爱好者,对linux进程内部和ELF格式不太了解,但我希望我能提供帮助 我想说这是完全可能做到的,但不是所有的项目

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

这就是我试过的

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

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

cat sleep.* > sleep-bin
但是该文件与
/bin/sleep


它看起来像是重新定位表和其他未初始化的数据,所以不可能修复内存转储吗?(使其可运行)

免责声明:我是一个windows爱好者,对linux进程内部和ELF格式不太了解,但我希望我能提供帮助

我想说这是完全可能做到的,但不是所有的项目。OS加载器将可执行文件的所有部分加载到文件中定义良好的位置内的内存中。例如,某些卸载程序存储附加到可执行文件中的数据-这些数据不会加载到内存中,因此这些信息仅通过转储内存是无法恢复的

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

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

  • 节数及其在内存和文件中的位置
  • 如何将文件中的节映射到虚拟内存中的节(它们通常具有不同的基址和大小!)
  • 重新定位数据在哪里
对于reloc,您必须了解reloc数据是如何使用ELF格式存储和处理的。一旦您知道撤销转储的更改应该非常容易

cat sleep.* > sleep-bin