从用户模式读取内核内存,无需驱动程序

时间:2016-04-24 17:40:28

标签: c windows kernel driver

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

  1. 使用GetProcAddress()获取gSharedInfo中导出的User32.dll(有效,已验证)
  2. gSharedInfo + 8读取用户模式内存,结果应该是第一个句柄条目的指针。 (工作,验证)
  3. [gSharedInfo] + 8读取用户模式内存,结果应为count枚举句柄。 (工作,验证)
  4. 从步骤2中获取的地址读取数据,重复count
  5. 检查HANDLEENTRY.bType是否为5(这意味着它是HHOOK)。如果是这样,请打印信息。
  6. 问题是,虽然步骤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

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:1)

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