为什么 SWAPGS 指令后 GS 段选择器值没有变化?(Windows 内核调试)

Why does GS segment selector value does not change after SWAPGS instruction? (windows kernel debugging)

提问人:yahel abraham 提问时间:8/30/2023 更新时间:8/30/2023 访问量:51

问:

我正在尝试了解内核的工作原理,在此过程中,使用 WinDbg,我在“swapgs”和“lfence”指令之后在页面错误处理程序上放置了一个断点: 页面错误处理程序 在我恢复执行和 WinDbg 中断后,GS 值保持不变 (0x2B)。

我尝试使用 rdmsr 读取“MSR_KERNEL_GS_BASE”(0xC0000102),并检查 GS:[9018h] 周围的内存,但它未初始化:GS 的内存

(我还尝试将物理地址转换为虚拟地址(!ptov 0xDB3A0CF018),认为可能是这种情况,但没有成功。 然而,在单步执行后,位测试指令设置了进位标志。

现在,我错过了什么? 为什么 GS 不在 WinDbg 中更新? 为什么无法读取 MSR 中 GS 周围的内存? 在“bt dword ptr gs:[9018h], 1”的情况下,幕后发生了什么? 有没有办法读取正在测试的内核内存?

调试 内核 windbg windows-kernel msr

评论

0赞 Community 8/31/2023
请澄清您的具体问题或提供其他详细信息以准确说明您的需求。正如目前所写的那样,很难确切地说出你在问什么。
0赞 Thomas Weller 8/31/2023
请不要发布 WinDbg 输出的图像。WinDbg 生成文本,可在此处插入,格式化为代码。
0赞 Neitsa 8/31/2023
使用 Windbg 读取 GS MSR 非常不可靠(例如,如果您在 CPL3 上下文中并读取MSR_GS_BASE,您可能会获得内核地址,或者相反,使用 MSR_KERNEL_GS_BASE)。GDT 条目也不可靠,因为它依赖于英特尔手册所述的“隐藏描述符字段”(与 GS MSR 相关)。获取 GS 段基础的最佳方法是使用 or 命令。它们都输出(内核处理器控制区域)的地址,该地址应由 GS 指向。请注意,它是按处理器而不是系统范围的。? @$pcr!pcr_KPCR

答: 暂无答案