实战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

原文地址:https://www.cnblogs.com/swhchwhdh/p/10300601.html

时间: 2024-08-25 17:23:40

实战windbg调试驱动例子的相关文章

Window10中利用Windbg与虚拟机(window7)中调试驱动建立方法

想起自己的windbg配置就转载:eqera的windows内核调试配置,真的是获益良多希望他不会介意我转载他的博客,帮了我很多,记录下来给我也给大家, 其中我主要看的是VMWare的pipe建立,而我有些分享是在vs2015中打上DDK,然后在开始菜单window kits下找见windbgx86或者是你想要用的类型,然后 发送快捷方式到桌面利于以后用.发到桌面后,在属性插入你放置的的符号的路径,让然最后别忘了在windbg检查路径是否正确. eqera他的解述给了我很多帮助,可以耐心解读.下

WinDbg调试CPU占用高的问题 试验+实战 《第七篇》

一.High CPU试验 1.示例代码 static void Main(string[] args) { Console.Clear(); Console.WriteLine("到命令行下,切换到windbg目录,执行adplus -hang -pn highcpu.exe -o c:\\dumps"); Console.WriteLine("如果要停止,按Ctrl+C结束程序"); Console.WriteLine("================

Windbg调试命令详解

发表于2013 年 8 月 23 日由张佩 转载注明>> [作者:张佩][原文:http://www.yiiyee.cn/Blog] 1. 概述 用户成功安装微软Windows调试工具集后,能够在安装目录下发现四个调试器程序,分别是:cdb.exe.ntsd.exe.kd.exe和Windbg.exe.其中cdb.exe和ntsd.exe只能调试用户程序,Kd.exe主要用于内核调试,有时候也用于用户态调试,上述三者的一个共同特点是,都只有控制台界面,以命令行形式工作. Windbg.exe在

揪出“凶手”——实战WinDbg分析电脑蓝屏原因

http://www.appinn.com/blue-screen-search-code/ 蓝屏代码查询器 – 找出蓝屏的元凶 11 文章标签: windows / 系统 / 蓝屏. 蓝屏代码查询器可以帮你查出引起蓝屏的故障原因并可以到微软知识库中查询解决方案,和之前的 BlueScreenView 配合是很好的蓝屏故障排除组合.@Appinn 使用时只需填入错误代码的简写即可,另外在支持中心中有关于蓝屏原因分析的文章链接,有兴趣的童鞋可以去看看..  官方网站 | 来自小众软件 http:/

调试SQLSERVER (二)使用Windbg调试SQLSERVER的环境设置

调试SQLSERVER (二)使用Windbg调试SQLSERVER的环境设置 调试SQLSERVER (一)生成dump文件的方法调试SQLSERVER (三)使用Windbg调试SQLSERVER的一些命令 大家知道在Windows里面,调试可以分为两个领域: 1.内核态调试 2.用户态调试 一般的程序都是运行在用户态,包括SQLSERVER,SQLServer 会依赖于操作系统的Win32/Win64 API去调用I/O或者其他他需要的服务 用户态程序调试和内核态程序调试是不太一样的,即使

调试SQLSERVER (三)使用Windbg调试SQLSERVER的一些命令

调试SQLSERVER (三)使用Windbg调试SQLSERVER的一些命令 调试SQLSERVER (一)生成dump文件的方法调试SQLSERVER (二)使用Windbg调试SQLSERVER的环境设置 windbg命令分为标准命令.元命令.扩展命令 标准命令提供最基本的调试功能,不区分大小写.如:bp g dt dv k等 元命令提供标准命令没有提供的功能,也内建在调试引擎中,以.开头.如.sympath .reload等 扩展命令用于扩展某一方面的调试功能,实现在动态加载的扩展模块中

Windbg调试(关于句柄表的获取,32位)

今天利用Windbg(x86)进行了获得句柄表的调试,从中获益良多,对调试步骤和按键又一次进行了熟悉,对于句柄表页的概念更是得到了进一步的清晰认识.windbg调试和句柄表不熟悉的朋友可以借鉴我的调试步骤l来熟悉句柄表基础知识, 调试步骤和获取部分如下. 3: kd> dt _EProcess 891ad030 nt!_EPROCESS +0x0f4 ObjectTable : 0x9eca0ef0 _HANDLE_TABLE3: kd> dt _HANDLE_TABLE 0x9eca0ef0

用WinDbg调试Windows和驱动程序

由于本人能力有限,翻译不足之处敬请谅解,欢迎批评指正:[email protected] MSDN原文:https://msdn.microsoft.com/zh-cn/library/windows/hardware/hh406283(v=vs.85).aspx 这个章节描述如何用WinDbg调试器执行基本的调试任务. 详细信息都在下面文章里: Debugging a User-Mode Process Using WinDbg Debugging a UWP app using WinDbg

WinDbg 调试.net程序

WinDbg支持以下三种类型的命令: ·        常规命令,用来调试进程 ·        点命令,用来控制调试器 ·        扩展命令,可以添加叫WinDbg的自定义命令,一般由扩展dll提供这些命令 PDB文件 PDB文件是由链接器产生的程序数据库文件.私有PDB文件包含私有和公有符号,源代码行,类型,本地和全局变量信息.公有PDB文件不包含类型,本地变量和源代码行信息,且只包含共有成员的调试信息. Dump文件 利用Dump工具,你可以获得进程的快照信息.一个mini-dump