2016-04-24 119 views
4

我正在寫列舉由SetWindowsHookEx()這裏創建一個鉤子程序的過程是:讀取內核內存無需驅動

  1. 使用GetProcAddress()獲得gSharedInfoUser32.dll出口(工程,驗證)
  2. gSharedInfo + 8處讀取用戶模式內存,結果應該是第一個句柄條目的指針。 (works,verified)
  3. 讀取用戶模式內存在[gSharedInfo] + 8,結果應爲count的句柄枚舉。 (works,verified)
  4. 從步驟2中獲取的地址讀取數據,重複count
  5. 檢查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

+0

您的程序是否具有SeDebugPrivilege特權?讀取內核內存是防病毒程序想要防止的事情。你確定這不是問題嗎? – user34660

+0

是的,我確實有DEBUG特權。我試過關機防病毒,但沒有幫助。 @ user34660 –

回答

3

MSFT沒有實施後Windows XP的系統調用NtSystemDebugControl

+0

在Vista和更新版本上,\ Device \ PhysicalMemory部分無法從用戶模式打開。我認爲沒有辦法從應用程序中讀取物理/內核內存。 –

0

Meltdown漏洞使得在大多數Intel CPU上以大約500kB/s的速度從用戶模式讀取內核內存成爲可能。這適用於大多數未打補丁的操作系統。