我試圖測驗Windows API HeapSetInformation的值HeapEnableTerminationOnCorruption,試圖創建一個例外代碼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()的呼叫產生了一個例外。
故障應用程式名稱: memory-map.exe,版本。0.0.0.0, 時間戳。0x61412573
故障模塊名稱:ntdll.dll,版本。10.0.19041.1110, 時間戳。0x8a32a22a,時間戳:0x8a32a22a。
例外代碼。0xc0000374,例外代碼:0xc0000374。
故障偏移。0x000e6c23
故障行程的ID。0x8218 故障行程ID:0x8218
發生故障的應用程式的啟動時間。0x01d7a9ba304122bd
出錯的應用程式路徑。C:UsersJohnsource
eposmemory-mapReleasemory-map.exe
故障模塊路徑。c:windowssystem32
tdll.dll
報告編號。5b61df71-3ee7-4432b84b-33251814127d
故障包的全稱。
故障包相對于應用程式的ID。
我希望memset()會觸發WER并在該代碼點終止行程。但是,相反,它是HeapFree()。我真的不確定HeapSetInformation()是如何作業的。
uj5u.com熱心網友回復:
你的問題不在于如何破壞堆。你已經知道如何做到這一點。你的問題是讓作業系統注意到,這樣你就可以驗證它是否作業。
要做到這一點,你需要破壞堆并呼叫堆函式,直到它被破壞。顯然,最簡單的方法是分配一個緩沖區,將其填滿并很好地過去,然后釋放它。如果這個方法不奏效,再試一次,從你第一次分配得到的指標中減去32。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/331310.html
標籤:
