实战windbg调试驱动例子

Posted swhchwhdh

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了实战windbg调试驱动例子相关的知识,希望对你有一定的参考价值。

关于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的话
很可能会引起一些其他的后果,比如死机、重起等.


后记:


其实这算不上什么教程,其实本来是打算完全的翻译windbg help的,不过后来觉得确实没有必要,
因为我也没有详细的看过windbg help,只是在使用时遇到新的问题时才去查看的.

再分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow






























































































以上是关于实战windbg调试驱动例子的主要内容,如果未能解决你的问题,请参考以下文章

[原]调试实战——使用windbg调试TerminateThread导致的死锁

windbg调试驱动程序

用WinDbg调试Windows和驱动程序

[原]调试实战——使用windbg调试DLL卸载时的死锁

转: windbg-跳过初始断点(调试技巧)

如何用windbg调试因需加载的DLL