双机调试

使用 vmware + windows 10 虚拟机 和 VirtualKD工具进行调试

在Github的Releases下载后:

image-20250403133438951

得到如上内容,我们将 target64 放入虚拟机中。

image-20250406210435493

以管理员身份运行它,点击Install->确定->确定..

它会帮我们禁用签名,最后windows重新启动,在启动的时候,我们按下F8 选择如下内容启动

image-20250403133600123123

image-20250403132446614

启动后,我们在物理机(主机)上运行vmmon64.exe会得到如下内容,选择WinDbg Preview后点击Rundebugger

image-20250403132800695

会自动建立一个通道:如下

稍等一会儿后我们点击Go -> 虚拟机就能开机了。

image-20250403132809192

这个时候我们的双击调试就已经做好了。

双击调试基础操作

使用一些简单的指令

内存相关

1
dq , dd , dw ,db

d:display 展示,陈列

q:qword -> 64位整数 d:dword w:word b:byte

  • dd 0xaddress:显示从 0xaddress 开始的 DWORD 数据。
  • dq esp:显示当前栈指针(ESP)处的 QWORD 数据。
  • dw 0x12345678 L4:显示从 0x12345678 开始的 4 个 WORD 数据。
1
eq,ed,ew,eb

e:edit

这些指令都是用于修改指定地址位置上的数据

  • ed fffff800 52462e95 12345678:修改该位置上的值为12345678
1
!db,!dd,!dw,!dq
1
2
u :查看指令
u 地址

image-20250403225730835

1
2
3
r :显示寄存器
r rax :显示指定的寄存器
r rax=0 :修改寄存器

image-20250403231003627

1
2
3
s:搜索指令
s -b-d-q-w-a-u:搜索 指定的内容
s 范围 指定内容

image-20250403230910361

杂项

显示当前线程的调用堆栈(Call Stack)。

1
k 

image-20250403231243804

继续

1
gc/g  

用于显示某个结构体

1
dt

断点

1
2
bp:下断点 
bp NtOpenProcess

image-20250403231546933

1
bl :显示当前断点列表

image-20250403231743436

1
2
3
ba 硬件断点
ba r/w/e/i size addr
ba r4 ffffcf04ca890440
1
bu 下一个不知道的断点

在写驱动的时候bu

条件断点:一个if语法: “.if(){}.else{}”

1
bp NtOpenProcess ".if(@rdx=0x1000){}.else{gc}"

image-20250403232904281

第一个Hello Kernel

首先需要安装WDK和IDE,它将用于写驱动程序,这里我使用的是VS2022。

https://learn.microsoft.com/zh-cn/windows-hardware/drivers/download-the-wdk

因为写驱动的时候会使用很多函数API:https://learn.microsoft.com/zh-cn/;在官网查看他们的使用方法是最好的。

在安装完成后:选择“新建项目”–>“Empty”

image-20250406200549624

最后是“Hello Kernel”的代码块

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <ntifs.h>
#include <ntddk.h>
#include <intrin.h>

void drv_unload(PDRIVER_OBJECT)
{
//KdPrint(("bye bye"));
DbgPrintEx(77, 0, "bye bye \r\n");
}

EXTERN_C NTSTATUS DriverEntry(PDRIVER_OBJECT drv_obj, PUNICODE_STRING)
{
//KdPrint(("Hello world"));
DbgPrintEx(77, 0, "hello kernel \r\n");
drv_obj->DriverUnload = drv_unload;
return STATUS_SUCCESS;
}

在生成sys文件后,我们使用驱动加载程序(更方便)InstDrv:https://github.com/BeneficialCode/InstDrv

效果:

image-20250406200908182

操作系统相关概念

==windows 一切皆对象==

Process 进程

进程包括

  • 可执行程序
  • 私有的虚拟地址

虚拟地址—> paging –>RAM(RAM内存条)

Winddbg中查看进程

!process 查看当前附加进程

image-20250406212639126

!process 0 0 查看所有进程

image-20250406212822472

.process /i EPROCESS 【地址】来附加进程

image-20250406214019185

Thread 线程

KPCR

Kernel Processor Control Region

KPCR 是每个 CPU 内核私有的数据结构,是线程调度与 CPU 状态切换的重要基础

Kernel Processor Control Block

KPRCB 内部包含调度、DPC、线程相关信息

可以用dt 命令来查看

image-20250406215742031

句柄

句柄表:句柄到内核对象的查找

  • 句柄的值是4的倍数。除以4可以在句柄表中找到索引
  • 内核模式代码可以调用ObReferenceObjectByHandle函数从一个有效的句柄得到指针。

win的系统构架

image-20250406222721927