首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >从没有驱动程序的用户模式中读取内核内存

从没有驱动程序的用户模式中读取内核内存
EN

Stack Overflow用户
提问于 2016-04-24 17:40:28
回答 2查看 2.2K关注 0票数 4

我正在编写一个程序,它枚举了SetWindowsHookEx()创建的钩子,下面是这个过程:

  1. 使用GetProcAddress()获取在User32.dll中导出的gSharedInfo (工作,验证)
  2. gSharedInfo + 8读取用户模式内存,结果应该是第一个句柄条目的指针.(工程,核实)
  3. [gSharedInfo] + 8读取用户模式内存,结果应该是要枚举的句柄的count.(工程,核实)
  4. 从步骤2中获得的地址读取数据,重复count次数
  5. 检查HANDLEENTRY.bType是否为5(这意味着它是HHOOK)。如果是的话,打印信息。

问题是,虽然步骤1-3只处理用户模式内存,但是步骤4需要程序读取内核内存。经过一些研究,我发现ZwSystemDebugControl可以用来从用户模式访问内核内存。因此,我编写了以下函数:

代码语言:javascript
复制
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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-04-28 07:00:20

微软没有在windows之后实现NtSystemDebugControl系统。

票数 3
EN

Stack Overflow用户

发布于 2018-01-22 01:48:06

熔毁漏洞使得在大多数Intel CPU上以大约500 to /s的速度从用户模式读取内核内存成为可能。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36826680

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档