我正在寫列舉由SetWindowsHookEx()
這裏創建一個鉤子程序的過程是:讀取內核內存無需驅動
- 使用
GetProcAddress()
獲得gSharedInfo
在User32.dll
出口(工程,驗證) - 在
gSharedInfo + 8
處讀取用戶模式內存,結果應該是第一個句柄條目的指針。 (works,verified) - 讀取用戶模式內存在
[gSharedInfo] + 8
,結果應爲count
的句柄枚舉。 (works,verified) - 從步驟2中獲取的地址讀取數據,重複
count
次 - 檢查
HANDLEENTRY.bType
是否爲5(表示它是HHOOK)。如果是這樣,打印信息。
問題是,雖然步驟1-3只是弄亂用戶模式內存,但步驟4需要程序讀取內核內存。經過一番研究,我發現ZwSystemDebugControl
可以用來從用戶模式訪問內核內存。所以我寫了以下功能:
BOOL GetKernelMemory(PVOID pKernelAddr, PBYTE pBuffer, ULONG uLength)
{
MEMORY_CHUNKS mc;
ULONG uReaded = 0;
mc.Address = (UINT)pKernelAddr; //Kernel Memory Address - input
mc.pData = (UINT)pBuffer;//User Mode Memory Address - output
mc.Length = (UINT)uLength; //length
ULONG st = -1;
ZWSYSTEMDEBUGCONTROL ZwSystemDebugControl = (ZWSYSTEMDEBUGCONTROL)GetProcAddress(
GetModuleHandleA("ntdll.dll"), "NtSystemDebugControl");
st = ZwSystemDebugControl(SysDbgCopyMemoryChunks_0, &mc, sizeof(MEMORY_CHUNKS), 0, 0, &uReaded);
return st == 0;
}
但是上面的功能沒有用。 uReaded
始終爲0,st
始終爲0xC0000002。我如何解決這個錯誤?
我的完整方案: http://pastebin.com/xzYfGdC5
您的程序是否具有SeDebugPrivilege特權?讀取內核內存是防病毒程序想要防止的事情。你確定這不是問題嗎? – user34660
是的,我確實有DEBUG特權。我試過關機防病毒,但沒有幫助。 @ user34660 –