【发布时间】:2021-11-10 01:38:41
【问题描述】:
我正在尝试使用值 HeapEnableTerminationOnCorruption 测试 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() 是如何工作的。
【问题讨论】:
-
因此,您不仅需要破坏堆(您的代码肯定会这样做),还需要以某种特定方式破坏堆,从而导致该特定错误行为。也许你想澄清你的标题。
-
我期待某种堆损坏,然后 HeapSetInformation() 会检测到它,启动 Windows 错误报告服务并终止进程。但是,它没有。
-
我没想到这种机制能够神奇地检测到各种堆损坏。它可能会执行一些特定的检查(例如检查某些位置的哨兵或校验和),而您的测试可能碰巧不会触发。
-
是的。另外我有一个暗示,也许它已经是检测损坏堆的默认设置?感谢您的想法。
-
要在溢出点检测溢出,请使用 Application Verifier 启用 PageHeap。
标签: c windows winapi heap-corruption