龙空技术网

Win10上进行内核开发和调试的系统设置步骤

爱编程的鬼鲛 131

前言:

现在姐妹们对“win10用debug命令”可能比较关切,咱们都需要分析一些“win10用debug命令”的相关文章。那么小编也在网络上汇集了一些对于“win10用debug命令””的相关内容,希望你们能喜欢,咱们快快来学习一下吧!

软硬件环境准备

本文详细介绍了如何设置主机系统和用于 Windows 内核驱动程序开发和调试的 Hyper-V guest VM。可自动完成大部分设置的 PowerShell 脚本可供下载。你需要一个主机系统(台式机或笔记本电脑),CPU 必须支持硬件虚拟化、至少 8GB 内存和至少 50GB 可用磁盘空间。CPU 的速度必须足以运行至少一个虚拟机而不会降低性能。虚拟化软件将使用 Windows 10 专业版和企业版内置的 Hyper-V。你要开发的内核驱动程序将仅在客户虚拟机(VM)内运行。因此,你的主机系统不会受到任何负面影响。下图显示了主机系统、Hyper-V 平台和客户虚拟机之间的关系。

主机与VM关系图

主机系统(Host System)设置主机系统

主机系统上必须安装最新版本的 Windows 10 64 位专业版或企业版,并应用最新更新。

网络访问

主机系统必须有可靠的互联网接入,调试器才能从微软的公共符号服务器下载符号。gust 虚拟机不会连接互联网,将设置为仅主机联网模式。

源代码编辑

Windows 驱动程序开发涉及 C/C++ 编程。因此,必须在主机系统上安装一个合适好用的源代码编辑器。你可以选择使用自己喜欢的源代码编辑器。如果已习惯使用 Visual Studio Code,可以下载适用于 Windows 7、8 和 10 的 Visual Studio Code 64 位系统安装程序,并使用默认设置运行安装程序。(下载页面:)

企业级 Windows 驱动程序工具包 (EWDK)

EWDK 包含在 Windows 上构建和调试内核软件驱动程序所需的所有工具。下载带有 Visual Studio Build Tools 16.7 的 Windows 10 EWDK 2004 版,并将 .ISO 文件的内容解压缩到 c:\EWDK 文件夹中。EWDK 使用 XCOPY 部署,因此无需安装。文档其余部分中的说明假定你已使用的是 EWDK,并且它在 c:\EWDK 中可用。

Windows Debugger

下载安装WinDbg,并保持默认设置。(下载地址:)

调试符号设置

在cmd.exe窗口中运行以下命令,设置调试器从微软公共符号服务器下载符号的环境变量。

setx _NT_SYMBOL_PATH SRV*c:\symbols*
Hyper-V设置

注意: 下面的步骤已使用 PowerShell 脚本自动完成。脚本将创建一个名称为 WINLABVM 的 Hyper-V Gen 2 虚拟机。如果你喜欢不同的名称,可以编辑脚本指定您选择的虚拟机名称。如果这样做,请在本文档中引用 WINLABVM 的所有步骤中使用相同的名称。如果希望继续使用此脚本创建和配置虚拟机,请将 Create-VM-WINLABVM.ps1 下载到主机。在管理 PowerShell 命令窗口中运行该脚本,然后继续执行后面的步骤。(脚本下载地址: )

启用Hyper-V

要创建和运行 Hyper-V 虚拟机,必须启用 Windows 10 的 Hyper-V 功能,该功能在 Windows 10 的专业版和企业版中都有提供。可以通过在管理 PowerShell 命令窗口中运行以下命令来实现。

Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V -All
Hyper-V RDP 访问

你将花费大量时间在内核调试器中调试 Hyper-V guest VM。在这段时间里,客户虚拟机将处于停滞状态,因此任何连接到客户虚拟机的 RDP 会话都会超时并断开。因此,必须关闭 Hyper-V 中的 "增强会话模式"。这可以通过在管理 PowerShell 命令窗口中运行以下命令来实现。

Set-VMHost -EnableEnhancedSessionMode $False
Hyper-V虚拟交换机配置

在进行安全研究时,客户虚拟机必须处于可预测的状态。安装客户操作系统后,不得应用 Windows 更新。确保不应用 Windows 更新的一种方法是阻止客户虚拟机连接互联网。不过,客户虚拟机必须在网络上才能与主机系统共享文件。Hyper-V 提供了 "内部网络 "虚拟交换机,允许访客与主机联网。该交换机可使用自动专用 IP 地址(APIPA)(即 169.254.X.Y 范围内的 IP 地址)促进 Hyper-V guest 与 Hyper-V host 之间的通信。在管理 PowerShell 命令窗口中运行以下命令即可创建 "内部网络 "虚拟交换机。网络交换机已命名为 LABNET。

New-VMSwitch -SwitchName "LABNET" -SwitchType Internal

避免添加任何 "外部网络 "虚拟交换机,因为它们可能会导致某些 DHCP 服务器出现问题。

Hyper-V VM配置

你需要一个至少有 2 个虚拟 CPU、2GB 虚拟内存和 30GB 虚拟硬盘的客户虚拟机。你必须配置虚拟网络适配器连接到 "内部网络 "虚拟交换机,关闭客户虚拟机 BIOS 中的 UEFI 安全引导,并配置虚拟机从 Windows 10 可启动 ISO 映像启动。要在 Hyper-V 中创建这样一个虚拟机,请在管理 PowerShell 命令窗口中运行以下一组 PowerShell 命令。Hyper-V 虚拟机的名称设置为 WINLABVM。你可以根据需要自定义变量 $vmname、$switch、$vhdpath 和 $isopath。

$vmname = "WINLABVM"br$switch = "LABNET"$vhdpath = (Get-VMHost).VirtualHardDiskPath + $vmname + ".vhdx"$isopath = $env:userprofile + '\Downloads\en_windows_10_business_editions_version_20h2_x64.iso'$pipename = "\\.\pipe\" + $vmnamerNew-VHD -Dynamic -SizeBytes 30GB -Path $vhdpathNew-VM -Name $vmname -MemoryStartupBytes 2GB -Generation 2 -SwitchName $switch -VHDPath $vhdpath$dvddrive = Add-VMDvdDrive -VMName $vmname -Path $isopath Set-VM -VMName $vmname -AutomaticCheckpointsEnabled $False -CheckpointType Standard -StaticMemory -ProcessorCount 2Set-VMFirmware -VMName $vmname -EnableSecureBoot Off -BootOrder $dvddriveSet-VMCOMPort -VMName $vmname -Number 1 -Path $pipenameSet-VMVideo -VMName $vmname -ResolutionType Maximum -HorizontalResolution 1280 -VerticalResolution 720
连接虚拟机控制台

由于已禁用增强会话模式,因此必须通过本地控制台连接虚拟机。这可以通过在管理 PowerShell 或 CMD 命令窗口中运行以下命令来实现。

vmconnect.exe localhost WINLABVM
启动虚拟机

此时可以启动虚拟机,让它从 Windows 可启动 ISO 映像启动,开始 Windows 安装过程。这可以通过在管理 PowerShell 命令窗口中运行以下命令来实现。

Start-VM WINLABVM
虚拟机客户系统客户端系统安装

从操作系统安装映像(.ISO)在客户虚拟机中安装最新的 Windows 10 64 位专业版或企业版。您可以从 MSDN 平台订阅者下载或 Microsoft 评估中心获取此 .ISO。(下载地址:), Windows 无需激活。试用版 Windows 也可以正常运行。设置用户账户时,请指定密码,因为 Windows 不允许使用没有密码的账户访问共享文件夹。

安装VM脚本下载

下载地址: , 下载完成后,在PowerShell中通过以下命令安装:

$vmcreds = Get-CredentialbrInvoke-command -VMName WINLABVM -Credential $vmcreds -FilePath Setup-VM-WINLABVM.ps1
启用 PowerShell 脚本执行

你需要在客户虚拟机中运行 PowerShell 脚本(.ps1)。因此,必须在客户虚拟机的管理 PowerShell 命令窗口中运行以下命令,以启用脚本执行。

Set-ExecutionPolicy -ExecutionPolicy Unrestricted -Scope CurrentUser -Force
启用文件和打印共享

作为驱动程序开发工作流程的一部分,你需要将文件从主机复制到客户虚拟机。因此,必须为公共网络配置文件启用 Windows 防火墙 "文件和打印机共享 "规则,这些规则应已自动分配给虚拟机中的网络接口。要启用显示组 "文件和打印机共享 "的所有防火墙规则,请在客户虚拟机的管理 PowerShell 命令窗口中运行以下命令。

Set-NetFirewallRule -Group "@FirewallAPI.dll,-28502" -Profile Public -Enabled true
设置共享文件夹

在客户虚拟机中创建 c:\pub 文件夹。在客户虚拟机的管理 PowerShell 命令窗口中运行以下命令,与主机共享该文件夹。

New-Item -ItemType "directory" -Path "c:\pub"brNew-SmbShare -Name "pub" -Path "c:\pub" -FullAccess "Everyone"
设置调试符号路径

由于客户端虚拟机无法连接互联网,调试器和客户端虚拟机中其他工具所需的二进制文件的符号必须从主机手动复制到 c:\pub 文件夹。环境变量 _NT_SYMBOL_PATH 必须配置为指向客户机中的 c:\pub\sym。

[System.Environment]::SetEnvironmentVariable('_NT_SYMBOL_PATH', "SRV*c:\pub\sym", 'Machine')
Windows Defender 排除

作为驱动程序开发工作流程的一部分,你需要将从主机向客户虚拟机复制可能被 Windows Defender 阻止的工具。因此,必须将共享文件夹 c:\pub 添加到 Windows Defender 的扫描排除路径列表中。为此,可以在客户 VM 的管理 PowerShell 命令窗口中运行以下命令。

Add-MpPreference -Exclusion Path "c:\pub"
内核调试配置

通过内核调试器检查系统是驱动程序开发工作流程中不可或缺的一部分。必须通过引导配置数据库 (BCD) 对客户虚拟机进行内核调试配置。下面列出的命令使用 BCDEDIT 创建了三个不同的启动管理器配置文件:

(1).原始 "配置文件未启用任何调试设置。

(2). testsign "配置文件启用了测试签名。

(3).调试器 "配置文件启用了内核调试,是默认配置文件。

内核调试配置为通过 COM1 串行端口以 115200 的波特率工作。以下命令必须在客户虚拟机的管理 CMD 提示下运行,用于配置

系统进行实时内核调试。

bcdedit.exe /copy {current} /d "Windows 10 [original]"brbcdedit.exe /set {current} testsigning ONbrbcdedit.exe /copy {current} /d "Windows 10 [testsign]"brbcdedit.exe /debug {current} ONbrbcdedit.exe /set {current} description "Windows 10 [debugger]"brbcdedit.exe /dbgsettings serial debugport:1 baudrate:115200brbcdedit.exe /set {current} recoveryenabled Nobrbcdedit.exe /set {current} bootstatuspolicy IgnoreAllFailures
调试信息设置

在内核驱动程序中,我们将调用经典的内核 API DbgPrint() 在内核调试器中显示信息。要让内核调试器显示这些信息,必须在注册表中设置相应的 "调试打印过滤器"。要启用此注册表设置,请在客户虚拟机的管理 PowerShell 命令窗口中运行以下命令。

New-Item -Path 'HKLM:\SYSTEM\CurrentControlSet\Control\Session Manager' -Name 'Debug Print Filter'New-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\Control\Session Manager\Debug Print Filter' -Name 'DEFAULT' -Type DWORD -Value 0xffffffff
不可屏蔽中断配置

在客户虚拟机的管理 PowerShell 命令窗口中运行以下命令,配置客户机在收到主机中断 (NMI) 时进行错误检查。

New-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\Control\CrashControl' -Name 'NMICrashDump' -Type DWORD -Value 1
系统内存转储设置

在客户虚拟机的管理 PowerShell 命令窗口中运行以下命令,配置客户操作系统以保留内存转储、关闭错误检查期间的自动重启、生成完整的内存转储以及始终允许创建内存转储。

New-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\Control\CrashControl' -Name 'AlwaysKeepMemoryDump' -Type DWORD -Value 1Get-WmiObject Win32_OSRecoveryConfiguration | Set-WmiInstance -Arguments @{ AutoReboot=$False }Get-WmiObject Win32_OSRecoveryConfiguration | Set-WmiInstance -Arguments @{ DebugInfoType=1 }Get-WmiObject Win32_OSRecoveryConfiguration | Set-WmiInstance -Arguments @{ OverwriteExistingDebugFile=$True }
增加分页文件大小

关闭系统管理的分页文件,增加分页文件的大小,以容纳完整的系统内存转储。

Get-CimInstance Win32_ComputerSystem | Set-CimInstance -Property @{AutomaticManagedPagefile=$false}Get-CimInstance Win32_PageFileSetting | Set-CimInstance -Property @{InitialSize=2064;MaximumSize=2064}
重命名客户操作系统

安装时,Windows 会自动为客户虚拟机分配一个自动生成的计算机名称。考虑到你会经常使用这个计算机名称将文件从主机复制到客户机,最好将客户机的计算机名称更改为更容易记住的名称。在客户机虚拟机的管理 PowerShell 命令窗口中运行以下命令,即可将客户机的 SMB 名称更改为 WINLABVM。先不要重启客户机虚拟机。

Rename-Computer -NewName "WINLABVM"
安装验证共享文件夹验证

通过尝试从主机访问 \169.254.X.Y\pub,验证共享("pub")是否可从主机系统访问。其中,169.254.X.Y 是内部虚拟网络交换机分配给客户机的 APIPA IP 地址。你可以通过在客户虚拟机的 PowerShell 命令窗口中运行以下命令来获取该 IP 地址。

Get-NetIPAddress -AddressFamily Ipv4 | Select-Object InterfaceAlias, IPv4Address
测试内核调试设置

在主机系统上,以管理权限启动 WinDBG Preview。下载工作区设置文件 WINLABVM.debugtarget。点击 "文件"->"打开工作区",加载工作区文件 WINLABVM.debugtarget。该工作区文件将配置 WinDBG 连接到命名为 WINLABVM 的管道,该管道映射到客户虚拟机的串行端口 COM1。如果你为串行端口使用了不同的管道名称,请更改 WINLABVM.debugtarget 中的以下一行。

<Property name="ConnectionString" value="com:port=\\.\pipe\WINLABVM,baud=115200,pipe,reconnect" />

重新启动客户虚拟机。启动客户虚拟机时,确保 WinDBG 在主窗口中显示 "已建立内核调试器连接"。这表明 WinDBG 与客户虚拟机中的内核调试端口 (KDCOM.dll) 成功连接。

恭喜您,你已经成功完成了构建、部署、测试和调试内核模式驱动程序所需的所有设置步骤。

标签: #win10用debug命令 #window10 debug #window10debug命令