我正在编写一个程序,它枚举了SetWindowsHookEx()
创建的钩子,下面是这个过程:
GetProcAddress()
获取在User32.dll
中导出的gSharedInfo
(工作,验证)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
总是0xC00002。如何解决此错误?
我的完整程序:http://pastebin.com/xzYfGdC5
发布于 2016-04-28 07:00:20
微软没有在windows之后实现NtSystemDebugControl
系统。
发布于 2018-01-22 01:48:06
熔毁漏洞使得在大多数Intel CPU上以大约500 to /s的速度从用户模式读取内核内存成为可能。
https://stackoverflow.com/questions/36826680
复制相似问题