从 Linux 调试 Windows 内核

Posted

技术标签:

【中文标题】从 Linux 调试 Windows 内核【英文标题】:Debugging Windows Kernel from Linux 【发布时间】:2012-09-23 16:36:55 【问题描述】:

我曾经使用 VirtualKDWinDBG 和单个虚拟机来调试 Windows 内核。

最近我有一台 Linux 机器,现在我想知道 - 当您的主机无法运行 VirtualKD/WinDBG* 时,调试 Windows 内核的最简单方法是什么?

我假设该解决方案将需要两个虚拟机,但我宁愿在我的实际机器上托管两个实例,而不是将一个实例驻留在另一个虚拟实例中...

有没有办法让它工作?

提前致谢!

*出于稳定性原因,葡萄酒是最后的选择......

【问题讨论】:

【参考方案1】:

解决了!基本上,我最终使用 两个 (VirtualBox) VMsUnix 域套接字上模拟 串行连接(空调制解调器电缆) (在主机上)。欲了解更多信息,请阅读以下内容:

硬件设置*:

调试对象: 确保机器已关闭并编辑串行端口设置。 启用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 内核的主要内容,如果未能解决你的问题,请参考以下文章

读书笔记

linux内核源码级调试

Linux内核分析-使用gdb跟踪调试内核从start_kernel到init进程启动

跟踪调试Linux内核的启动过程

ubuntu下linux内核源码阅读工具和调试方法总结

构建调试Linux内核网络代码的环境MenuOS系统