我正在编写一个程序,它枚举了 SetWindowsHookEx() 创建的钩子,下面是这个过程:
SetWindowsHookEx()
GetProcAddress()
User32.dll
gSharedInfo
gSharedInfo + 8
[gSharedInfo] + 8
count
HANDLEENTRY.bType
问题是,虽然步骤1-3只处理用户模式内存,但是步骤4需要程序读取内核内存。经过一些研究,我发现 ZwSystemDebugControl 可以用来从用户模式访问内核内存。因此,我编写了以下函数:
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