在没有驱动程序的情况下从用户模式读取内核内存

Read Kernel Memory from user mode WITHOUT driver

我正在编写一个程序,它枚举由 SetWindowsHookEx() 创建的钩子这是过程:

  1. 使用 GetProcAddress() 获取 gSharedInfoUser32.dll 中导出(有效,已验证)
  2. 读取gSharedInfo + 8处的用户模式内存,结果应该是第一个句柄入口的指针。 (有效,已验证)
  3. 读取 [gSharedInfo] + 8 处的用户模式内存,结果应该是 count 要枚举的句柄。 (有效,已验证)
  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

MSFT 在 windows XP 之后没有实现 NtSystemDebugControl 系统调用。

Meltdown 漏洞使得在大多数 Intel CPU 上以大约 500kB/s 的速度从用户模式读取内核内存成为可能。这适用于大多数未打补丁的 OS。