【转帖】实战windbg调试驱动例子

来源:互联网 发布:哪些软件可以挣集分宝 编辑:程序博客网 时间:2024/05/16 07:35
这几天上网查了一些关于WINDBG的资料,发现很多朋友在寻找关于WINDBG的教程.
(呵呵,我也在寻找有关于此的一些材料)
本来是一想写关于sr.sys的分析的,不过觉得始终不妥,一句老话,授人以鱼不
如授人以渔,所以这篇文章以sr.sys分析作为示例,不过我们的重点却是要放在
WINDBG的使用上.
首先来介绍一下搭建的环境:
WINDBG:Windows Debugger    Version 6.2.0013.1
Vmware-workstation-4.5
Target Computer:winxp sp1 free
Host Computer:win2003

关于VM和WINDBG的基本配置请参考相关的文档.(在这里给各位一篇不错的文章,
就是jiurl老大写的<<利用VM使用windbg>>)

好了,废话少说,让我们整点干的:
既然我们要分析的是sr.sys,当然我们先要看的就是目标机加载的驱动程序的位置了,
sr.sys是XP系统系统还原的主体部分,它是建立在NTFS文件分区格式下的一个驱动,
说白了sr.sys其实就是ntfs.sys的filter driver.
kd>!drivers
Base         Code Size        Data Size        Image Name          Creation Time
……
fc3ed000     de80 (    56 k)    2c00 ( 11 k)         sr.sys    Thu Aug 29 16:17:56 2002
……
我查找了与sr.sys相关的资料,不过没找到什么有用的东西,最有用的可能就是MSDN里面
关于WINXP SYSTEM RESTORE的相关介绍了,不过实在是没有什么帮助,看来只有自己动手
丰衣足食了,首先我们先来大概的分析一下代码,然后由此扩展开来.
Kd>u fc3ed000
sr!SrMakeContextUninteresting <PERF> (sr+0x0):
fc3ed000 4d                 dec       ebp
sr!SrMakeContextUninteresting <PERF> (sr+0x1):
fc3ed001 5a                 pop       edx
sr!SrMakeContextUninteresting <PERF> (sr+0x2):
fc3ed002 90                 nop
sr!SrMakeContextUninteresting <PERF> (sr+0x3):
fc3ed003 0003               add       [ebx],al
sr!SrMakeContextUninteresting <PERF> (sr+0x5):
fc3ed005 0000               add       [eax],al
sr!SrMakeContextUninteresting <PERF> (sr+0x7):
fc3ed007 000400             add       [eax+eax],al
sr!SrMakeContextUninteresting <PERF> (sr+0xa):
fc3ed00a 0000               add       [eax],al
sr!SrMakeContextUninteresting <PERF> (sr+0xc):
fc3ed00c ffff               ???

kd>u
……
我们向后翻查,找到下面的内容:
kd>
sr!DriverEntry+0x12:
fc3fbcd6 59                 pop       ecx
fc3fbcd7 33c0               xor       eax,eax
fc3fbcd9 8b3d40f03efc       mov       edi,[sr!global (fc3ef040)]
fc3fbcdf f3ab               rep       stosd
fc3fbce1 a140f03efc         mov       eax,[sr!global (fc3ef040)]
fc3fbce6 c7005372474c       mov       dword ptr [eax],0x4c477253
fc3fbcec 8b5d08             mov       ebx,[ebp+0x8]
fc3fbcef a140f03efc         mov       eax,[sr!global (fc3ef040)]

不好意思,每个人都有自己的分析习惯,而我喜欢从开始执行的部分分析,我感觉自这样
分析比较清晰,鉴于篇幅,具体的代码分析我不在这里列出(具体的代码分析请参看我的
另一篇文章<<winxp system restore 全面解析>>).
一点建议:上面的代码相当于静态反汇编,不过我建议如果是静态反汇编的话,我们不如
直接用IDA,我们还是来看看动态反汇编的结果,看看里面的具体变化,主要是堆栈,
寄存器,各个变量等的值.
重新启动我们的target computer,在连接上的那一刻,按CTRL+Break断下来,然后下断点:
kd>bp 0xfc3fbcc4
kb>g
注意要及时按下CTRL+Break,不要过了,因为sr.sys是系统驱动,在ntldr加载驱动时会被加载,
所以等系统起来之后就断不着了(我就曾经错过了好几次机会)
好了,终于断到了,我们来看看:
kd> bp 0xfc3fbcc4
kd> g
Breakpoint 0 hit
sr!DriverEntry:
fc3fbcc4 6a54               push      0x54
单步执行:
kd> p
sr!DriverEntry+0x2:
fc3fbcc6 68c8de3efc         push      0xfc3edec8
好了,剩下的就要看看我们的汇编功底了(党和国家考验我们的时候来到了,呵呵)
至于代码分析我就不在这里过多的叙述了,因为这不属于WINDBG使用的范围.
其实用了这么长时间的WINDBG,主要就是用其做动态反汇编的工作,之所以我不选择
SOFTICE有两个原因:第一,softice 使我的系统变的极不稳定,很多奇怪的问题搞的
我措手不及;第二,在使用softice的过程中,有一些命令会有误差,举一个具体的例子
来说,在SoftIce中使用irp命令时,所查看的寄存器并不一定就是irp,只要查看的
寄存器有合法的内容,那么irp命令就尝试去匹配,所以在使用irp命令时要注意,
可以利用windbg的!irp /address/ 1来查看,windbg首先会检验irp的sign,
所以基本上不会有误差.

虽然softice在操作比windbg要好很多,可是我可不想因为一些误差走错路.

好了让我们回到正题,在使用windbg的过程中,我经常使用的命令如下:
.reboot     重新启动Target computer
dd          显示寄存器或者是内存地址的内容
dt          其实这个命令的使用效率并不高,我把它列出来的原因是因为有一个关于
            它的一个窍门,比如说我想查看一个数据结构的成员,我可以用如下的命令:
            dt –v –r ntdll!_FIEL_OBJECT,我们可以使用该命令查看大部分的数据
            结构,在windbg列出的结构中包括了各个数据成员之间的偏移,所以我很喜欢
            该命令,即便我知道一个数据结构的成员,我也会使用该命令打印出来,这样
            更便于理解汇编语言中对数据结构的操作.
!devobj     使用deviceObject结构的内容.
            该命令的使用效率并不是很高(起码我几乎没有使用过),不过在调试驱动时会
            起到关键的作用.
!irp        显示irp数据结构中的内容.
            !irp eax 1
在我的理解中,驱动程序就是对irp的处理,所以我经常使用该命令查看参数和irp中的
数据成员,以便更好的理解过程.
bp            下断点.
bc            清除断点.
bd            暂时禁止断点.
be            允许执行被禁止的断点.
!drvobj      显示driverObject数据结构中的内容,同样该命令在调式驱动程序时可能会用到.

虽然使用这十个命令,但是对我来说已经是受用不尽了,其实在这些命令中,只有4个是我最常用的:
dd、dt、bp、!irp

还有一点,是我没有提到的:
比如说我们想查看该驱动程序在哪个进程中运行,可以做如下的操作:
kd>!thread          //查看当前的线程
在列出的各项数据中,看到PID了吗?
kd>!process [pid] 0
在其中列出的Image就是当前的进程了.

下面说一下用windbg 调式services

想要调式services,就必须在UserMode下运行windbg,即不用打开Target computer.
首先,安装和启动我们的服务;
其次,启动windbg;
选择File->Attach to a Process菜单;
在出现的Attach to Process对话框中双击我们想要调式的服务;
OK,下断点.
现在我们就可以调试了,不过要注意调式的完整性,因为是本机调试,所以如果我们随意关闭windbg的话
很可能会引起一些其他的后果,比如死机,重起等.