sys是驱动文件,相对于应用程序来说,它的调试难度稍微大一点,调试sys需要进行双机调试,而前提就是搭建双机调试的环境。
一、双机调试环境搭建
2、查看是否已经有端口存在?如果有的话需要移除,否则windbg与vmware连接不上,比如下图,就需要将打印机移除。
5、在串行端口类型窗口下选择输出到命名管道,然后点击下一步。
6、指定插槽。
配置如下图所示,其中命名管道的com_1为管道名称,可以作改动,但是在用windbg进行连接的时候也要注意名字的一致,我这里保留默认名。两台机器,一台为【该端是服务器】保留默认设置,最后一个下拉框选择【另一端是应用程序】。最后注意吧【启动时连接】的复选框选上。
二、配置虚拟机
打开虚拟机中windows的系统盘,找到boot.ini文件,如果不显示这个文件的话,在文件夹选项中设置为“显示所有文件”,“不隐藏系统保护文件”,然后就可以看到boot.ini文件了。
打开boot.ini文件后,原始内容如下:
[boot loader]
timeout=30
default=multi(0)disk(0)rdisk(0)partition(1)\WINDOWS
[operating systems]
multi(0)disk(0)rdisk(0)partition(1)\WINDOWS=”Microsoft Windows XP Professional” /noexecute=optin /fastdetect
将最后一行复制并粘贴在[operating systems]下,然后修改一些参数即可!如下:
[boot loader]
timeout=30
default=multi(0)disk(0)rdisk(0)partition(1)\WINDOWS
[operating systems]
multi(0)disk(0)rdisk(0)partition(1)\WINDOWS=”XP Debug” /fastdetect /debug /debugport=com1 /buadrate=115200
multi(0)disk(0)rdisk(0)partition(1)\WINDOWS=”Microsoft Windows XP Professional” /noexecute=optin /fastdetect
三、windbg配置
下面设置调试机上的windbg启动参数,使之连接一个管道,并把这个管道当作一个串口来处理,首先建立一个windbg.exe的快捷方式,然后右键快捷方式图标选择属性,在属性对话框的目标一栏加上空格后添加:
windbg.exe -b -k com:pipe,port=\\.\pipe\com_1,baud=115200,pipe
然后,点击保存即可。
要进行双机调试的话,在虚拟机启动时,选择启动调试程序,当虚拟机启动起来之后,再开启windbg就可以连接到虚拟机中。
四、设置windows内核符号表
打开windbg,选择菜单“File”->”Symbol File Path”,然后填写:
srv*c:\Symbols*http://msdl.microsoft.com/download/symbols
如下图,如果我们选择了Reload,那么相当于输入了.reload命令,这时开始下载符号。
以上方法是设置是WinDbg自动用HTTP协议从微软的网站上下载所需的符号表。下载完后可以在C:\Symbols目录中查看,这个路径也可以指定为其它路径。
五、寻找DriverEntry
首先使用命令uf nt!IopLoadDriver查看驱动加载的入口,针对32位程序和64位程序,入口处的代码不一样,32位下的代码如下:
nt!IopLoadDriver+0x663:
805a07c9 ffb570ffffff push dword ptr [ebp-90h]
805a07cf 57 push edi
805a07d0 ff572c call dword ptr [edi+2Ch]
805a07d3 3bc3 cmp eax,ebx
805a07d5 8b8d68ffffff mov ecx,dword ptr [ebp-98h]
805a07db 8945ac mov dword ptr [ebp-54h],eax
805a07de 8901 mov dword ptr [ecx],eax
805a07e0 0f8c91200500 jl nt!IopLoadDriver+0x67c (805f2877)
64位下的代码如下:
nt!IopLoadDriver+0x9fe:
fffff800`02cb545e 488bd6 mov rdx,rsi
fffff800`02cb5461 488bcb mov rcx,rbx
fffff800`02cb5464 ff5358 call qword ptr [rbx+58h]
fffff800`02cb5467 4c8b15da3bdaff mov r10,qword ptr [nt!PnpEtwHandle (fffff800`02a59048)]
fffff800`02cb546e 8bf8 mov edi,eax
fffff800`02cb5470 898424e0000000 mov dword ptr [rsp+0E0h],eax
fffff800`02cb5477 4c3bd5 cmp r10,rbp
fffff800`02cb547a 0f848e000000 je nt!IopLoadDriver+0xaae (fffff800`02cb550e)
可以通过搜索上述代码中加红的代码定位到关键点,然后bp下断点,之后输入”g”让虚拟机运行,回到使用软件KmdManager加载驱动,打开KmdManager,界面如下:
将sys文件拖入上图所示的窗口中,在小方框中打勾(可以在卸载驱动的时候再在下面的打勾),如下图所示:
然后,点击Reg`nRun加载驱动,会看到断点断在我们设置的地方,然后F11进入就达到了DriverEntry开始调试。
注意:
32位的驱动程序要在32位系统下调试,64的驱动程序要在64位系统下调试。