【转帖】使用WinDBG和VMware调试驱动程序

 环境的搭建参考: http://hi.baidu.com/1ian9yu/blog/item/bbaf1301240d7ad3267fb524.html,这里只说调试。

还是先统一一下名称,真实的操作系统叫HostOS,在VMware里虚拟的操作系统叫GuestOS。

我们编写完驱动后,当然要进行调试,这不可能在HostOS(本机)里调试,否则BOSD就麻烦了,而且支持本机调试的调试器比较流行的只有softice,这个东西早就停止更新了,而且对目前的操作系统的支持更是非常不好。所以使用WinDBG和VMware调试驱动程序绝对是我们最佳的选择。

驱动的加载和卸载是必须的步骤,你总不会希望每次修改驱动后需要重启系统才能进行调试吧?加载和卸载的代码其实很简单:

// ***************************************************************
// function : LoadDriver
// purpose   : 加载驱动
//     
// parameter : [IN] lpPath 驱动的完整路径
//      [OUT]
//     
//
// author   : liangyu
// created   : 2008-7-10   17:19
// ***************************************************************
BOOL CSSDTToolGuiDlg::LoadDriver(LPTSTR lpPath)
{
    SC_HANDLE hSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
    if ( NULL == hSCManager )
    {
   return FALSE;
    }

SC_HANDLE hService = CreateService( hSCManager, _T("SSDTTool"),
   _T("SSDTTool Driver"), SERVICE_ALL_ACCESS,
   SERVICE_KERNEL_DRIVER, SERVICE_DEMAND_START,
   SERVICE_ERROR_IGNORE, lpPath, NULL, NULL, NULL, NULL, NULL );
if ( NULL == hService )
{
   if (ERROR_SERVICE_EXISTS == GetLastError())//如果是"已经存在该驱动"导致的错误则继续
   {
    hService = OpenService( hSCManager, _T("SSDTTool"), SERVICE_ALL_ACCESS);
   }
   else
   {
    return FALSE;
   }
}

StartService( hService, 0, NULL );
CloseServiceHandle( hService );
    CloseServiceHandle( hSCManager );

return TRUE;
}

// ***************************************************************
// function : UnLoadDriver
// purpose   : 卸载驱动
//     
// parameter : [IN] lpName 服务(驱动在SCM注册的)名字
//      [OUT]
//     
//
// author   : liangyu
// created   : 2008-7-10   17:41
// ***************************************************************
BOOL CSSDTToolGuiDlg::UnLoadDriver(LPTSTR lpName)
{
SC_HANDLE hSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
    if ( NULL == hSCManager )
    {
   return FALSE;
    }

SC_HANDLE hService = OpenService( hSCManager, lpName, SERVICE_ALL_ACCESS);
if ( NULL == hService )
{
   return FALSE;
}

SERVICE_STATUS ss;
ControlService( hService, SERVICE_CONTROL_STOP, &ss );
DeleteService( hService );
CloseServiceHandle( hService );
    CloseServiceHandle( hSCManager );

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里运行驱动加载/卸载工具把我们的驱动加载起来。可以看到,已经断下来了,我们可以源码调试驱动了:

注:打开源文件和设置符号路径可以在一开始的时候就做,这是没有严格先后顺序的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值