Windows 双机调试、驱动开发

ʕ •̀ o •́ ʔ

1 Windows 10双机PD搭建调试

被调试系统:Windows x86 21H2

主机:Windows 10 x64 21H2

在被调试系统里:

  1. 设置系统调试选项

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    // 1.设置端口1(该处的“1”,对应com接口1)
    bcdedit /dbgsettings serial baudrate:115200 debugport:1

    // 2.复制开机选项(这里我命名为:"DebugMe",可任意修改)
    bcdedit /copy {current} /d DebugMe

    // 3.增加开机引导项(ID填写上一条命令生成的字符串)
    bcdedit /displayorder {current} {ID}

    // 4.激活debug(ID填写上上一条命令生成的字符串)
    bcdedit /debug {ID} ON
  2. 关机。

  3. 设置-硬件-添加串行口-com1-客户端。

  4. 设置单核。

主机:

  1. 关机。设置-硬件-添加串行口-com1-服务器。
  2. 开机。在Windbg快捷方式右键设置启动参数:"C:\Program Files (x86)\Windows Kits\10\Debuggers\x86\windbg.exe" -b -k com:port=com1,baud=115200,reconnect -y。
  3. Clash梯子搭好
    • Profiles:到GlaDOS复制链接粘贴后,点击Download,然后选择刚下载的配置。
    • General:勾选“System proxy”、“Start with Windows”,并记好“Port”是多少。
    • Edge浏览器直接测试Google能否访问。
  4. Windows环境变量,在用户变量下添加
    • 在本地先随便建立一个空文件夹,如C:\Symbolsx86。
    • _NT_SYMBOL_PATH:C:\Symbolsx86。
    • _NT_SYMBOL_PROXY:127.0.0.1:Port。
  5. 打开Windbg,设置符号路径srv*C:\Symbolsx86*https://msdl.microsoft.com/download/symbols。
    • 关闭防火墙。
    • 设置符号链接:.sympath srv*C:\Symbolsx86*https://msdl.microsoft.com/download/symbols(https不是http)。
    • Windbg命令行输入:!sym moisy(查看下载时的日志)。
    • Windbg命令行输入:.reload /f。查看C:\Symbolsx86已经下载好了一些.pdb符号了(如果一次不成功就重启Windbg,多试几次),可以时不时的进行reload。

参考:双机内核调试入门。

2 VS 2019 开发驱动环境安装

本机系统版本:Windows 10 教育版本,版本号21H2,内部版本19044.1889。安装步骤参考:https://docs.microsoft.com/zh-cn/windows-hardware/drivers/other-wdk-downloads

  1. 安装 VS 2019(安装 Visual Studio 时,选择“使用 C++ 的桌面开发”工作负载。 Windows 10 软件开发工具包 (SDK) 会自动包括在内,并显示在右侧的“摘要”窗格中。)所以在安装VS 2019时选中如下图。

    1.png

  2. 打开VS 2019,找到如下图,进去之后安装下面第二个图的组件,参考vs2019+wdk10开发 xp, win7, win10 驱动。

    2.png

    3.png

  3. 安装 WDK,注意安装的 WDK 版本要和 SDK 版本一致。如下图在“控制面板-卸载程序”找到第一步安装 VS 2019 时安装的 SDK 版本。然后到其他 WDK 下载安装如下第二图的 WDK。

    4.png

    5.png

  4. 安装好 WDK 后,点击“Close”前,勾选上安装 WDK 的扩展,然后会安装 WDK VS(这个东西就是让每次使用VS 2019创建项目时能够选择创建驱动程序),如果没有自动安装,可以到存放 WDK 得目录下找到WDK.vsix双击安装—vs2017安装驱动环境,安装wdk.vsix插件采坑指南。

  5. 安装好 WDK 后,到“控制面板-卸载程序”查看 WDK 和 SDK 版本是否对应上,如上面第二张图都是10.0.19041.685。

3 开发 Windows 10 平台 x64 驱动

  1. 新建Empty WDM Driver项目。

  2. 在“Resource Files”右键添加新建项,新建 .c文件。

  3. 修改项目属性:

    1. 项目属性-Driver setting-General-Target OS Version:Windows 10,Target Platform:Desktop。

      6.png

    2. 项目属性-Inf2Cat-General-Run Inf2Cat:否。

      7.png

    3. 项目属性-Driver Sining-General-Sign Mode:Off(Windows 10:Test Sign)。

      8.png

    4. 项目属性-C/C++-常规-警告等级:3,将警告视为错误:否。

      9.png

    5. 项目属性-链接器-常规-将链接器警告视为错误:否。

      11.png

    6. WDM 模式开发驱动报错:*error 1297: Device driver does not install on any devices, use primitive driver if this is intended.*。

      删除 Driver Files—.inf 文件如下内容:

      1
      2
      3
      4
      [Manufacturer]
      %ManufacturerName%=Standard,NT$ARCH$

      [Standard.NT$ARCH$]
    7. 禁用驱动数字签名!!!!!!参考:win10虚拟机环境下运行驱动程序

      按下win+i 组合键打开windows 设置,点击“更新和安全”;
      2、找到恢复,点击“高级启动”下的“立即重启”,重启电脑;通过点击 开始菜单 ,按下shift 点击 电源 – 重启可达到同样效果;
      3、重启win10后在高级界面选择“疑难解答”;
      4、选择“高级选项”;
      5、接着点击“启动设置”;
      6、点击重启,会进入到启动设置界面;
      出现如下这个界面,再按F7键则禁用签名成功,不过以上的步骤只能临时的禁用驱动数字签名,重启后失效,需要永久禁止的话各位还是需要研究一下第一种方案

    8. DbgView无法输出!!

    9. 不要包含 windows.h 头文件。

    10. Ntifs.h 包含 Ntddk.h,而 Ntddk.h 又包含 Wdm.h。

关于 DebugView 输出:

  1. 在 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SessionManager 下新建文件夹 Debug Print Filter。
  2. 新建键值对:Default: 0xF。
  3. 管理员模式运行 DebugView :勾选上 Capture Kernel 和 Enable VerBose Kernel Output。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <ntddk.h>

VOID DriverUnload(PDRIVER_OBJECT pDriver)
{
UNREFERENCED_PARAMETER(pDriver);
DbgPrint("Goodbye~\n");
}

NTSTATUS DriverEntry(PDRIVER_OBJECT pDriver, PUNICODE_STRING pRegPath)
{
UNREFERENCED_PARAMETER(pRegPath);

pDriver->DriverUnload = DriverUnload;

DbgPrint("Hello Driver!\n");

return STATUS_SUCCESS;
}

4 在项目中创建文件夹

  1. 创建项目。

  2. 项目—显示所有文件。或点击下面图标。

    11.png

  3. 选中项目—右键—添加—新建文件夹(不是选中解决方案)。

    12.png

  4. 在新建的文件夹中新建文件即可。

  5. F7 编译,然后就可以在本地文件目录中看到新的文件夹和文件了。

    13.png

  6. 以后凡是新建文件夹/文件都需要切换到显示所有文件的模式下。

5 将 .pdb 中的符号导入 IDA

有两种方法将微软在 .pdb 中提供的调试符号导入到 IDA。

  1. 方法一:使用 IDA 自带的工具。

    使用 IDA 自带的工具,如目标设备是 64 位: /dbgsrv/win64_remote64.exe。在目标系统上运行该程序之前,需要在环境变量中中添加:

    • 变量名:_NT_SYMBOL_PATH 。
    • 变量值:C:\Symbolsx64\ntkrnlmp.pdb\87A327C6C356B7E2BAC1D75E779701651(C:\Symbolsx64\ntkrnlmp.pdb\87A327C6C356B7E2BAC1D75E779701651/ntkrnlmp.pdb)。

    然后再 IDA 中:File——Load file——PDB file。

    这种方式导入的符号不完整,有时候在 IDA 中添加结构类型时,会识别不到,推荐使用方法二。

  2. 方法二:使用工具Symbol Type Viewer,有两种常用的方式。

    • 一种是生成 C 语言的头文件 xxx.h。
    • 一种是生成 IDA 用的脚本文件 xxx.idc。

    进行如下配置:

    77.png

    生成如下文件:

    78.png

    将生成的文件导入 IDA 中:

    • .h 文件:File——Load file——Parse C header file。
    • .idc 文件:File——Script file。