所有Windows内核黑客(从初学者到专业人士)都知道,设置和管理用于内核调试的虚拟机可能很耗时。Vagrant是一个免费的开源工具,可以自动创建和自动化VM。这篇文章将向您介绍Vagrant,以及如何利用其功能自动执行我们的内核调试设置。
Vagrant允许您将虚拟机视为“一次性”,因为可以自动删除它们并重新创建它们。然后,您可以轻松地在多台计算机上设置一致的VM,与其他人共享它们,甚至将您的虚拟机部署到AWS等云提供商。
本指南将假定您已经安装了Vagrant和虚拟机监控程序。您可以在此处下载Vagrant。
Vagrant支持的虚拟机管理程序包括:
Hyper-V提供程序在网络功能方面有很多缺陷,因此,如果可能,建议使用任何其他管理程序平台。我将在本指南中使用VirtualBox。
Vagrant有一个“盒子”的概念,它实际上是最小的磁盘映像,理想情况下,它仅包含启动时的绝对最小值,而无需安装其他程序。这些框构成了我们可以通过外壳脚本构建的虚拟机模板。
您可以使用Vagrant Cloud中的一个框来节省大量时间。但是,如果找不到符合您规格的预制盒子,请继续。
默认情况下,Vagrant提供了一个Ubuntu盒子,但是由于我们对Windows感兴趣,因此对我们来说实际上没有任何用处。Vagrant Cloud是由其他用户创建的公开可用盒子的Web服务,并且有几个Windows盒子可用。如果这些内容足以满足您的用例,请务必继续使用云中准备好的盒子。但是,如果您需要更多控制权,那么创建自己的盒子是您唯一的选择。幸运的是,这并不难。
首先创建一个新的虚拟机。选择安装操作系统并分配适当数量的磁盘空间所需的最小RAM数量-大约50GB应该足够,但是请确保它是动态分配的。您还需要附加以NAT模式配置的虚拟NIC 。我已选择Windows 10 LTSC 2019 Evaluation作为我的客户机操作系统,因此一旦创建了VM,请插入安装ISO的虚拟磁盘。启动虚拟机并运行正常的安装过程,但是一旦创建了用户帐户,请确保将用户名指定为“ vagrant ”,密码为“ vagrant ”。
安装完操作系统并启动到桌面后,还有几项任务需要完成。根据Vagrant文档,您必须:
此外,必须使用WinRM启用远程管理,以允许Vagrant在VM中执行脚本。为此,请在提升的命令提示符下执行以下命令:
winrm quickconfig -q
winrm set winrm/config/winrs @{MaxMemoryPerShellMB="512"}
winrm set winrm/config @{MaxTimeoutms="1800000"}
winrm set winrm/config/service @{AllowUnencrypted="true"}
winrm set winrm/config/service/auth @{Basic="true"}
sc config WinRM start= auto
完成这些任务后,就完成了设置框的操作,因此应该关闭电源。请注意,此时不应配置内核调试,因为框应该是可重用的基础映像,而不是出于特定目的。
现在回到您的主机,让我们实际创建一个盒子。
vagrant package --base Win10LTSCBase --output windows.box
vagrant box add invokestatic/win10ltsc windows.box
您需要更改参数以适合您的环境,包括更改VM名称(“ Win10LTSCBase”)以及输出框名称(“ invokestatic / win10ltsc”)。这将创建我们刚刚创建的虚拟机的“快照”,并将其打包到名为的框中invokestatic/win10ltsc
。
现在我们的盒子已经设置好了,让我们充分利用它。首先,Vagrantfile
在包含以下内容的空目录中创建一个:
您必须稍微修改一下此文件以满足您的需要,尤其是win10.vm.box
名称以及可能的内核调试端口。
Vagrant.configure("2") do |config|
config.vm.guest = :windows # tell Vagrant this is a Windows-based guest
config.vm.communicator = "winrm" # use winrm for management instead of ssh
config.winrm.password = "vagrant" # the credentials specified during OS install
config.winrm.username = "vagrant"
config.vm.define "win10" do |win10|
win10.vm.box = "invokestatic/win10ltsc" # edit this to be the name of the box you created
win10.vm.provision "shell", path: "guest/kdbg.bat" # this batch file will be run inside the VM
win10.vm.network :forwarded_port, guest: 49152, host: 49152 # expose kernel debugging port to host
end
end
创建一个名为的新目录guest
,该目录将存储将在来宾内部运行的脚本。在此目录中,创建kdbg.bat
具有以下内容的文件。这使我们能够在首次创建VM时在guest虚拟机内配置内核调试选项。
bcdedit /debug on
bcdedit /dbgsettings net hostip:192.168.56.1 port:49152 key:1.1.1.1
copy C:\vagrant\guest\onboot.bat C:\onboot.bat
schtasks /create /sc onstart /tr "C:\onboot.bat" /tn vagrantonboot /ru SYSTEM /f
shutdown /r /t 0
您可以根据需要更改这些设置,但是通常仅在可以帮助的情况下使用网络调试。您可以更改端口和密钥,但请注意,如果更改端口,则还需要更新中的端口转发Vagrantfile
。如果需要调试Windows 7或更早版本,则需要配置COM调试,Vagrant可以实现,但本指南未介绍。
一切设置完成后,继续并vagrant up
在您的项目目录中运行。这将使用中指定的所有设置创建一个新的VM Vagrantfile
。
片刻之后,应该创建并运行您的VM,并在启用内核调试的情况下对其进行完全设置。通过按键Ctrl + K
并指定端口49152,可以将WinDbg连接到主机上1.1.1.1
。
如果一切都按计划进行,那么您应该会受到连接内核调试会话的欢迎!
如果您要做的只是逐步执行Windows代码,那么一切都很好。但是您可能正在尝试调试内核驱动程序。幸运的是,Vagrant自动将项目目录中的所有文件映射到中C:\vagrant
,因此您可以将驱动程序文件拖放到该目录中,并且来宾将自动使用该文件。
请注意,由于此映射是作为网络共享实现的,因此Windows内核无法从中加载驱动程序,因此在加载之前,必须将其复制到C:
驱动器上的某个位置。这也可以自动化。
在guest
目录中,创建onboot.bat
具有以下内容的文件:
MyDriver.sys
是将要部署的驱动程序的名称。它应该位于项目目录的根目录中。
sc stop MyDriver
sc delete MyDriver
sc create MyDriver binPath= "C:\Windows\System32\drivers\MyDriver.sys" type= kernel
copy C:\vagrant\MyDriver.sys C:\Windows\System32\drivers
sc start MyDriver
这会将驱动程序文件从项目目录复制到系统驱动程序目录,创建新服务并加载它。我们kdbg.bat
创建一个Windows任务计划程序任务,该任务将在启动时运行以执行此任务。
最后,我们创建一个批处理文件以自动执行VM创建,驱动程序部署和调试器附件。在根目录中,创建一个start-debugger.bat
具有以下内容的批处理文件:
start vagrant up & vagrant powershell --command "schtasks /run /tn vagrantonboot"
"C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\windbg.exe" -k net:port=49152,key=1.1.1.1
vagrant halt -f
执行后,此脚本将按以下顺序进行:
非常漂亮!现在,我们已经完全自动化了内核调试设置,仅需几秒钟即可进入调试器。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。