【问题标题】:How to Intentionally cause Windows Heap Corruption?如何故意导致 Windows 堆损坏?
【发布时间】: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


【解决方案1】:

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

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

【讨论】:

  • 有趣的想法。但是,我应该删除这个问题,因为它没有受到好评吗?我不想污染 S.O.有不明确的问题,并有再次被禁止的风险。谢谢。
  • @vengy:删除问题对你没有帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多