为了更容易找到缓冲区溢出,我正在更改自定义内存分配器,以便它分配完整的4KB页面,而不是仅分配所需的字节数。然后更改页面保护和大小,以便如果调用方在分配的内存之前或之后进行写操作,应用程序将立即崩溃。

问题是,尽管我有足够的内存,但是由于内存不足,应用程序永远无法完全启动。这有两个原因:

  • 因为每个分配都需要4 KB,所以我们可能很快就会达到2 GB的限制。如果我要制作64位可执行文件(尚未尝试),则可以解决此问题。
  • 即使我只需要几百兆字节,分配也会在某个时刻失败。

  • 第二个问题是最大的问题,我认为这与PTE的最大数量(页表项,存储有关虚拟内存如何映射到物理内存以及页是否应为只读的信息)有关有一个过程。

    我的问题(或小费):
  • 在哪里可以找到有关进程中最大PTE数量的信息?
  • 对于64位系统/应用程序,这是否不同(更高)?
  • 是否可以在应用程序或Windows中配置PTE的数量?

  • 谢谢,

    帕特里克

    PS。对于那些会争辩说您不应该编写自己的内存管理器的人的说明:
  • 我的应用程序非常具体,所以我真的想完全控制内存管理(无法提供更多详细信息)
  • 上周,我们使用标准的C++分配器和C/C++运行时的调试功能找不到了内存覆盖(它仅在实际损坏后的几分钟内表示“阻止损坏”)。
  • 我们还尝试了标准的Windows实用程序(例如GFLAGS等),但它们将应用程序的速度降低了100倍,并且找不到
  • 覆盖的确切位置
  • 我们还尝试了Application Verifier的“Full Page Heap”功能,但随后该应用程序也未启动(可能也已用完了PTE)
  • 最佳答案

    shot弹枪方法是随机分配那些孤立的4KB条目。这意味着您将需要重复运行具有相同输入的相同测试。如果您很幸运,有时它将捕获错误。

    一种更聪明的方法是使用随机算法以外的其他算法-例如是否依赖分配取决于调用堆栈。例如,您是否信任std::string用户并怀疑使用原始malloc

    关于c++ - Windows中有关PTE(页表项)的信息,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2667086/

    10-09 00:12