SystemCrashDumpStateInformation加载驱动

使用如下代码可将系统中的atapi.sys (如果你的机器磁盘PORT驱动是atapi.sys的话,如果是scsiport的话会有不同)加载到系统中。

模块名为dump_atapi.sys(如果已配置了生成dump则无法生效)

HMODULE hlib = LoadLibrary("ntdll.dll");
PVOID p = GetProcAddress(hlib , "NtSetSystemInformation");
ULONG stat;
__asm
{
push 0
push 0
push 0
push 34

//SystemCrashDumpStateInformation
call p
mov  stat ,eax
}

代码非常简单,而且不需要任何额外权限,user权限也可以调用

结合替换或感染atapi.sys则可加载自己的驱动

不过,只能加载而已,加载完了系统会将加载的信息保存到IopDumpxxxx结构中,等到KeBugCheckEx调用IopWriteCrashDump时会调用到这个驱动

也就是说,实现攻击所要条件:

1.宿主机关闭了crash dump 选项(貌似很多机器都关闭了,尤其是XX优化版,XX美化版)

2.宿主机上存在引发bsod的驱动程序(很多杀毒软件、HIPS都有这样的设计缺陷)

这两点条件具备则可达成攻击。但其实还有一些细节要处理,例如,部分HIPS会报警写SYSTEM32下文件,因此我们需要直接通过磁盘读写该文件

另外,需要让原本不生成crashdump 的机器调用IopWriteCrashDump也是需要一定方法的

下面说说主要原理:

系统生成crash dump(崩溃转储)的当时其实并没有写入文件,而是实现在pagefile.sys中分配预留一块区域,将物理内存写入这块区域,等重启时再转储到文件中

之所以这么做,是因为WINDOWS不希望在转储时(BSOD时)使用文件系统相关功能,因为它可能已经被破坏了,而磁盘驱动其实也是可能被破坏的,因此 WINDOWS在Config CrashDump时,将系统中的atapi.sys磁盘端口驱动备份了一份,以dump_xxxx.sys的方式加载,等到BSOD时调用此驱动来写入 磁盘。

这个功能还可以帮助我们做另一件事,例如系统原始的atapi.sys可能被HOOK了,那么我们可以利用dump_atapi.sys来写磁盘

你可能感兴趣的:(SystemCrashDumpStateInformation加载驱动)