“双枪2”之驱动分析

前言

前段时间360安全卫士发表了一篇对双枪2感染释放驱动行为的分析报告,报告地址:

http://www.freebuf.com/articles/web/167776.html

相比于双枪一代,它增加了HIVE文件保护,新增了WFP网络功能拦截,还有保护了自身的

系统回调不被修改,并且针对部分查杀驱动摘除了所有的关机回调,该驱动木马从一代后一直在更新活跃。

 

接下来我们将对该驱动进行再一次全面的分析,揭露它难以查杀的详细原因。

 

 

1驱动初始化部分

1.1驱动入口函数

主要为判断初始化一些变量,然后开启初始化线程工作。

入口函数所有代码:

图片[1]-Double Agent 2驱动行为分析-安全客

图1

先获取Nt基地址,后续生成设备名,随机化线程地址和获取注册表操作函数用:

图片[2]-Double Agent 2驱动行为分析-安全客

图2

然后初始化一些必要函数后续用于注入DLL模块:

图片[3]-Double Agent 2驱动行为分析-安全客

图3

从Ntdll函数中取出SSDTIndex,在KeServiceDescriptorTable取得函数地址 :

图片[4]-Double Agent 2驱动行为分析-安全客

图4

获取完成后判断下加载时机,由于该驱动重启后为Boot0驱动,判断下Ntfs文件系统驱动是否加载,:

图片[5]-Double Agent 2驱动行为分析-安全客

图5

 

创建设备名和符号链接跟应用层交互:

图片[6]-Double Agent 2驱动行为分析-安全客

图6

设备名是通过随机Nt基地址数字生成:

图片[7]-Double Agent 2驱动行为分析-安全客

图7

 

生成随机设备名,并使用这个随机设备注册关机回调,然后开启初始化线程:

图片[8]-Double Agent 2驱动行为分析-安全客

图8

 

 

 

1.2初始化线程

线程入口开始就调用KeEnterCriticalRegion

而该函数作用为禁止内核APC,暂停线程操作调用的就是内核APC

调用这个函数后线程就无法被暂停,然后再隐藏自身线程起地址,将其设置为ntos里面的一个随机地址。

图片[9]-Double Agent 2驱动行为分析-安全客

图9

 

 

然后开始挂钩模块加载回调初始化获取一些注册表函数地址并且重新创建随机文件名将自己驱动拷贝过去:

图片[10]-Double Agent 2驱动行为分析-安全客

图10

然后创建三个工作队列并且将模块注入到系统进程:

图片[11]-Double Agent 2驱动行为分析-安全客

图11

然后进入死循环,一直往系统中放置工作队列用于后续感染BootKit等一系列操作:

图片[12]-Double Agent 2驱动行为分析-安全客

图12

1.3注册表函数初始化

在初始化线程中调用了KeyHelperStartup,该函数主要为获取CmSetValueKey更底层的操作函数,函数内容为:

图片[13]-Double Agent 2驱动行为分析-安全客

图13

GetCellRoutineOffset 函数里面主要为获得一些硬编码偏移。

然后挂钩函数GetCellRoutine:

图片[14]-Double Agent 2驱动行为分析-安全客

图14

开启线程触发调用,触发完成后恢复钩子:

图片[15]-Double Agent 2驱动行为分析-安全客

图15

触发调用函数为:

图片[16]-Double Agent 2驱动行为分析-安全客

图16

在挂钩函数中使用RtlWalkFrameChain栈回溯来找到CmSetValueKey等函数调用。

并且校验线程是否为触发的线程,根据调用类型CallType来查找,

图片[17]-Double Agent 2驱动行为分析-安全客

图17

初始化代码完成后,接下来我们开始从网络阻断,文件保护,注册表保护,模块加载禁止,改首页模块注入,BootKit感染,自身回调防护几个部分的详细分析。

 

 

 

2 网络阻断

开启线程主要是分系统挂钩网络组件Xp系统为挂钩TCPIP Win7以上 注册WFP相关例程:

图片[18]-Double Agent 2驱动行为分析-安全客

图18

入口点先隐藏自身,将自身设置为

\\SystemRoot\\system32\\drivers\\volmgr.sys 驱动。

图片[19]-Double Agent 2驱动行为分析-安全客

图19

 

然后根据系统不同挂钩不同系统网络组件,对于XP系统:

图片[20]-Double Agent 2驱动行为分析-安全客

图20

 

Win7系统:

图片[21]-Double Agent 2驱动行为分析-安全客

图21

然后注册WFP回调:

图片[22]-Double Agent 2驱动行为分析-安全客

图22

 

回调函数中判断进程名字,一旦有匹配的进程名,则阻断该进程网络操作:

 图片[23]-Double Agent 2驱动行为分析-安全客

图23

 

匹配是通过Hash计算进程名字:

图片[24]-Double Agent 2驱动行为分析-安全客

图 24

 

 

3文件保护

先生成随机文件名驱动,并且将原来文件删除,删除前去除保护开关。

图片[25]-Double Agent 2驱动行为分析-安全客

图25

 

保护开关函数为,注册表函数类似,该函数频繁被调用,我们看下具体内容:

图片[26]-Double Agent 2驱动行为分析-安全客

图26

将当前线程设置为信任线程,注册表和文件挂钩就会放行该线程。

清理信任线程代码为:

图片[27]-Double Agent 2驱动行为分析-安全客

图27

 

然后将一些要保护的文件设置上。

自身文件:

图片[28]-Double Agent 2驱动行为分析-安全客

图28

 

Ntfs文件:

图片[29]-Double Agent 2驱动行为分析-安全客

图29

FastFat文件:

图片[30]-Double Agent 2驱动行为分析-安全客

图30

 

设置上保护后,挂钩Ntfs正式开启保护:

图片[31]-Double Agent 2驱动行为分析-安全客

图 31

该函数中首先获取ntfs驱动对象:

图片[32]-Double Agent 2驱动行为分析-安全客

图32

备份并替换所有的Ntfs FsdDisptach:

图片[33]-Double Agent 2驱动行为分析-安全客

图33

备份所有FastIo操作例程:

图片[34]-Double Agent 2驱动行为分析-安全客

图 34

替换:

图片[35]-Double Agent 2驱动行为分析-安全客

图35

FastFat类似,这里我们就不看了。

挂钩函数中:

图片[36]-Double Agent 2驱动行为分析-安全客

图36

CheckTheFileIsProtectAndCompleteTheRequest函数里面调用:

图片[37]-Double Agent 2驱动行为分析-安全客

图37

该函数主要是否为之前初始化的保护文件列表,依然是通过文件名Hash比对的,并且查看当前线程是否为可以信任线程。

图片[38]-Double Agent 2驱动行为分析-安全客

图38

如果不是则拒绝打开。

对于已经打开的文件对象,通过判断文件对象的FsContext来判断。

图片[39]-Double Agent 2驱动行为分析-安全客

图39

之前会先获取Hive文件对象。

图片[40]-Double Agent 2驱动行为分析-安全客

图40

判断是否一致:

图片[41]-Double Agent 2驱动行为分析-安全客

 

图41

如果为保护的文件则返回 STATUS_INVALID_PARAMETER。

Hive文件特殊处理。

图片[42]-Double Agent 2驱动行为分析-安全客

图42

图片[43]-Double Agent 2驱动行为分析-安全客

图43

 

 

 

4注册表保护

先设置自身开机顺序:

 

图片[44]-Double Agent 2驱动行为分析-安全客

图44

获取优先启动组:

图片[45]-Double Agent 2驱动行为分析-安全客

图45

 

然后将服务写入:

图片[46]-Double Agent 2驱动行为分析-安全客

图46

写入函数为:

图片[47]-Double Agent 2驱动行为分析-安全客

图47

优先使用更底层的CmSetValueKey函数,然后才使用系统调用:

图片[48]-Double Agent 2驱动行为分析-安全客

图48

 

初始化保护列表:

图片[49]-Double Agent 2驱动行为分析-安全客

图49

注册保护回调:

图片[50]-Double Agent 2驱动行为分析-安全客

图50

回调保护中:

图片[51]-Double Agent 2驱动行为分析-安全客

图51

Hash比对注册表键,检测是否为保护项目:

图片[52]-Double Agent 2驱动行为分析-安全客

图52

如果是且不是可信进程则拒绝打开。

 

 

5模块加载禁止

先设置回调:

图片[53]-Double Agent 2驱动行为分析-安全客

图53

分驱动和应用进程两种情况。

驱动文件判断是否需要Patch的模块。:

图片[54]-Double Agent 2驱动行为分析-安全客

图54

 

Hash跟 正则匹配aw***.sys等一些驱动。

图片[55]-Double Agent 2驱动行为分析-安全客

图55

如果是则Patch入口点:

图片[56]-Double Agent 2驱动行为分析-安全客

图56

对于应用层进程判断是否为浏览器,如果是则禁止网盾模块加载:

图片[57]-Double Agent 2驱动行为分析-安全客

图57

 

 

 

6改首页模块注入

 

先解密DLL,动态获取ntdll地址偏移.

图片[58]-Double Agent 2驱动行为分析-安全客

图58

图片[59]-Double Agent 2驱动行为分析-安全客

图59

解密文件并校验:

图片[60]-Double Agent 2驱动行为分析-安全客

图60

然后分别向Services.exe Explorer.exe注入。

图片[61]-Double Agent 2驱动行为分析-安全客

图61

分配内存:

图片[62]-Double Agent 2驱动行为分析-安全客

图62

拷贝代码:

图片[63]-Double Agent 2驱动行为分析-安全客

图63

然后注入执行:

图片[64]-Double Agent 2驱动行为分析-安全客

图64

 

7 BootKit感染

7.1查找活动分区

目前有不少机器安装了多块硬盘,需要先找活动磁盘的活动分区。

图片[65]-Double Agent 2驱动行为分析-安全客

图 65

然后写入BooKit组件,分三步写入,先写入引导驱动BootImage,然后写VBR,最后写入MBR,只有当前面一步操作成功后才继续下一步写入。

图片[66]-Double Agent 2驱动行为分析-安全客

图66

7.2 BootImage写入

 

写入BootImage前  先找磁盘末尾空余区域,如果没有空间则写入失败。

图片[67]-Double Agent 2驱动行为分析-安全客

图67

获取磁盘参数:

图片[68]-Double Agent 2驱动行为分析-安全客

图68

然后找到磁盘末尾写入位置:

图片[69]-Double Agent 2驱动行为分析-安全客

图69

再将BootImage加密后写入:

图片[70]-Double Agent 2驱动行为分析-安全客

图70

写入前先判断是否已经写入过了:

图片[71]-Double Agent 2驱动行为分析-安全客

图71

写入成功后,再写入VBR部分。

 

 

7.3 VBR写入

判断分区参数和是否为NTFS磁盘,仅支持Ntfs磁盘。

图片[72]-Double Agent 2驱动行为分析-安全客

图72

然后找下VBR跳转指令:

图片[73]-Double Agent 2驱动行为分析-安全客

图73

查找函数为:

图片[74]-Double Agent 2驱动行为分析-安全客

图74

判断下是否为ESLDRLoader,如果是则删除所有项目。

图片[75]-Double Agent 2驱动行为分析-安全客

图75

 

删除所有:

图片[76]-Double Agent 2驱动行为分析-安全客

图76

然后将病毒VBR压缩,合并写入:

图片[77]-Double Agent 2驱动行为分析-安全客

图77

并且将位置大小的参数全部异或加密保存在磁盘末尾。

图片[78]-Double Agent 2驱动行为分析-安全客

图78

 

 

7.4 MBR写入

获取磁盘信息:

图片[79]-Double Agent 2驱动行为分析-安全客

图79

先将VBR写入磁盘最开始的第3个扇区后0xF个扇区,后续即使VBR被修复,MBR部分依旧可以感染VBR

图片[80]-Double Agent 2驱动行为分析-安全客

图80

 

读取原始MBR:

图片[81]-Double Agent 2驱动行为分析-安全客

图81

将分区表拷贝进来,然后比对是否已经写入,如果没有则写入0号扇区:

图片[82]-Double Agent 2驱动行为分析-安全客

图82

7.4 保护BootKit

保护函数:

图片[83]-Double Agent 2驱动行为分析-安全客

图83

 

先初始化正常的VBR  MBR,用系统默认的。后续如果有应用程序读取则读到这份假的内容。

 

MBR部分:

图片[84]-Double Agent 2驱动行为分析-安全客

图84

VBR部分:

图片[85]-Double Agent 2驱动行为分析-安全客

图85

 

然后再安装磁盘底层钩子:

图片[86]-Double Agent 2驱动行为分析-安全客

图86

 

挂钩中判断,写则返回拒绝.

图片[87]-Double Agent 2驱动行为分析-安全客

图87

读取则返回假的数据:

图片[88]-Double Agent 2驱动行为分析-安全客

图88

 

 

8 自身回调防护

LoadImage 函数保护,拷贝头部0x20个字节:

图片[89]-Double Agent 2驱动行为分析-安全客

图89

 

比对是否一致,不一致则直接恢复:

图片[90]-Double Agent 2驱动行为分析-安全客

图90

 

注册表回调,判断特定键值打开返回值:

图片[91]-Double Agent 2驱动行为分析-安全客

图91

然后重新注册上:

图片[92]-Double Agent 2驱动行为分析-安全客

图92

摘除关机回调则通过硬编码获取链表头部:

图片[93]-Double Agent 2驱动行为分析-安全客

图93

 

获取:

图片[94]-Double Agent 2驱动行为分析-安全客

图94

然后遍历整个链表,只要不是自身注册的随机设备就摘除该关机回调:

图片[95]-Double Agent 2驱动行为分析-安全客

图 95

 

摘除:

图片[96]-Double Agent 2驱动行为分析-安全客

图96

 

 

总结

针对MBR和VBR系列木马泛滥的情况,360首创了针对此类顽固木马的强力查杀技术,并且能够同时自动检测和修复MBR及VBR ,发现电脑浏览器主页被反复篡改无法恢复、或出现卡慢等情况时,可使用360安全卫士进行扫描查杀,彻底清除该木马,360安全卫士已经第一时间支持该驱动木马查杀.。

图片[97]-Double Agent 2驱动行为分析-安全客

图97

 

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容