0

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

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

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

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

这是运行之间的pe代码部分比较的链接:

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

它始终是同一件事,它将一个字符更改为另一个字符(在这种情况下?变为升高的 1),但从和到哪个字符总是不同的。

谁能解释为什么会这样?应该是这样,如果是,为什么?还是我做错了什么?

注意:我已经在调试和发布中测试了这个,无论是否附加调试器。

4

1 回答 1

3

出于安全原因,现代操作系统随机化进程的内存布局。该机制称为地址空间布局随机化 (ALSR)

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

于 2012-07-26T08:30:23.817 回答