2016-04-24 118 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的速度从用户模式读取内核内存成为可能。这适用于大多数未打补丁的操作系统。