为了更容易找到缓冲区溢出,我正在更改自定义内存分配器,以便它分配一个完整的4KB页面而不是只需要的字节数。然后我更改页面保护和大小,以便如果调用者在其分配的内存之前或之后写入,则应用程序立即崩溃。
问题是虽然我有足够的内存,但应用程序永远不会完全启动,因为内存不足。这有两个原因:
第二个问题是最大的问题,我认为这与PTE的最大数量有关(页表条目,它存储有关虚拟内存如何映射到物理内存的信息,以及页面是否应该是只读的你可以拥有一个过程。
我的问题(或提示小心):
谢谢,
帕特里克
PS。请注意那些试图证明你不应该编写自己的内存管理器的人:
答案 0 :(得分:3)
我认为Mark Russinovich在technet上发布了一系列伟大的博客文章,名为“推动Windows的极限......”
http://blogs.technet.com/markrussinovich/archive/2008/07/21/3092070.aspx
它有一些关于虚拟内存,分页非分页内存,物理内存等的文章。
他提到了他用来测量系统资源的小实用程序。
希望你能在那里找到答案。
答案 1 :(得分:1)
为了更容易找到缓冲区 溢出我正在改变我们的习惯 内存分配器,以便它分配 一个完整的4KB页面,而不仅仅是 想要的字节数。
这已经完成了。 Application Verifier与PageHeap。
可以在Windows Internals, 5th Ed.和Intel Manuals中找到有关PTE和内存架构的信息。
对于64位系统/应用程序是否有所不同(更高)?
当然。 64位Windows具有更大的地址空间,因此需要更多的PTE来映射它。
我在哪里可以找到有关的信息 一个过程中的最大PTE数量?
这不如进程中可用的最大用户地址空间量那么重要。 (PTE的数量是此数字除以页面大小。)
在32位Windows上为2GB,在x64 Windows上为更大。 (实际数字有所不同,但它“足够大”)。
问题是虽然我已经足够了 内存,应用程序永远不会启动 完全因为它耗尽了 存储器中。
你是a)泄漏记忆吗? b)使用非常低效的算法?
答案 2 :(得分:1)
看看OpenBSD malloc的实施情况。很多相同的想法(以及更多)由非常技术人员实施。
答案 3 :(得分:1)
霰弹枪的方法是随机分配那些孤立的4KB条目 。这意味着您需要重复运行相同的测试,并重复输入相同的输入。如果你幸运的话,有时它会发现错误。
一种稍微聪明的方法是使用另一种算法而不仅仅是随机算法 - 例如使它依赖于调用堆栈是否隔离了分配。例如,您是否信任std::string
用户并怀疑原始malloc
使用?