从 Linux 调试 Windows 内核
Posted
技术标签:
【中文标题】从 Linux 调试 Windows 内核【英文标题】:Debugging Windows Kernel from Linux 【发布时间】:2012-09-23 16:36:55 【问题描述】:我曾经使用 VirtualKD、WinDBG 和单个虚拟机来调试 Windows 内核。
最近我有一台 Linux 机器,现在我想知道 - 当您的主机无法运行 VirtualKD/WinDBG* 时,调试 Windows 内核的最简单方法是什么?
我假设该解决方案将需要两个虚拟机,但我宁愿在我的实际机器上托管两个实例,而不是将一个实例驻留在另一个虚拟实例中...
有没有办法让它工作?
提前致谢!
*出于稳定性原因,葡萄酒是最后的选择......
【问题讨论】:
【参考方案1】:解决了!基本上,我最终使用 两个 (VirtualBox) VMs 在 Unix 域套接字上模拟 串行连接(空调制解调器电缆) (在主机上)。欲了解更多信息,请阅读以下内容:
硬件设置*:
调试对象: 确保机器已关闭并编辑串行端口设置。 启用Port 1,并赋值如下:端口号:COM1,端口模式:主机管道,创建管道:未选中(客户端),端口/文件路径:/tmp/win_link。 调试器: 与上面相同(使用相同的路径),只是这次 Create Pipe 应该选中(服务器)。调试器设置:
运行 WinDBG 并按 Ctrl+K 调用内核调试。 在 COM 中,输入:波特率:115200,端口:COM1,重置:0 并验证 管道 和重新连接是否未选中(重要)。 您将看到以下输出:Opened \\\\.\com1 Waiting to reconnect...
调试对象设置:
在 /port com1 /baud 115200 /id 1 上运行 bootcfg /debug。要验证,请运行 bootcfg。** 重启。 在引导阶段的早期,另一台计算机上的 WinDBG 应该检测到被调试对象正在运行。*假设使用了 VirtualBox。 VMWare/KVM 用户可能会通过类似的步骤获得相同的结果。此外,有关更多信息,请参阅VirtualBox docs。
**假设客人是 Windows XP。以后的版本包括bcdedit,可以按照here的描述使用。
【讨论】:
您的配置看起来很完美,但无论我使用什么配置,我都看不到我的两个 Windows vm 上的串行端口。你有过这样的问题吗?【参考方案2】:对于 QEMU\KVM,请遵循以下说明: http://www.linux-kvm.org/page/WindowsGuestDrivers/GuestDebugging
【讨论】:
【参考方案3】:非常有用,但适用于 Windows XP 机器。如果需要在Linux主机上配置2台基于Windows7的虚拟机,可以参考以下链接:http://www.aldeid.com/wiki/Category:Digital-Forensics/Computer-Forensics/Debugger/Kernel
【讨论】:
【参考方案4】:现在的另一个选择是启用本地内核调试。这带有一些limitations,但它可以让您在仅使用一个 VM 时访问内核数据。
此方法仅适用于 Windows 8.0 和 Windows Server 2012 及更高版本。
按照以下步骤操作:
-
以管理员身份打开命令提示符窗口。
输入
bcdedit /debug on
如果计算机尚未配置为调试传输的目标,请输入bcdedit /dbgsettings local
重新启动计算机。
系统重新启动后,您可以将WinDBG
执行为Administrator
,按ctrl+k
或转到File -> Attach to kernel -> Local
并按OK。
此时,您将能够执行仅限内核的命令并访问内核结构:
在 Windows 10 和新的 WinDBG 版本(预览版)下测试。
参考:Setting Up Local Kernel Debugging of a Single Computer Manually
【讨论】:
这不是一个完整的调试设置。以上是关于从 Linux 调试 Windows 内核的主要内容,如果未能解决你的问题,请参考以下文章