C 在没有驱动程序的情况下从用户模式读取内核内存
我正在编写一个程序,该程序枚举由C 在没有驱动程序的情况下从用户模式读取内核内存,c,windows,kernel,driver,C,Windows,Kernel,Driver,我正在编写一个程序,该程序枚举由SetWindowsHookEx()创建的钩子 使用GetProcAddress() 在gSharedInfo+8读取用户模式内存,结果应该是第一个句柄条目的指针。(工程,核实) 在[gSharedInfo]+8处读取用户模式内存,结果应该是要枚举的句柄的计数。(工程,核实) 从步骤2中获得的地址读取数据,重复count次 检查HANDLEENTRY.b type是否为5(这意味着它是一个HHOOK)。如果是,请打印信息 问题是,尽管步骤1-3只会搞乱用户模式内存
SetWindowsHookEx()
创建的钩子
GetProcAddress()
gSharedInfo+8
读取用户模式内存,结果应该是第一个句柄条目的指针。(工程,核实)[gSharedInfo]+8处读取用户模式内存,结果应该是要枚举的句柄的计数。(工程,核实)
count
次HANDLEENTRY.b type
是否为5(这意味着它是一个HHOOK)。如果是,请打印信息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。如何解决此错误
我的全部计划:
MSFT在windows XP之后未实施
NtSystemDebugControl
syscall。该漏洞使得在大多数Intel CPU上以大约500kB/s的速度从用户模式读取内核内存成为可能。这适用于大多数未打补丁的操作系统。您的程序是否具有SeDebugPrivilege权限?读取内核内存是防病毒程序想要阻止的事情。你确定这不是问题吗?是的,我有调试权限。我试图关闭杀毒软件,但没有帮助@User34660在Vista及更高版本上,无法从用户模式打开\Device\PhysicalMemory部分。我认为没有办法从应用程序左侧读取物理/内核内存。