By xikug.xp
版本:1.0
作者:xIkUg/RCT
xikug.xp [at] gmail [dot] com
我常去的网站:
由于我没有物理的两台机器,因此我这里使用虚拟机来进行讲解(虚拟机真是个好东西)。我将先讲述如何设置,然后以一个实例来讲述如何进行内核驱动的调试。
Target环境:
Virtual PC 2004、Win2000 sp 4 en
Host环境:
WinXP sp2, WinDBG 6.6.07.5, SUDT SerialNull 1.6 试用版
一) 设置篇
SUDT SerialNull是一个虚拟串口软件,用于模拟RS232串口的虚拟连接,SerialNull 可以在不占用真实串口的情况下,创建任意数量并互为连接的纯虚拟串口对。
我们将用这个软件虚拟一个串口对出来供Host与Target使用。
如图:
![使用WinDBG进行双机内核调试 - lgjmfyx - lgjmfyx的博客 使用WinDBG进行双机内核调试 - lgjmfyx - lgjmfyx的博客](http://www.pediy.com/bbshtml/bbs8/pediy8-437.files/image001.png)
电脑书籍$网
我们虚拟了一个串口对,COM2-COM3,这对串口是联通的。
在VirtualPC中设置:
![使用WinDBG进行双机内核调试 - lgjmfyx - lgjmfyx的博客 使用WinDBG进行双机内核调试 - lgjmfyx - lgjmfyx的博客]()
进行入虚拟机系统(Win2k),打开boot.ini文件,添加一行,如下:
multi(0)disk(0)rdisk(0)partition(1)\WINNT=”Microsoft Windows 2000 Professional” /fastdetect /debug /debugport=com1 /baudrate=115200
意思是以Debug模式起动系统,调试端口为COM1,波特率为115200
重新以Debug模式启动系统:
![使用WinDBG进行双机内核调试 - lgjmfyx - lgjmfyx的博客 使用WinDBG进行双机内核调试 - lgjmfyx - lgjmfyx的博客](http://www.pediy.com/bbshtml/bbs8/pediy8-437.files/image005.png)
在Host端,启动WinDBG,选File->Kernel Debug…,COM页,在BaudRate输入115200,Port输入我们建立的虚拟串口对的COM2口,钩上Reconnected:
![使用WinDBG进行双机内核调试 - lgjmfyx - lgjmfyx的博客 使用WinDBG进行双机内核调试 - lgjmfyx - lgjmfyx的博客](http://www.pediy.com/bbshtml/bbs8/pediy8-437.files/image007.png)
点击“OK”之后在COMMAND窗口出现:
Opened \\.\com2
Waiting to reconnect…
此时按Ctrl+Break,会出现如下画面:
![使用WinDBG进行双机内核调试 - lgjmfyx - lgjmfyx的博客 使用WinDBG进行双机内核调试 - lgjmfyx - lgjmfyx的博客](http://www.pediy.com/bbshtml/bbs8/pediy8-437.files/image009.png)
调试器显示:“Connected to Windows 2000 2195 x86 compatible target, ptr64 FALSE”,此时代表连接目标成功,处于中断状态,我们
可以在File->Symbol File Path…中设置符号路径,我习惯于使用Symbol Server,因此我在这里设置了:
SRV*f:\symbols*http://msdl.microsoft.com/download/symbols
到此时我们的双机调试环境搭建完成。此环境已经可以工作了。
二) 实例讲解
接着上面的步骤,我将以一个软件做为实例进行讲解,做为练习目标的软件是国产软件,在此隐去软件名称,我使用A软件代替。
在command窗口输入:G,此命令跟SoftICE中的G一样,让程序继续运行。
将A软件安装在虚拟机中,安装完成后,运行A软件,进入注册界面,此时我们在WinDBG中再次按Ctrl+Break,让Target中断下来,A软件的注册算法在驱动程序snbus.sys中DeviceControl例程中(为什么在snbus中的DeviceControl例程中,请自行跟踪应用程序并查看DDK的相关文档就知道了,这里的重点不是Crack软件,而是讲内核驱动的调试),在Command窗口中输入:
!drvobj snbus 2
!drvobj命令类似于SoftICE中的driver命令,用于显示驱动对象的相关信息,具体的用法请参看WinDBG的帮助文档,当我们输入!drvobj snbus 2时,我们将得到这个驱动的Dispatch routines信息:
kd> !drvobj snbus 2
Driver object (81454a70) is for:
\Driver\SnBus
Dispatch routines:
[00] IRP_MJ_CREATE f7353aa0 +0xf7353aa0
[01] IRP_MJ_CREATE_NAMED_PIPE 80423f0c nt!IopInvalidDeviceRequest
[02] IRP_MJ_CLOSE f7353aa0 +0xf7353aa0
[03] IRP_MJ_READ 80423f0c nt!IopInvalidDeviceRequest
[04] IRP_MJ_WRITE 80423f0c nt!IopInvalidDeviceRequest
[05] IRP_MJ_QUERY_INFORMATION 80423f0c nt!IopInvalidDeviceRequest
[06] IRP_MJ_SET_INFORMATION 80423f0c nt!IopInvalidDeviceRequest
[07] IRP_MJ_QUERY_EA 80423f0c nt!IopInvalidDeviceRequest
[08] IRP_MJ_SET_EA 80423f0c nt!IopInvalidDeviceRequest
[09] IRP_MJ_FLUSH_BUFFERS 80423f0c nt!IopInvalidDeviceRequest
[0a] IRP_MJ_QUERY_VOLUME_INFORMATION 80423f0c nt!IopInvalidDeviceRequest
[0b] IRP_MJ_SET_VOLUME_INFORMATION 80423f0c nt!IopInvalidDeviceRequest
[0c] IRP_MJ_DIRECTORY_CONTROL 80423f0c nt!IopInvalidDeviceRequest
[0d] IRP_MJ_FILE_SYSTEM_CONTROL 80423f0c nt!IopInvalidDeviceRequest
[0e] IRP_MJ_DEVICE_CONTROL f7353b1a +0xf7353b1a
[0f] IRP_MJ_INTERNAL_DEVICE_CONTROL 80423f0c nt!IopInvalidDeviceRequest
[10] IRP_MJ_SHUTDOWN 80423f0c nt!IopInvalidDeviceRequest
[11] IRP_MJ_LOCK_CONTROL 80423f0c nt!IopInvalidDeviceRequest
[12] IRP_MJ_CLEANUP 80423f0c nt!IopInvalidDeviceRequest
[13] IRP_MJ_CREATE_MAILSLOT 80423f0c nt!IopInvalidDeviceRequest
[14] IRP_MJ_QUERY_SECURITY 80423f0c nt!IopInvalidDeviceRequest
[15] IRP_MJ_SET_SECURITY 80423f0c nt!IopInvalidDeviceRequest
[16] IRP_MJ_POWER f735065e +0xf735065e
[17] IRP_MJ_SYSTEM_CONTROL f7354db8 +0xf7354db8
[18] IRP_MJ_DEVICE_CHANGE 80423f0c nt!IopInvalidDeviceRequest
[19] IRP_MJ_QUERY_QUOTA 80423f0c nt!IopInvalidDeviceRequest
[1a] IRP_MJ_SET_QUOTA 80423f0c nt!IopInvalidDeviceRequest
[1b] IRP_MJ_PNP f7354590 +0xf7354590
rtytry
我们找到了
[0e] IRP_MJ_DEVICE_CONTROL f7353b1a +0xf7353b1a
知道DeviceControl例程的入口在0xf7353b1a处,于是我们在0xf7353b1a处设下断点,在Command窗口中输入:
bp 0xf7353b1a
bp指令相当于softice的bpx,后面跟“地址”即可在指定地址设下断点,具体用法请参加WinDBG的帮助。
输入G,让Target继续跑起来,此时我们在注册窗口中输入我们的注册用户名与假码:
xIkUg
aaaaaaaa-bbbbbbbb-cccccccc-dddddddd
点“确定”,此时WinDBG把Target中断了下来,中断之处正是我们刚才设置的DeviceControl的例程处0xf7353b1a:
f7353b1a 8bff mov edi,edi ; 这里断下
f7353b1c 55 push ebp
f7353b1d 8bec mov ebp,esp
f7353b1f 51 push ecx
f7353b20 8b4508 mov eax,dword ptr [ebp+8] ; [ebp+8] = DeviceObject
f7353b23 56 push esi
f7353b24 57 push edi
f7353b25 8b7828 mov edi,dword ptr [eax+28h] ; [eax+28h] = DEVICE_OBJECT.DeviceExtension
f7353b28 807f0400 cmp byte ptr [edi+4],0 ; ds:0023:8145494c=01
f7353b2c 897dfc mov dword ptr [ebp-4],edi ; 保存设备扩展
f7353b2f 751a jn
评论