查看文章 |
环境的搭建参考:http://hi.baidu.com/1ian9yu/blog/item/bbaf1301240d7ad3267fb524.html,这里只说调试。 还是先统一一下名称,真实的操作系统叫HostOS,在VMware里虚拟的操作系统叫GuestOS。 我们编写完驱动后,当然要进行调试,这不可能在HostOS(本机)里调试,否则BOSD就麻烦了,而且支持本机调试的调试器比较流行的只有softice,这个东西早就停止更新了,而且对目前的操作系统的支持更是非常不好。所以使用WinDBG和VMware调试驱动程序绝对是我们最佳的选择。 驱动的加载和卸载是必须的步骤,你总不会希望每次修改驱动后需要重启系统才能进行调试吧?加载和卸载的代码其实很简单: // *************************************************************** SC_HANDLE hService = CreateService( hSCManager, _T("SSDTTool"), StartService( hService, 0, NULL ); return TRUE; // *************************************************************** SC_HANDLE hService = OpenService( hSCManager, lpName, SERVICE_ALL_ACCESS); SERVICE_STATUS ss; return TRUE; 其实有人已经写好这个用途的工具了,《Rootkits: Subverting the Windows Kernel》提到的InstDrv(www.rootkit.com/vault/hoglund/InstDvr.zip),也有国内的网友写好了一个中文版的(http://hi.baidu.com/coderui/blog/item/670a25fb4912b161024f566e.html),功能更齐全。我们就用它来加载和卸载要调试的驱动。 好了,开始。按照之前的说明搭好调试环境后,先用WinDBG连上VMware,如果GuestOS阻塞了,则在WinDBG输入命令“g”,然后回车,直到让GuestOS跑起来。我们把编译好的驱动文件(*.sys)放到GuestOS里,回到WinDBG,按“Ctrl+Break”,WinDBG会让GuestOS暂停下来,我们也可以在WinDBG的命令栏输入命令了,如下: ![]() 在这里输入“bu drivername!driverentry”(大小写不限)可以在驱动的DriverEntry函数的入口点下一个延迟断点,其实BU的意思就是Set Unresolved Breakpoint,WinDBG会记住这个断点,当这个驱动被加载了并且执行到这个地方,WinDBG会暂停GuestOS让你进行调试操作。drivername是你的驱动名字,比如我在这里的驱动名字是SSDTTool,那我在这里输入的命令如下: ![]() 回车后即下好断点了。现在打开源文件,源文件在HostOS呢。“Ctrl+O”找到驱动的源文件打开,如图: ![]() 还要设置符号路径。“Ctrl+S”打开设置窗体,符号路径一般有两个(可以有多个),一个是你设置保存系统DLL的PDB文件的路径,另一个是你驱动的PDB的路径,以分号隔开。如下: ![]() 记得勾选“Reload”,OK后稍等片刻,等WinDBG把这些东西加载完毕后再操作。加载完后我们输入“g”,回车,让GuestOS跑起来。在GuestOS里运行驱动加载/卸载工具把我们的驱动加载起来。可以看到,已经断下来了,我们可以源码调试驱动了:
![]()
注:打开源文件和设置符号路径可以在一开始的时候就做,这是没有严格先后顺序的。 |






