C 节省扫描windows内核内存(0xffff0800`00000000-0xffffffff`FFFFFF)

C 节省扫描windows内核内存(0xffff0800`00000000-0xffffffff`FFFFFF),c,windows,kernel,driver,C,Windows,Kernel,Driver,我正在寻找一种快速且(崩溃)可靠的方法,从windows内核驱动程序扫描整个分配的系统内核内存(范围为0xFFFF08000000000-0xFFFFFFFFFFFF)。 我试图列出VAD树实体(如windbg中的“!VAD”)并扫描相关部分,但似乎并非所有部分都列在树中。有没有办法列出整个分配的系统内存地址范围,这样我就可以用下面的代码扫描它们 inline BOOLEAN CompareByteArray(const BYTE* pData, const BYTE* bMask, const

我正在寻找一种快速且(崩溃)可靠的方法,从windows内核驱动程序扫描整个分配的系统内核内存(范围为0xFFFF08000000000-0xFFFFFFFFFFFF)。 我试图列出VAD树实体(如windbg中的“!VAD”)并扫描相关部分,但似乎并非所有部分都列在树中。有没有办法列出整个分配的系统内存地址范围,这样我就可以用下面的代码扫描它们

inline BOOLEAN CompareByteArray(const BYTE* pData, const BYTE* bMask, const char* szMask)
{
    for (; *szMask; ++szMask, ++pData, ++bMask)
        if (*szMask == 'x' && *pData != *bMask)
            return 0;

    return (*szMask) == 0;
}

UINT64 FindPattern(const UINT64 dwAddress, const UINT64 dwLen, const BYTE* bMask, const char* szMask)
{
    for (UINT64 i = 0; i < dwLen; i++)
        if (CompareByteArray((BYTE*)(dwAddress + i), bMask, szMask))
            return (UINT64)(dwAddress + i);

    return 0;
}
内联布尔比较器字节数组(常量字节*pData,常量字节*bMask,常量字符*szMask)
{
对于(;*szMask;++szMask,++pData,++bMask)
如果(*szMask=='x'&&&pData!=*bMask)
返回0;
返回(*szMask)==0;
}
UINT64 FindPattern(常量UINT64 dwAddress、常量UINT64 dwLen、常量字节*bMask、常量字符*szMask)
{
对于(UINT64 i=0;i
编辑#1:
我必须对内存进行实时扫描(每次扫描不到一分钟),我只搜索内核内存空间中的静态值,如字符串/代码签名。

你可以强制使用死亡蓝屏,让你的windows创建一个完整的内核内存转储文件并读取该文件。PS在线内核无法读取自身,因为这样会产生无限循环。或者至少,在它试图阅读自己的那一刻,它已经被替换了。