Windows11 25H2下NtQuerySystemInformation返回ImageBase为0,无权限如何获取内核基址?
Windows 11 25H2 用户态获取ntoskrnl.exe基址问题解决方案
问题背景
在Windows 10及Windows 11 23H2之前的版本中,通过NtQuerySystemInformation(SystemModuleInformation, buf, size, &size)可正常获取ntoskrnl.exe的运行时基址,但在Windows 11 25H2(Build 26200)中,该API返回STATUS_SUCCESS且能正确枚举模块路径,却将所有模块的ImageBase字段置为0x0000000000000000。同时EnumDeviceDrivers和NtQuerySystemInformation(SystemModuleInformationEx)也出现相同问题。
原因分析
微软在Windows 11 25H2及后续版本中,对用户态程序获取内核模块基址进行了明确限制,这是内核安全加固措施的一部分——通过隐藏内核内存地址,减少用户态程序利用内核地址实施恶意操作(如提权、内存篡改等)的可能性。
可行替代方案(无管理员权限)
1. 获取静态默认基址(非运行时实际地址)
如果你的场景可以接受使用ntoskrnl.exe的静态默认加载基址,可通过以下步骤实现:
- 调用
GetSystemDirectory获取系统目录路径,拼接出ntoskrnl.exe的完整路径(例如C:\Windows\System32\ntoskrnl.exe)。 - 读取该文件的PE结构,解析
IMAGE_NT_HEADERS中的OptionalHeader.ImageBase字段,得到编译时指定的默认基址。 - 注意:该值并非内核运行时的实际加载地址(内核ASLR会随机化实际地址),仅适用于不需要动态运行时地址的场景。
2. 无管理员权限下获取运行时基址的限制
目前没有公开的文档化API可以在无管理员权限的用户态下获取ntoskrnl.exe的运行时实际基址。微软的安全策略已经封堵了这类用户态访问路径,任何非文档化的方法都可能存在兼容性问题,且违反微软的安全规范,不建议使用。
管理员权限下的可选方法(仅供参考)
如果你的工具可以获取管理员权限,可尝试通过以下方式获取运行时基址:
- 使用
NtQuerySystemInformation的SystemKernelDebugInformation类(需管理员权限),但该接口未公开,且可能在后续版本中被移除。 - 通过读取
\\.\Kdcom设备等调试相关接口,但这类方法属于未公开的内部实现,稳定性和兼容性无法保证。
内容的提问来源于stack exchange,提问作者Haider Mustafa
相关产品推荐
相关产品推荐

