Windbg双机调试配置
前言:从这篇文章开始我们将进入windows内核的利用教程,目的是和JS引擎中的漏洞配合起来,组成一条利用链,内核的漏洞可以做到一个提升用户权限的效果,以达到更大程度的利用效果。
Windbg调试配置
说明:
目标机(debuggee machine): Hype-V中的虚拟机
主机(debugger machine): Windbg所在机器
由于本次教程涉及到windows7和windows10,所以这两个版本的操作系统在虚拟机中都需要配置
Windows11双机网络调试:
本人踩坑:
手动通过bcdedit配置一堆,添加启动项,然后配置dbgsettings,开启debug选项,配置网卡,等等,最终没成功
最终解决:
利用kenet.exe自动完成配置相应的hostip和port(此处hostip为debugger的ip,port为debugger中监听的端口号),并在windbg中设置后打开windbg.exe,接着重启一下目标机,在Hype-V管理器->虚拟网络适配器管理中添加一个外部网络适配器,计为kd,将网络适配器的NET模式改为Kd模式,即可进行调试
目标机中上不了网的问题:在Hype-V管理器中为目标机添加网络适配器,并配置静态ip,即可s
1 | netsh interface ip set address "以太网 N" static [IP地址] [子网掩码] [网关] |
目的:将名为“以太网 N”的网卡配置为静态ip
再配置dns:
netsh interface ip set dns “以太网 N” static 8.8.8.8
windows7串口调试:
非常简单,就只用运行命令
1 | C:\Windows\system32>bcdedit /copy {current} /d "Kernel Debugging On" |
然后在虚拟机中的系统配置->引导->修改Kernel Debugging On启动项的调试端口(com)和波特率(1152000)
再在虚拟机管理器上hype-V或VM Ware 上对应的com上添加为命名管道,并且起一个名字,再在windbg上通过com连接,填入对应的名字就行。
windows7配网:
配置windows 7的网络时,首先需要在hype-V中给该虚拟机添加一个虚拟网络适配器,并选上NAT模式,(因为在宿主机上打印ipconfig,发现192.168.137.1对应的是Ethernet(NAT)所以我猜是要改成NAT),然后在目标机上对应的网卡配置静态ip和dns即可
Windows7配置HEVD,OSRLoader,ghidra
直接在GitHub上下载.zip即可,然后解压下来后就会有HEVD.sys文件,再安装osrloader,并加载这个sys文件即可
然后在主机上的windbg中加载符号,并验证HEVD符号是否成功加载即可(这里注意路径问题,还需要把整个文件copy到主机对应的路径中)
.sympath SRVC:\Symbolshttps://msdl.microsoft.com/download/symbols;C:\projects\hevd\build\driver\vulnerable\x64
对于ghidra:下载后需要配置java,再打开.bat文件,即可,再新建项目,加载HEVD.sys即可
在windbg中加载HEVD.pdb符号:
1.首先lm m H*检查模块信息中是否输出HEVD服务
2.设置路径:
设置微软服务器符号:.sympath SRVC:\symbolshttps://msdl.microsoft.com/download/symbols
添加额外的路径:.sympath+ C:\projects\hevd\build\driver\vulnerable\x86
3.加载符号:!sym noisy 启动调试日志 .reload /f HEVD.sys 加载符号
a4.验证符号:x HEVD!*
注:在调试过程过遇到偏移量不对的问题,例如dt _EPROCESS 0x86980d40指令有可能默认选定的符号信息是基于ntdll(ntdll!前缀,用户态dll,适用于windows10/11所以应该将该指令改为dt nt! _EPROCESS 0x86980d40(nt!前缀,内核结构体,适用于本系统windows)
Windbg常用调试命令:
| 命令 | 功能 | 典型应用场景 |
|---|---|---|
k L5 |
显示调用栈(限制帧数) | 快速查看崩溃上下文 |
u |
反汇编代码 | 分析崩溃点的汇编指令 |
bu |
设置延迟绑定断点 | 在符号未加载时预先设置断点 |
bl |
列出所有断点 | 检查断点状态或删除无效断点 |
| r | 查看当前寄存器的值 | 查看当前寄存器的值 |
| .frame 0n0 | 切换到调用栈的第 0 帧(即当前执行的函数帧) | 在分析崩溃或断点触发时,定位到最相关的栈帧 |
| dv /t /v | 显示当前栈帧中的局部变量(display variables),并附加类型和地址信息 | /t 附加类型信息 /v 附加地址信息 |
| locals | 显示局部变量(需符号) | 调试函数内部逻辑 |
| dd rsp L1 | 查看栈顶的4字节值 | 分析栈操作或返回地址 |
| dS | 显示ANSI字符串 | 查看字符串参数或缓冲区 |
!thread |
显示当前线程的详细信息,包括线程对象地址、所属进程、TEB(线程环境块)、栈信息等 | |
dd fs:[0x124] L1 |
dd:以 DWORD 格式显示内存。 fs:[0x124]:从 FS 段寄存器偏移 0x124 处读取内存(x86 内核模式下指向 _KTHREAD)。 L1:仅显示 1 个 DWORD(4 字节)。 |
|
dg @fs |
显示 FS 段寄存器的段描述符信息(基址、长度、权限等)。 | |
| dt_KPCR | dt(即display type)显示 _KPCR(处理器控制区)的结构定义,包括字段偏移和类型。 |
|
| dt _KTHREAD 0x867095b0 | 显示指定地址(0x867095b0)的 _KTHREAD 结构内容。 |
|
| bc n | 移除n号断点 | |
| t | 单步执行汇编指令 | |
| F10/P | 步过 | |
| F8/t | 步入 | |
| shift+F11/gu | 返回到上层call执行 | |
| dx -id 0,0,87a95918 -r1 (*((ntdll!_KPRCB *)0x807ca120)) | dx:WinDbg 的高级数据表达式计算器。 -id 0,0,87a95918:指定调试会话和进程/线程上下文。 (*((ntdll!_KPRCB *)0x807ca120)):将地址 0x807ca120 强制转换为 _KPRCB 结构并显示。 -r1:递归展开 1 层。 |
|
| ep <地址> <值> | 在指定内存地址处写入一个 指针宽度(32位/64位) 的数据 | |
| dp <地址> | 从指定地址开始,以 指针宽度(32位/64位) 显示内存内容 |
- Title: Windbg双机调试配置
- Author: zhaojunqi
- Created at : 2025-06-22 16:58:39
- Updated at : 2025-10-17 17:30:51
- Link: https://redefine.ohevan.com/2025/06/22/Windbg双机调试配置/
- License: This work is licensed under CC BY-NC-SA 4.0.