我正在写列举由SetWindowsHookEx()
这里创建一个钩子程序的过程是:读取内核内存无需驱动
- 使用
GetProcAddress()
获得gSharedInfo
在User32.dll
出口(工程,验证) - 在
gSharedInfo + 8
处读取用户模式内存,结果应该是第一个句柄条目的指针。 (works,verified) - 读取用户模式内存在
[gSharedInfo] + 8
,结果应为count
的句柄枚举。 (works,verified) - 从步骤2中获取的地址读取数据,重复
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
您的程序是否具有SeDebugPrivilege特权?读取内核内存是防病毒程序想要防止的事情。你确定这不是问题吗? – user34660
是的,我确实有DEBUG特权。我试过关机防病毒,但没有帮助。 @ user34660 –