为什么PE部分在运行之间发生变化?

时间:2012-07-26 08:18:08

标签: c++ memory process portable-executable

我偶然发现了一个问题,希望你能帮助我理解。

在我的应用程序中,我有一个快照功能,它复制(ReadProcessMemory或memcpy,相同的结果)所有代码+只读数据部分并将它们写入文件。然后我有一个验证函数,它读取文件并对文件中的内容和内存中的内容进行memcmp。

如果我运行快照功能然后在同一个会话中运行验证功能,无论我运行多少次验证,它都会说它们是相同的。

当我在一个会话中拍摄快照然后重新启动应用程序并运行验证时,如果内存相同或不相同,它似乎完全随机,有时它适用于应用程序的3-4次重启,但迟早它不会认为文件中的数据与pe部分代码相同。

以下是运行之间pe代码段比较的链接:

http://i45.tinypic.com/4kad7b.jpg

它始终是一回事,它将一个角色改为另一个角色(在这种情况下?改为高架1)但是从哪个角色总是不同。

任何人都可以解释为什么会这样吗?如果是这样的话,为什么呢?或者我做错了什么?

注意:无论是否附带调试器,我都在调试和发布中对此进行了测试。

1 个答案:

答案 0 :(得分:3)

出于安全原因,现代操作系统随机化了进程内存布局。该机制称为Address Space Layout Randomization (ALSR)

如果可执行文件中存在漏洞,则通过攻击将外部代码注入应用程序会更加复杂。