实战windbg调试驱动例子

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

关于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,只是在使用时遇到新的问题时才去查看的.

32位/64位WINDOWS驱动windbg双机调试 windbg双机调试环境配置第一步关掉虚拟机如果有打印机请移除打印机(打印机会占用端口)添加-添加串行端口-完成选择使用命名的通道-名字为 \.\pipe\abc123(对应下面的COM1) -确定-在开启虚拟机在虚拟机命令行里面输入 msconfig 来到系统配置 -引导-第二个高级选项 -勾选调试-勾选调试窗口-选择COM1;-确认-重新启动-启动的时候选择下面的调试系统来到自己电脑系统搜索windbg 阅读详情

相关推荐

Windbg驱动双机调试环境配置

[由于进入了Windows驱动编程领域第一步就是搭建环境,整个环境来说说难也不难,只是比较麻烦。文章有些地方比较繁琐的,而且别人写的比较好,作为引用参考直接贴连接了。如果你按照我写的一步步完成,很快就可以使用Windbg进行双机调试了][准备工作]1:WDK7.1,由于是做Windows Xp下的驱动开发,只能用WDK,如果是WDK8以上的,应该没有这么麻烦。2:VM虚拟机,并且有XP原版镜像,这...

Geons的花园阳台 3952

linux反汇编如何得到各个函数的地址,多种方法获取sys_call_table(linux系统调用表)的地址...

syscall_call:call *sys_call_table(,%eax,4)假设我们没有vmlinux可供gdb反汇编,那也只有采用模拟的方式了,模拟出一个call *sys_call_table(,%eax,4),然后看其机器码,然后在system_call的附近基于这个特征进行寻找 :void fun1() { printf("fun1/n"); } void fun2() { pri...

weixin_42504279的博客 1128

windbg调试驱动不用替换调试机器驱动的方法

.kdfiles

danxuezx的专栏 708

sys防静态反汇编破解

nt i=0x9864 int b=1; i+=b; int c=i; if i=c xxxx else xxxx

blackbean的专栏 1010

windbg 源码调试驱动层)

参考: https://www.cnblogs.com/QKSword/p/10479702.html win7驱动测试环境设置: 1.设置系统测试环境: 2.对驱动进行签名: 一.源码调试: 1.双机调试连接虚拟机(w...

huanongying131的博客 1334

使用WinDbg双机调试SYS无源码驱动程序

背景 有很多学习逆向的小伙伴,逆向一些用户层的程序很熟练了,但是由于没有接触过内核驱动开发,所以对于驱动程序的逆向无从下手。 对于驱动程序的调试可以分为有源码调试和无源码调试。本文主要讨论无源码驱动程序的调试,也就是逆向驱动程序的方法和步骤。本文演示的是使用 VMware 虚拟机和 WinDbg 程序实现双击调试。 ...

qq_38474647的博客 287

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

 这几天上网查了一些关于WINDBG的资料,发现很多朋友在寻找关于WINDBG的教程.(呵呵,我也在寻找有关于此的一些材料)本来是一想写关于sr.sys的分析的,不过觉得始终不妥,一句老话,授人以鱼不如授人以渔,所以这篇文章以sr.sys分析作为示例,不过我们的重点却是要放在WINDBG的使用上.首先来介绍一下搭建的环境:WINDBG:Windows Debugger    Version 6

floweronwarmbed的专栏 1025

WinDbg Preview驱动加载调试入门:实战案例演示

通过真实案例演示如何使用WinDbg Preview进行驱动程序的加载与调试,深入解析调试流程与关键技巧,帮助开发者快速掌握windbg preview在实际场景中的应用。

weixin_42433737的博客 758

Windows-driver-samples调试技巧:WinDbg驱动调试实战案例

Windows驱动开发中,调试是解决复杂问题的关键环节。本文基于[Windows-driver-samples](https://link.gitcode.com/i/4d5bb381f37b46395a09e85941fdfc66)项目,结合WinDbg调试工具,通过实战案例讲解驱动调试的核心技巧,帮助开发者快速定位和解决驱动开发中的问题。 ## 调试环境准备 ### 工具安装与配置 驱动...

gitblog_00648的博客 1097

驱动开发:WinDBG 配置内核双机调试

WinDBG 是在 windows 平台下,强大的用户态和内核态调试工具,相比较于 Visual Studio 它是一个轻量级的调试工具,所谓轻量级指的是它的安装文件大小较小,但是其调试功能,却比VS更为强大,WinDBG由于是微软的产品所以能够调试Windows系统的内核,另外一个用途是可以用来分析dump数据,本笔记用于记录WinDBG内核调试的配置过程,并附有常用命令的使用方法。6.接着回到物理机上面,我们在命令行中切换到WinDBG的根目录下,并执行以下命令,即可连接虚拟机串口进行调试了。

微软技术分享 1万+

Windbg+Vmware驱动调试

安装VMWare 想像Ring3层的程序一样单步执行,在断点时候观察变量,修改内存,完全知道程序的运行情况,需要费一些周折, 因为驱动程序运行在Ring0层程序,调试软件不可能是Ring3层的程序,这与无法在二维空间观察三维空间是一样的。 WinDbg软件,它可以调试应用软件(Ring3层程序)、驱动程序(Ring0层程序)和蓝屏存储文件,但是在调试驱动程序时,WinDbg需要两台计算机

xuepiaosong的专栏 6504

驱动程序的调试windbg双机调试

这篇博客是接着上一篇的,主要写一下配置好了双机调试环境之后,如何使用windbg调试自己开发的驱动程序。配置完了双机调试的环境以后,在主机使用windbg已经可以hook虚拟机的操作系统,如下图 可以看到我们的调试机已经hook住了虚拟机,这时按Ctrl+Pause就可以使虚拟机的操作系统暂停运行。 输入g或者按F5可以使其恢复运行。这时将想要调试驱动程序安装在虚拟机OS中,就是把 De

C++入门到放弃 9654

WinDbg在双机环境下调试驱动程序

最近一直在学习Windows下驱动开发,尝试过SoftICE调试,可安装上后系统启动(Start NetICE)后,整个系统就死机了,以前在Win2K下安装挺好的,郁闷。所以改成WinDbg调试,发现很好用,把配置和调试过程记录如下,以为日后提供参考。1 准备工作1.1 计算机两台。(1)被调试计算机配置,OS为WinXP+SP2需要修改系统盘下boot.ini,可用cmd

实业兴国 实干报国 6314

Windows驱动程序Windbg调试方法[2]

1. 导言 这里主要记录的是以下操作系统配置双机调试的方法。 WindowsXP X86 Windows7的X86和X64 Windows10的X86和X64 使用的工具: Windows XP Professional X86 WDK8.1驱动开发包 Windbg 6.x VMWare Workstation Pro 所用驱动开发包均为WDK8.1,Windbg用的就是开发包内自带的那个版本。由于Win7与Win10配置双机调试方法不管机器位数都是一样的,所以这里只选择记录Win7的 2

輚至消亡 3798

驱动开发】WinDbg 双机调试 Windows XP

起序:最近学习驱动开发,环境搭建,记录一下。 一、软件环境 宿主机:Windows 10 虚拟机:VMware Workstation 16.1.1 Pro 系统:windows_xp_professional_with_service_pack_3_x86_cd_vl_x14-74070.iso WinDbg:GRMWDK_EN_7600_1.ISO 注:GRMWDK_EN_7600_1.ISO 是最后一个支持 XP 系统的 WinDbg 版本了. WinDbg 下载 WinDbg 760.

边扯边淡 2778

调试工具 - Windbg

基于Windbg的dump文件分析和内核驱动调试

dxf1971738522的博客 5918
上一篇: KeBugCheck2的第6个参数
下一篇: 进程、线程调度模型及其在Windows2000中的实现
iiprogram
博客等级 码龄25年 1066粉丝 1515原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值