我正在编写一个程序来枚举由SetWindowsHookEx()
创建的钩子。这是一个过程:
GetProcAddress()
获取gSharedInfo
中导出的User32.dll
(有效,已验证)gSharedInfo + 8
读取用户模式内存,结果应该是第一个句柄条目的指针。 (工作,验证)[gSharedInfo] + 8
读取用户模式内存,结果应为count
枚举句柄。 (工作,验证)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
答案 0 :(得分:3)
MSFT在Windows XP之后没有实现NtSystemDebugControl
系统调用。
答案 1 :(得分:1)
Meltdown漏洞使得在大多数Intel CPU上以大约500kB / s的速度从用户模式读取内核内存成为可能。这适用于大多数未修补的操作系统