如何故意造成 Windows 堆损坏?

How to Intentionally cause Windows Heap Corruption?

我正在尝试使用值 HeapEnableTerminationOnCorruption[=28= 测试 Windows API HeapSetInformation ] 通过尝试创建异常代码 0xC0000374,这意味着 STATUS_HEAP_CORRUPTION.

是否有一些简单的 C 代码可以故意破坏堆? 我试过以下但没有崩溃或产生任何异常?

#include <windows.h>
#include <stdio.h>

int main(void)
{
    BOOL bResult = HeapSetInformation(NULL, HeapEnableTerminationOnCorruption, NULL, 0);

    HANDLE hHeap = HeapCreate(0, 0, 0);
    LPVOID pBuf = HeapAlloc(hHeap, HEAP_ZERO_MEMORY, 1024);

    memset(pBuf, 0x41, 2048);

    HeapFree(hHeap, 0, pBuf);

    return 0;
}

已编辑

添加 HeapFree() 调用生成异常。

Faulting application name: memory-map.exe, version: 0.0.0.0, time stamp: 0x61412573
Faulting module name: ntdll.dll, version: 10.0.19041.1110, time stamp: 0x8a32a22a
Exception code: 0xc0000374
Fault offset: 0x000e6c23
Faulting process id: 0x8218
Faulting application start time: 0x01d7a9ba304122bd
Faulting application path: C:\Users\John\source\repos\memory-map\Release\memory-map.exe
Faulting module path: C:\WINDOWS\SYSTEM32\ntdll.dll
Report Id: 5b61df71-3ee7-4432-b84b-33251814127d
Faulting package full name: 
Faulting package-relative application ID: 

我希望 memset() 会触发 WER 并在该代码点终止进程。但是,取而代之的是 HeapFree()。我不太确定 HeapSetInformation() 是如何工作的。

你的问题不是如何破坏堆。你已经知道该怎么做了。您的问题是让 OS 注意到,以便您可以验证它是否有效。

为此,您需要破坏堆并调用堆函数直到破坏。很明显,最简单的方法是分配一个缓冲区,填充它并通过它,然后释放它。如果不知何故这不起作用,请再次尝试从您首先分配的指针中减去 32。