windbg

windbg配置符号表

环境:winxp sp3/win7

将安装windbg的目录添加进环境变量,默认安装路径是C:\Program Files\Debugging Tools for Windows (x86),如果是默认安装,就把这个目录添加进path环境变量。
新建环境变量_NT_SYMBOL_PATH,值为

1
SRV*c:\Symbols* http://msdl.microsoft.com/download/symbols

启动windbg载入可执行文件时,windbg就会在C盘下建立一个Symbols文件夹,从微软服务器获取相应符号表。也可以离线下载在Symbols文件夹里。
Download-Symbol
尝试打开一个可执行文件,windbg显示如下信息

1
Symbol search path is: SRV*c:\Symbols* http://msdl.microsoft.com/download/symbols

windbg双机调试

google搜索或者必应国外版搜索ida windbg debug kernel就有文档提供参考,远程连接linux等主机使用的是网络链接的ip,而windbg调试内核则是使用的串口,网上也有很多这方面的资料。说一下自己是怎么调试的:
ida + VirtualKD + windbg:在主机安装VirtualKD,VirtualKD里的target目录复制到虚拟机下,启动target目录里的vminstall.exe,这时候虚拟机重启会有一个调试选项,打开主机安装VirtualKD的位置,启动vmmon或者vmmon64,选中对应的虚拟机,同时注意pipe名称,比如kd_winxp,一会儿会用到。
如果使用windbg调试,只需要发送windbg的快捷方式到桌面,修改属性->目标,windbg.exe后面加上 -k com:port=\.\pipe\kd_winxp,pipe,这个kd_winxp就是vmmon里的管道名称,运行windbg,连接即可成功,进入内核模式,ctrl + break中断,输入命令。
如果使用ida调试,打开ida,Debugger->attach->windbg debugger,管道名称同上,com:port=\.\pipe\kd_winxp,pipe,设置options,在specific options里面更换成kernel mode,同时指定windbg安装目录,新版ida要在ida目录下的cfg->ida.cfg的669行,更改信息如下(我的主机):

1
DBGTOOLS = "C:\\Program Files (x86)\\Debugging Tools for Windows (x86)"; //设置windbg安装的目录

以上都设置好以后,点击ok,等待一会就好了。如果长时间处于reconnect状态,连接不上,ida假死,就是串口设置的问题了,这个问题网上搜索一下就好,如果设置的是serial port1,串口是serial port2就会有问题,虚拟机就把打印机移除就好。

windbg常用命令

g 运行

bp + address 设置断点
bl 显示已经设定的断点
bu DriverName!DriverEntry 驱动入口下断点
bc 清除断点
ba r/w 1/2/4 address 在address处下内存访问断点,读,写
bp $exentry 伪寄存器$exentry,记录程序入口点

ld kernel32 加载kernel32模块的符号
lm 显示所有模块
ln 显示最近操作过的模块

db/dw/dd/dq address 查看某地址处1,2,4,8字节
dd address L100 L100这种写法通用,查看从address开始的100个4字节
dt nt!_EPROCESS 查看结构

eb/ew/ed/eq/ef/ep address Values 修改某地址处值

.kill 杀死调试进程
.restart 重新调试

k(n) 显示调用堆栈

u 反汇编地址处代码

? 0x33 + 0x44 运行后将得到计算和

s -b/w/d/q/a/u range target 搜索内存,从某地址处搜索target
s -a 0x400000 L10000 “wrong” 搜索ascii的”wrong”

windbg进入驱动入口

对于无符号的驱动程序,bu DriverName!DriverEntry这种方法下断行不通,从nt!IopLoadDriver某处下断,然后进入DriverEntry,下断的位置因操作系统的不同而不同
Windows XP SP2:nt!IopLoadDriver+0x669
Windows XP SP3:nt!IopLoadDriver+0x66A
Win7 32 professional: nt!IopLoadDriver+0x7e9(不一定准确,本机某一次测试是这个位置)
如何让WinDbg断在驱动的入口处