在没有驱动程序的情况下从用户模式读取内核内存
Read Kernel Memory from user mode WITHOUT driver
我正在编写一个程序,它枚举由 SetWindowsHookEx()
创建的钩子这是过程:
- 使用
GetProcAddress()
获取 gSharedInfo
在 User32.dll
中导出(有效,已验证)
- 读取
gSharedInfo + 8
处的用户模式内存,结果应该是第一个句柄入口的指针。 (有效,已验证)
- 读取
[gSharedInfo] + 8
处的用户模式内存,结果应该是 count
要枚举的句柄。 (有效,已验证)
- 从第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
MSFT 在 windows XP 之后没有实现 NtSystemDebugControl
系统调用。
Meltdown 漏洞使得在大多数 Intel CPU 上以大约 500kB/s 的速度从用户模式读取内核内存成为可能。这适用于大多数未打补丁的 OS。
我正在编写一个程序,它枚举由 SetWindowsHookEx()
创建的钩子这是过程:
- 使用
GetProcAddress()
获取gSharedInfo
在User32.dll
中导出(有效,已验证) - 读取
gSharedInfo + 8
处的用户模式内存,结果应该是第一个句柄入口的指针。 (有效,已验证) - 读取
[gSharedInfo] + 8
处的用户模式内存,结果应该是count
要枚举的句柄。 (有效,已验证) - 从第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
MSFT 在 windows XP 之后没有实现 NtSystemDebugControl
系统调用。
Meltdown 漏洞使得在大多数 Intel CPU 上以大约 500kB/s 的速度从用户模式读取内核内存成为可能。这适用于大多数未打补丁的 OS。