如何故意导致Windows堆损坏?

问题描述 投票:0回答:2

我正在尝试使用值 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() 是如何工作的。

c windows winapi heap-corruption
2个回答
2
投票

您的问题不在于如何损坏堆。你已经知道该怎么做了。您的问题是让操作系统注意到,以便您可以验证它是否正常工作。

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


0
投票
int a; free(&a);

甚至

free((void* )(volatile void* )0x1);

可能会导致堆损坏。

由于标准库的高度优化特性,实现可能不会包含任何代码来检查

&a
(或 0x1)是否是系统分配器分配的内存地址,这显然可能真的令人困惑内存堆(特别是当执行内部碎片整理以合并相邻的空闲块时)。

© www.soinside.com 2019 - 2024. All rights reserved.