/*******************************************************************************************
* Module : nvmini.c
*
* Author : sudami [sudami@163.com]
* Time : 08/02/28
*
* Comment:
* 去年月份强悍的“马吉斯(Worm.Magistr)”病毒浓妆艳抹的登场,MS很强大。
* 过去这么长时间了,初学逆向,俺作为后来者就试着分析了下它的sys.于是就有了
* 这份简陋的code. 逆的很菜,老鸟飘过了=。=|
*
* 发现很多部分作者都是参考别人的code,然后A过来用的.所以这里同样在一些方面
* A了agony's some code. 嘿嘿
*
* ---- nvmini.sys的大致流程如下----
*
* 1.> 通过替换SDT 的中的函数地址挂钩ZwSaveKey、ZwQueryDirectoryFile、ZwClose、
* ZwEnumerateKey、ZwLoadDriver、ZwDeleteValueKey、ZwDeleteKey来保护病毒的
* 注册表键值不被发现和修改,隐藏病毒文件(boot.exe, linkinfo.dll, nvmini.sys),
* 隐藏服务以及禁止一些安全软件的驱动加载,eg: IS(俺为了试验,多加了几个)
*
* 2.> 和应用层通信-- 创建一个名为DL5CEvent 的设备,用户进程可通过ioctl = 25270860
* 来获得最后一个创建进程的进程ID(通过调用PsSetCreateProcessNotifyRoutine 得到)
* 此前用户层中已经通过OpenEvent打开了该对象,一直静静的等待着对象变成“受信”状态;
* 而在驱动里,ProcessCreateMon中一旦检测到新进程的创建就设置该对象为“受信”状态,
* 于是用户层就高兴的发送ioctl = 25270860到驱动中,让buffer里面满载刚创建的进程ID号
* 顺利的回到用户层。这样就/实现了R3中一个线程对新创建的进程的监视,一旦符合规则,
* 就禁止创建,或kill 掉. (俺没写R3的部分,所以就此略掉了,不过R0的代码中还保留)
*
* 3.> 通过PsSetLoadImageNotifyRoutine 设置映像加载通知.禁止部分病毒DLL的加载,即
* 修改物理内存修改模块入口是这些模块返回失败,无法成功加载.
*
* 4.> 1个系统线程不断回写注册表的服务项.很暴力,不过hook一些更底层的操作注册表的函数
* ObXXXX之类的,就可以防止了; 注册一个DPC回调函数不断检查SSDT,保护自己的hook(由于俺
* 在调试时,一用KeSetTimerEx就会蓝,和IRQL有关,所以换用系统线程来实现,功能类似,
* ,保留DPC部分代码)
*
* 5.> 俺为了调试方便,加了一个修改IE首页,和piaoxue的驱动类型,就是暴力的回写注册表,很低级~~~
*
* btw: 病毒的作者好像是hackbase的XXXXXXXXXX,很强悍的一个驱动大牛,MS做病毒赚了不少银子.
* 不过作者的主要精力可能不在驱动上,nvmini.sys做的一般,没有用到太多的猥亵手法,比
* 如检测进程等完全不需要和R3通讯,直接在驱动中用一个线程,加个回掉函数,然后投递APC,
* 杀线程即可,HOOK SSDT等用烂的手段确实也太科普, 文件隐藏,注册表等都是很扫盲的手法,
* 可能作者没考虑太多吧.
*
* ---- 后记----
* 断断续续的逆nvmini.sys有一大会儿,可没有用F5,深感没有F5的艰难~
* 由于大3了,压力很大,专业的原因,也没多少业余时间来学内核,所以逆的很粗糙,不过功能都大致实现了.
* 还忘各位大牛海涵,见笑啦~ o(*.*)0
*
* PS;
* 为了防止被坏人A过去干坏事,已经把部分code做了相应的更改和删除, 不过有心学习的完全可
* Module : nvmini.c
*
* Author : sudami [sudami@163.com]
* Time : 08/02/28
*
* Comment:
* 去年月份强悍的“马吉斯(Worm.Magistr)”病毒浓妆艳抹的登场,MS很强大。
* 过去这么长时间了,初学逆向,俺作为后来者就试着分析了下它的sys.于是就有了
* 这份简陋的code. 逆的很菜,老鸟飘过了=。=|
*
* 发现很多部分作者都是参考别人的code,然后A过来用的.所以这里同样在一些方面
* A了agony's some code. 嘿嘿
*
* ---- nvmini.sys的大致流程如下----
*
* 1.> 通过替换SDT 的中的函数地址挂钩ZwSaveKey、ZwQueryDirectoryFile、ZwClose、
* ZwEnumerateKey、ZwLoadDriver、ZwDeleteValueKey、ZwDeleteKey来保护病毒的
* 注册表键值不被发现和修改,隐藏病毒文件(boot.exe, linkinfo.dll, nvmini.sys),
* 隐藏服务以及禁止一些安全软件的驱动加载,eg: IS(俺为了试验,多加了几个)
*
* 2.> 和应用层通信-- 创建一个名为DL5CEvent 的设备,用户进程可通过ioctl = 25270860
* 来获得最后一个创建进程的进程ID(通过调用PsSetCreateProcessNotifyRoutine 得到)
* 此前用户层中已经通过OpenEvent打开了该对象,一直静静的等待着对象变成“受信”状态;
* 而在驱动里,ProcessCreateMon中一旦检测到新进程的创建就设置该对象为“受信”状态,
* 于是用户层就高兴的发送ioctl = 25270860到驱动中,让buffer里面满载刚创建的进程ID号
* 顺利的回到用户层。这样就/实现了R3中一个线程对新创建的进程的监视,一旦符合规则,
* 就禁止创建,或kill 掉. (俺没写R3的部分,所以就此略掉了,不过R0的代码中还保留)
*
* 3.> 通过PsSetLoadImageNotifyRoutine 设置映像加载通知.禁止部分病毒DLL的加载,即
* 修改物理内存修改模块入口是这些模块返回失败,无法成功加载.
*
* 4.> 1个系统线程不断回写注册表的服务项.很暴力,不过hook一些更底层的操作注册表的函数
* ObXXXX之类的,就可以防止了; 注册一个DPC回调函数不断检查SSDT,保护自己的hook(由于俺
* 在调试时,一用KeSetTimerEx就会蓝,和IRQL有关,所以换用系统线程来实现,功能类似,
* ,保留DPC部分代码)
*
* 5.> 俺为了调试方便,加了一个修改IE首页,和piaoxue的驱动类型,就是暴力的回写注册表,很低级~~~
*
* btw: 病毒的作者好像是hackbase的XXXXXXXXXX,很强悍的一个驱动大牛,MS做病毒赚了不少银子.
* 不过作者的主要精力可能不在驱动上,nvmini.sys做的一般,没有用到太多的猥亵手法,比
* 如检测进程等完全不需要和R3通讯,直接在驱动中用一个线程,加个回掉函数,然后投递APC,
* 杀线程即可,HOOK SSDT等用烂的手段确实也太科普, 文件隐藏,注册表等都是很扫盲的手法,
* 可能作者没考虑太多吧.
*
* ---- 后记----
* 断断续续的逆nvmini.sys有一大会儿,可没有用F5,深感没有F5的艰难~
* 由于大3了,压力很大,专业的原因,也没多少业余时间来学内核,所以逆的很粗糙,不过功能都大致实现了.
* 还忘各位大牛海涵,见笑啦~ o(*.*)0
*
* PS;
* 为了防止被坏人A过去干坏事,已经把部分code做了相应的更改和删除, 不过有心学习的完全可