首页
社区
课程
招聘
[原创]记一次系统不能正常加载的修复过程
发表于: 2014-6-19 10:34 5807

[原创]记一次系统不能正常加载的修复过程

2014-6-19 10:34
5807

前不久,在使用虚拟机的时候,由于在虚拟机上新安装了一个即插即用的虚拟驱动,暂且叫它 x.sys,没想到这就是祸起的开始。由于这个驱动不是很完善,所以在该驱动安装后,我重启了系统(这里的系统都是指虚拟机的系统),结果悲剧发生了。当系统出现了加载进度条后,等了无限长的时间依然没有引导进入用户界面。即使作为一个程序员,我也感到了束手无策,因为我没有备份这个系统,难道要重新安装一次,这显然只有网管能干得出来,所以我决定尝试一下修复办法。
        首先被我想到的当然就是进入安全模式,因为我在安全模式下修复过无数次的系统,相当有经验,之所以我认为安全模式可以进入,是因为有些驱动在安全模式下是不加载的,在安全模式下一般只会加载一些硬件相关的驱动,尤其是一些存储驱动,即使连网卡驱动也可以选择不加载。由于 x.sys 是虚拟 scsi 小端口驱动,或许可能也许不加载吧,我抱着试一试的心情选择了安全模式,但实验结果令人沮丧,该驱动肯定加载了,因为系统依然卡在了进度条加载的地方,然后就是 loop around ,此路不通。那我又抱着试一试的心情试了一下启动最后一次正确的配置,结果最后一次正确的配置,结果再一次的失败。
        到了这般地步,一般人可能会放弃了对这个系统施救,但好奇心让我决定做最后一次尝试,因为为了调试,之前我对该系统添加了一个调试启动项,可能这就是希望的开始。
        难道我们要调试一下系统卡在了什么地方,显然这种方法非常的耗时,说不定还不能得到我们希望的结果。那就换一种思路,如果想让该系统正常启动,只要删除掉我最后安装的 x.sys 驱动就可以了,但这是一个悖论,系统都加载不了,如何删除(因为我没有 pe 盘,无法拿其它系统引导)。那就想办法不让该驱动加载,然后等正常进入后再删掉,这样就好了,顺着这个思路,我们知道,内核由 ntldr 加载进内存后就开始了初始化过程,包括各个组件,如内存管理,进程管理,I/O 系统,在 I/O 系统初始化过程中,会加载引导启动驱动和系统启动驱动,而加载驱动都是由 IopLoadDriver 这个系统调用来完成,那么我们在这个函数处打上断点,如果看到是加载 x.sys 驱动,那么就直接返回失败就可以了。启动 Windbg ,单机调试,在 IopLoadDriver 处设置断点,通过分析,我发现它有打开注册表,拼接出完整加载路径的操作(IopBuildFullDriverPath),我就在拼接之后打上断点,如图:

(图断点处的意思是比较返回值,若失败则退出)
调试发现,该函数的第三个参数PUNICODE_STRING,即 ebp – 5c 即为一个 UNICODE_STRING 的地址,该字符串就是将要加载的驱动的全路径如下图。

这样就简单了,我们观察如果加载的驱动是我们自己的驱动,那么就修改 eax 为 -1, 此时检查就是失败,该函数失败返回。
        根据这个思路,我把所有加载 x.sys 的地方全部修改为失败返回,结果可想而知,系统成功加载进入了,终于松了一口气,系统进入之后,赶紧手动删除了 x.sys ,然后给虚拟机做了一次备份。
        这场有意义的修复战就这么顺利结束了。


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

上传的附件:
收藏
免费 3
支持
分享
最新回复 (9)
雪    币: 6825
活跃值: (1570)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
真有耐心,换我就直接重装了
2014-6-19 10:43
0
雪    币: 57
活跃值: (791)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
对啊,虚拟机一般都有镜像的备份的
2014-6-19 11:07
0
雪    币: 8835
活跃值: (2404)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
4
good job~
好文顶顶~
2014-6-19 13:42
0
雪    币: 28
活跃值: (42)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
5
谢谢支持!
2014-6-19 15:33
0
雪    币: 1443
活跃值: (101)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
赞,思路很漂亮。
2014-6-19 17:38
0
雪    币: 200
活跃值: (38)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
7
用pe启动,用regedit加载不能启动的系统的注册表,禁用有问题的驱动即可
2014-6-19 17:51
0
雪    币: 28
活跃值: (42)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
8
哦,当时没有 pe 盘(文中还提及了,如果有,你这个思路真心不错,很方便)。还有就是其实我发现删除注册表没有直接删除驱动来的直接,因为这个驱动是个即插即用的驱动,它是根据注册表中的设备节点来初始化的,还不是个服务,删着蛮麻烦。
2014-6-19 18:44
0
雪    币: 1904
活跃值: (48)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
vmware有个硬盘映射的功能,在虚拟机选项,HDD选项里。就可以像访问本机硬盘一样对文件进行读写删除操作,虚拟机里的系统不需要开机很方便
2014-6-20 08:08
0
雪    币: 28
活跃值: (42)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
10
好方法。
2014-6-20 09:12
0
游客
登录 | 注册 方可回帖
返回
//