使用Windbg及VirtualPC调试第三方驱动的简明步骤
1,配置VirtualPC
在VirtualPC中安装好GuestOS后,在该GuestOS的设置页面中找到COM1,然后参照图中的数据进行设置
(文字描述:选中Named Pipe,然后输入//./pipe/com_1)
2,配置GuestOS(当前指Win2k,XP,2003的配置方法)
在BOOT.ini中添加
multi(0)disk(0)rdisk(0)partition(1)/WINDOWS="Windows Server 2003, Standard" /noexecute=optout /fastdetect /debug /debugport=com1 /baudrate=115200
注意分区参数的设置,一般不需要变
3,配置Windbg
D:/Microsoft/windbg/windbg.exe -y D:/localSymbols;srv*D:/localSymbols*http://msdl.microsoft.com/download/symbols -k com:pipe,port=//./pipe/com_1 -Q
在Windbg的快捷方式中,设置[目标]为上面的数据(路径请注意修改)
4,启动OS,建立KD连接
启动GuestOS,选择调试选项并Enter,然后从刚设置好的WIndbg的Shortcut运行Windbg.
Windbg在与GuestOS连接后,会显示相关的连接成功的信息:
Connected to Windows Server 2003 3790 x86 compatible target, ptr64 FALSE
Kernel Debugger connection established.
Symbol search path is: D:/localSymbols;srv*D:/localSymbols*http://msdl.microsoft.com/download/symbols
Executable search path is:
Windows Server 2003 Kernel Version 3790 UP Free x86 compatible
Built by: 3790.srv03_sp1_rtm.050324-1447
Kernel base = 0x80800000 PsLoadedModuleList = 0x808a8e48
此时,可以按下Ctrl+Break键,中断OS,这时如果没有相关符号,Windbg会去M$的网站下载符号至D:/localSymbols,所以可能需要等一会儿.
中断后,显示KD>提示符
5,在DriveEntry上下断点
如果你要调试的驱动是Boot,System Start类型,那么你可在Windbg一旦与GuestOS建立KD Connection时,中断OS,将下断点,比如如果你的Driver的
名称是:drvdbgee.sys,可以如此下断:bu drvdbgee+EntryPoint(这个数字可以使用PE工具得到,比如PEID),bu $iment(drvdbgee),对于Windbg此时
也可能会去下载符号所以Prompt处会显示"Busy" :-)
6,载入Driver
手动载入Driver可以使用Kmdmanager.exe,Register->Run,然后在第5个下的断点就会被命中.
7,Do what you want to do
......
附录:
1,Windbg中使用BU下断点时会遍历整个Kernel Modules,然后去下载符号与BU中指定的名称匹配,所以会比较慢,
通常情况下,可以不要设置srv*D:/localSymbols*http://msdl.microsoft.com/download/symbols,在你认为需要下载符号时下载
2,常用的指令和类型及数据
nt!KeServiceDescriptorTableShadow
nt!KeServiceDescriptorTable ( 命令 dds poi(nt!KeServiceDescriptorTable) ,可以查看SSDT表 )
win32k!W32pServiceTable (=nt!KeServiceDescriptorTableShadow+0x10 , 命令 dds win32k!W32pServiceTable,可以查看Win32K的函数表 )
_IMAGE_NT_HEADERS --PE头
_UNICODE_STRING --Unicode string
_DRIVER_OBJECT --驱动对象
3,手动解析某个SSDT是否被HOOK,
dds poi(nt!KeServiceDescriptorTable)+0x4*0x80 ,其中0x4是SSDT入口项的大小,0x80是功能号,
如果没有HOOK,则应显示80827afc f8830300 nt!NtOpenProcess ,被HOOK的情况下显示 80827afc f8830300 drvdbgee+0x1300
4,手动解析某个Win32k的SSDT是否被HOOK,
dds win32k!W32pServiceTable+0x4*(0x114C-0x1000) , 其中是0x114C是功能号,该功能的Stub通常来USER32和GDI32
5,其他常用指令:
d* 显示数据,比如d, da, db, dc, dd
e 修改数据
bp 是下软件断点
u address 是从Address处反汇编
ba 下硬件访问,写入和执行断点
? 是计算表达式,比如 ? 0x4*(0x114C-0x1000)
.reload 载入模块,在有些模块看不到的情况下使用
通常使用的 .reload /f 强制载入模块及符号(模块多时会相当慢) .reload /s 载入模块但是不载入符号
快捷键F5->Run,F7->Run to cursor ,F10->Step over , F11->Step Into , SHIFT+F11 Step out
6,这个配置是与VMware相容的.
设置Pipe
配置Windbg
中断OS