首页
社区
课程
招聘
[求助]windows生成dump驱动的原理
发表于: 2014-8-11 10:40 16188

[求助]windows生成dump驱动的原理

2014-8-11 10:40
16188
windows加载的驱动里面,有一个或者若干个dump_xxxx.sys文件,这些驱动程序实在系统崩溃时用来当做磁盘驱动,把dump文件写入磁盘来用的。在休眠时,这些dump_xxxx.sys文件就会在内存复制一份改个名字叫做hiber_xxx.sys文件,用来把hibernat.sys文件写入磁盘。
我查了几个例子,发现,如果系统盘是ide磁盘,那么驱动是磁盘驱动atapi.sys,windows自动生成dump_atapi.sys,而这个dump_atapi.sys和atapi.sys是一模一样的,只是改了名字。
系统盘是sata的时候,驱动程序是iastor.sys,window又自动生成dump_iastor.sys和iastor.sys也是一模一样的,在vmware中,如果是scsi虚拟磁盘,则磁盘驱动为vmscsi.sys这是一个scsi miniport驱动,需要scsiport.sys的配合,这种情况,windows自动生成的dump.sys是dump_vmscsi.sys和vmscsi.sys一模一样,同时生成一个diskdump.sys配合dump_vmscsi.sys使用。
现在问题来了,我自己写了一个虚拟磁盘驱动vimg.sys,虚拟scsi驱动把磁盘的img文件模拟为一个scsi磁盘,而且我用我的vimg.sys启动的windows xp系统,系统盘读写文件都是调用我的vimg.sys来对磁盘读写,但是 ,windows并没有生成一个dump_vimg.sys,当崩溃时用这个dump_vimg.sys来转储文件,而且,也不会生成hiber_vimg.sys来休眠,因此我的vimg.sys无法完成windows休眠操作,有哪位大牛能指出这其中的原因吗?
或者能推荐我看看某些资料吗?

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 0
支持
分享
最新回复 (18)
雪    币: 478
活跃值: (50)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
无盘-…!?
2014-8-11 14:12
0
雪    币: 8
活跃值: (233)
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
3
不是无盘,类似ramdisk之类。
求解答。主要是不能解决休眠的问题,头痛,求解答。
2014-8-11 15:39
0
雪    币: 155
活跃值: (20)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
看SystemCrashDumpStateInformation

你的Driver(DriverObject) 创建一个\Device\ScsiPortX(X=0,1,2....) , 如果DriverObject对应的名字是123 最后就会加载dmp_123.sys

可以看看:
nt!IopGetDumpStack 这个函数。

不过貌似WIN7已经没有这套机制了
2014-8-13 15:28
0
雪    币: 8
活跃值: (233)
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
5
我是这么做的,vimg.sys生成一个fdo名字\Device\ScsiPort9,但是并没有加载dump_vimg.sys。
而我看了iastor生成的fdo名字不是scsiport而是iastor0,一样也可以生成dump_iastor.sys。
所以我觉得一定是有哪个地方不对,而不是名字为scsiport的原因。

是不是 IRP_MN_QUERY_INTERFACE需要正确应答啊?我的IRP_MN_QUERY_INTERFACE是无返回值的。
但是IRP_MN_QUERY_INTERFACE的具体参数求解释啊。
2014-8-14 08:20
0
雪    币: 155
活跃值: (20)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
所以让你看看IopGetDumpStack啊。。。

它首先给打开启动的磁盘设备(IoArcBootDeviceName,比如\ArcName\multi(0)disk(0)rdisk(0)partition(1),这是个符号链接,通常指向启动的分区设备,如\Device\Harddisk0\Partition1

然后发送IOCTL_SCSI_GET_ADDRESS,然后取到SCSI_ADDRESS->PortNumber

接着在加载dmp_xxx.sys驱动时,这样处理,使用\Device\ScsiPort[SCSI_ADDRESS->PortNumber] 路径,打开设备(如\Device\ScsiPort0)

获取设备的 DriverObject->DriverName,然后去加载对应的驱动文件,路径拼接的方式是从 DriverName取到文件名(例如\Driver\123,则为123),然后就会加载\systemroot\system32\123.sys

123.sys在通过MmLoadSystemImage使用perfix(“dump_"),于是在load data table entry(加载模块列表)里的名字就成了dump_123.sys ,但实际上加载的PE还是123.sys

所以,如果你确定你的驱动没被加载,你要看看这么几个问题:

1. 什么系统,至少XP是这样的

2. port number是否是boot device所在的那个

3.驱动是否在driver路径下,记得加载的是123.sys,而不是dump_123.sys,只是加载列表的名字是那个。

其实调试下IopGetDumpStack有什么问题也就很清楚了。
2014-8-15 18:55
0
雪    币: 8
活跃值: (233)
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
7
谢谢,可能是这一句有作用“然后发送IOCTL_SCSI_GET_ADDRESS,然后取到SCSI_ADDRESS->PortNumber”,我的设备名是 \device\scsiport9,但是IOCTL_SCSI_GET_ADDRESS,然后取到SCSI_ADDRESS->PortNumber”=0;可能就是这个地方出了问题。
2014-8-15 20:00
0
雪    币: 8
活跃值: (233)
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
8
但是又另外一个问题:iastor的设备名是\device\iastor0,这个并不是scsiportX的设备名,这个又是如何加载dump_iastor.sys的呢?
2014-8-15 20:02
0
雪    币: 155
活跃值: (20)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
在XP上是不行的,你是不是高版本系统?

在VISTA以后,系统开始支持多种PORT DRIVER来做DUMP,你看看XP和WIN7的IoGetDumpStack的变化就知道了。

Win7上改用crashdmp.sys这个驱动来专门实现port driver加载,对于在\Device\ScsiPortX建立符号链接或设备的驱动,仍是支持的(称为Legacy Port Driver)

对于Iastor这类的port driver,则是在crashdmp!CrashDmpLoadDumpStack中调用QueryPortDriver

QueryPortDriver获取dump driver的关键在于向磁盘设备发送IOCTL_SCSI_GET_DUMP_POINTERS设备控制

返回结果中就指明了要加载的dump driver的设备驱动,这是除ScsiPort这种legacy方式外另一种dump port driver的加载方式,也就是你的问题的答案。

分析一下iastor.sys就知道该驱动是实现了对IOCTL_SCSI_GET_DUMP_POINTERS的支持的,当然光实现这个还不行的。

所以就你的问题来说,还是用scsiport来解决比较方便,不过我看你的原始问题其实不是dump,而是休眠?那就是另一个问题了。

关于dump port driver,搜了下有人也做过一些分析
http://hi.baidu.com/heartdbg/item/54ed1185f85e57844414cfd1

http://crashdmp.wordpress.com/crash-mechanism/overview/
2014-8-16 02:00
0
雪    币: 23
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
xp不行,nt5.0的内核全部不支持新硬盘接口,不用想了,百分百通不过。倒不是软件上的通不过,主要是BIOS版本大部份已经支持不了,老的IDE或ATA规范,无法应用到新的ATA规范里去iastor.sys典型的新驱动。不用挣扎了,XP时代已经过去。咱们要拜INTEL福,本来老接口挺好的,就为了应合微软的WIN8大战略,妹的,他全面升级新硬盘接口。
2014-8-16 02:15
0
雪    币: 8
活跃值: (233)
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
11
好像是你说的这样,但是又来另一个疑问了。
在xp系统下面,既然没有加载dump_iastor.sys,那么蓝屏的时候,dump文件时照样生成成功了啊。而且,休眠也是成功的,这又为何呢?我所知道休眠应该是加载hiber_iastor.sys。你说休眠
的问题又不通,我以为hiber_iastor.sys和dump_iastor.sys是同类问题,既然不通,那又有哪些区别呢?
2014-8-16 02:35
0
雪    币: 155
活跃值: (20)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
XP压根就没有iastor.sys
2014-8-16 03:03
0
雪    币: 8
活跃值: (233)
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
13
iastor.sys是intel系列主板的SATA 驱动程序,8系主板没有xp的SATA驱动程序,但是7系主板是有xp的SATA驱动程序的,在7系主板上安装好xp以后,可以看到C盘的驱动程序正是iastor.sys。确实,在xp系统下没有发现
dump_iastor.sys,但是,系统崩溃以后的dump功能是正常的,可以看到dmp文件已经存放在c盘上面,而c盘正是 intel sata接口 接入的硬盘,不知道windows如何把dmp文件存放到这个硬盘上的,也许仍然是通过dump_iastor.sys存入,但我用pchunter没有发现dump_iastor.sys,不知为什么。而且休眠也是成功的,
也是将hibernat.sys存入sata硬盘,但是也没有发现hiber_iastor.sys,这又是为什么呢?
2014-8-16 07:22
0
雪    币: 8
活跃值: (233)
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
14
系统在启动过程中,会向磁盘驱动链发送一个IOCTL_SCSI_GET_DUMP_POINTERS请求,一般是由最底层的PORT驱动来填写在Irp->AssociatedIrp.SystemBuffer这个位置的DUMP_POINTERS结构,这个结构里每个值都需要填写,其中成员DeviceObject就是当DISK DUMP时调用的驱动程序所包含的设备对象

启动过程在NtCreatePagingFile时会调用内核的IopLoadDiskDumpDriver加载DUMP驱动,在需要做DUMP时,调用该驱动的DriverEntry,参数为(NULL,PMMDUMP_FUNCTIONS_DESCRIPTOR pDump),第一个参数为0,第二个参数为一个结构,需要向内填写初始化信息,包括直接写DUMP数据进硬盘的函数地址,在其后调用该函数写硬盘

看来这个IOCTL_SCSI_GET_DUMP_POINTERS才是关键,我的123.sys驱动确实没有处理这个IOcontrol,
但是具体如何处理呢?这方面的资料根本查不到,这些数据结构定义都不知道。PMMDUMP_FUNCTIONS_DESCRIPTOR这个结构具体定义是怎样的?根本查不到啊。
2014-8-16 08:19
0
雪    币: 155
活跃值: (20)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
DUMP_POINTERS的结构在DDK里有
2014-8-16 20:25
0
雪    币: 155
活跃值: (20)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
帮你看了下hiber的问题,我之前说的不对,和dump是同个机制的,都基于dump stack,由IoGetDumpStack实现,只是前缀不一样.

看看IoGetDumpStack的交叉引用就知道了。所以搞定了dump_等同于搞定了hiber_
2014-8-17 00:50
0
雪    币: 8
活跃值: (233)
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
17
可是PMMDUMP_FUNCTIONS_DESCRIPTOR这个结构好像DDK里我没查到啊。哪里有这个结构定义?
2014-8-17 07:54
0
雪    币: 8
活跃值: (233)
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
18
使用google大法,国内是找不到了。

http://www.osronline.com/showThread.cfm?link=82275

typedef struct _DUMP_IRP
{
ULONG unknown1[3];
PVOID Buffer; //0ch,
PVOID Buffer1; //10h
ULONG Length; //14h,
}DUMP_IRP, *PDUMP_IRP;

ypedef struct _MMDUMP_FUNCTIONS_DESCRIPTOR
{
  ULONG StructSize; //0h,
  ULONG unknown1[9]; //4h
  ULONG DumpData10; //28h
  NTSTATUS (__stdcall *DumpInit)
    (LARGE_INTEGER PartitionOffset);
     //2ch,init function pointer
  NTSTATUS (__stdcall *DumpWrite)
    (PLARGE_INTEGER StartOffset, PDUMP_IRP pDumpIrp);
     //30h, write function pointer
  NTSTATUS (__stdcall *DumpFinish)(void);
     //34h, finish function pointer
  ULONG unknown2[2]; //38h,
  ULONG DumpData; //40h
  ULONG unknown3[5]; //44h
}MMDUMP_FUNCTIONS_DESCRIPTOR, *PMMDUMP_FUNCTIONS_DESCRIPTOR;
2014-8-17 11:47
0
雪    币: 3739
活跃值: (3877)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
19
mark
2018-1-18 10:29
0
游客
登录 | 注册 方可回帖
返回
//