关于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
原文地址:https://www.cnblogs.com/swhchwhdh/p/10300601.html