前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >使用Vagrant在几秒钟内调试内核

使用Vagrant在几秒钟内调试内核

原创
作者头像
franket
发布2021-01-05 10:35:13
2.8K0
发布2021-01-05 10:35:13
举报
文章被收录于专栏:技术杂记

所有Windows内核黑客(从初学者到专业人士)都知道,设置和管理用于内核调试的虚拟机可能很耗时。Vagrant是一个免费的开源工具,可以自动创建和自动化VM。这篇文章将向您介绍Vagrant,以及如何利用其功能自动执行我们的内核调试设置。

Vagrant允许您将虚拟机视为“一次性”,因为可以自动删除它们并重新创建它们。然后,您可以轻松地在多台计算机上设置一致的VM,与其他人共享它们,甚至将您的虚拟机部署到AWS等云提供商。

本指南将假定您已经安装了Vagrant和虚拟机监控程序。您可以在此处下载Vagrant

Vagrant支持的虚拟机管理程序包括:

  • VirtualBox(推荐)
  • 的VMware
  • 超V

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文​​档,您必须:

  • 为虚拟机管理程序安装来宾工具。
  • 确保将虚拟网络适配器配置为专用网络。
  • 完全禁用UAC。
  • 禁用复杂密码。
  • 禁用关机跟踪器。

此外,必须使用WinRM启用远程管理,以允许Vagrant在VM中执行脚本。为此,请在提升的命令提示符下执行以下命令:

代码语言:javascript
复制
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

完成这些任务后,就完成了设置框的操作,因此应该关闭电源。请注意,此时不应配置内核调试,因为框应该是可重用的基础映像,而不是出于特定目的。

现在回到您的主机,让我们实际创建一个盒子。

代码语言:javascript
复制
vagrant package --base Win10LTSCBase --output windows.box
vagrant box add invokestatic/win10ltsc windows.box

您需要更改参数以适合您的环境,包括更改VM名称(“ Win10LTSCBase”)以及输出框名称(“ invokestatic / win10ltsc”)。这将创建我们刚刚创建的虚拟机的“快照”,并将其打包到名为的框中invokestatic/win10ltsc

开始

现在我们的盒子已经设置好了,让我们充分利用它。首先,Vagrantfile在包含以下内容的空目录中创建一个:

您必须稍微修改一下此文件以满足您的需要,尤其是win10.vm.box名称以及可能的内核调试端口。

代码语言:javascript
复制
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虚拟机内配置内核调试选项。

代码语言:javascript
复制
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是将要部署的驱动程序的名称。它应该位于项目目录的根目录中。

代码语言:javascript
复制
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具有以下内容的批处理文件:

代码语言:javascript
复制
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

执行后,此脚本将按以下顺序进行:

  1. 启动VM(如果不存在则创建它)
  2. 部署并启动驱动程序
  3. 附加WinDbg
  4. WinDbg关闭时停止VM

非常漂亮!现在,我们已经完全自动化了内核调试设置,仅需几秒钟即可进入调试器。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
作者已关闭评论
0 条评论
热度
最新
推荐阅读
目录
  • 准备基础图像(框)
  • 开始
  • 附加调试器
  • 自动化驱动程序部署
  • “秒”部分
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档