导语:“双枪”木马的感染迹象是浏览器主页被篡改为带有“18299-9999”编号的网址导航站,它的主要特点是采用三重循环保护模式,使其具备了相比“鬼影”、“暗云”等MBR木马更强的自我保护能力。

顽固性木马病毒有感染MBR(磁盘主引导记录)的,有感染VBR(卷引导记录)的,还有用驱动对抗安全软件的,最近则出现了一种连环感染MBR和VBR的新型木马,我们将其命名为“双枪”木马。

1 摘要

1.png

图1

然后判断第一个分区是否为活动引导分区

2.png

图2

是活动分区读取VBR前面两个扇区,判断下引导分区是否为NTFS分区操作系统引导文件是BootMgr 或者是Ntldr。

3.png

图3

接下来读取后续的0xf个扇区

4.png

图4

将当前系统的BPB系统更新至恶意代码中同时将恶意代码刷回VBR。

5.png

图5

紧接系统读取VBR 控制权转交给VBR部分

6.png

图6

2.1 VBR执行部分

然后执行VBR 代码部分

7.png

图7

再次检查系统文件格式, 检查系统是否支持扩展Int13h。

8.png

图8

后续将读取从VBR开始16个扇区到 0x7e00 缓冲区。

9.png

图9

随后一个JMP指令被木马修改跳转到恶意代码执行。

10.png

图10

恶意代码执行

11.png

图11

为恶意代码执行分配空间

12.png

图12

跳转

13.png

图13

将4ce * 2 = 99c大小的恶意代码解密到刚刚开辟的高端地址执行。

14.png

图14

然后跳转到刚刚解密的高端地址执行 

解密系统原始VBR部分。

15.png

图15

读取磁盘末尾的加密sys文件到0x9300 缓冲区,后续开机部分会解密这部分数据

扇区总数0x5a。

16.png

图16

扇区偏移为 0x3a382c41 (磁盘大小为 500GB )

17.png

图17

读取完成后挂钩系统15h中断为后续获得执行机会。

挂钩Int15中断

18.png

图18

挂钩后地址为 9e800+630 = 9ee30

19.png

图19

随后返回到解密的原始VBR处继续执行。

20.png

图20

VBR执行后控制转移给了bootmgr加载处为0x2000。

2.2 BootMgr执行部分

BootMgr在获取系统内存信息时候调用Int15 而这个服务被木马挂钩

执行木马挂钩函数。

检测地址是否大于0x9000 bootmgr为 0x2000 且功能号是否E820。

21.png

图21

如果EB20 从系统返回结果中隐藏自身高端内存。

22.png

图22

如果是ntldr调用来且功能号位0xE820则搜索。

23.png

对应代码为

24.png

挂钩后代码为

25.png

跳转到 9e800 + 5e8 = 9ede8 处继续执行。

该函数主要设置硬件断点 dr0 dr2 dr0针对xp以上系统 dr2针对xp

挂钩Int1后。

26.png

中断函数为 64字节中 低16偏移 高16位段偏移

90000 + F09c = 9F09c

27.png

设置硬件断点  替换系统中断

28.png

该Int1中断会被触发多次, 当BootMgr后续代码被自身加载到 0x401000处执行后被触发

当系统控制权由 BootMgr  准备转移 Winload时候被也触发, 这是我们关心的中断。

即将被挂钩的系统函数为:

BootMgr! Archx86TransferTo32BitApplicationAsm

触发的相关指令为:

29.png

装载系统中断表

被中断 然后 往后 查找特征码  FF D0 查找范围为0x7f 然后

挂钩 。

30.png

该挂钩函数为一个通用函数 :

31.png

挂钩前函数:

32.png

当系统执行到BootMgr! Archx86TransferTo32BitApplicationAsm

挂钩后函数跳转到 9ef84处执行 。

33.png

该挂钩函数主要为恢复Archx86TransferTo32BitApplicationAsm,挂钩Winload 里面两处函数  为后续系统进入Winload引导获取执行权限。

挂钩1为  查找特征码  0F 00 D8  实际上为函数 Winload!OslArchTransferToKernel

相关指令为:

34.png

查找特征码:

35.png

后续接着查找 0xcb 范围为 0x40 查找处即为 retf指令

将其Patch。

Patch后代码为

36.png

挂钩2 为  查找特征码 68 12 00 00 E0 , 实际上为函数 Winload!OslpLoadAllModules

中对函数的调用 BlImgAllocateImageBuffer 并保存该函数地址。

37.png

查找特征码

38.png

并挂钩

挂钩后函数代码为

 

39.png

随后返回到系统流程

2.3 Winload执行部分

系统执行到Winload OslpLoadAllModules函数后, 其中偏移177处已经被Inline挂钩

跳转到 9ef1e处执行。

40.png

该函数主要作用

解密 磁盘尾部的0x5a个扇区数据并加载, 调用 BlImgAllocateImageBuffer  申请nt内存地址

解密调用 异或解密。

41.png

并且重定位好文件

42.png

调用 BlImgAllocateImageBuffer

43.png

随后系统将执行到  OslArchTransferToKernel,

将控制权交给 Nt 时候 触发第二个挂钩。

执行的函数为 9ed38,

该函数主要为 申请 BK_LDR_CONTEXT 结构 挂入系统Boot驱动加载链

并调用该解密驱动的入口函数。

44.png

3 NT系统加载后

3.1 联网下载改主页驱动

调用解密的驱动  该驱动主要功能为 网上下载另外一个改首页驱动。

441).png

创建下载线程

45.png

域名解析 分操作系统区分  Vista以上操作 使用Wsk函数 网络收发数据包。

先检测 该驱动是否加载

46.png

随后会检测该标志

47.png

联网下载代码

48.png

自己实现DNS域名解析  向53端口发解析数据包。

49.png

获取磁盘信息

50.png

计算发送统计数据

51.png

Base64编码后

52.png

发送给服务器 获取即将要下载驱动长度,将下载下来的数据异或解密后加载执行。

53.png

而后加载该驱动

54.png

3.2 改主页驱动

驱动被加载后 创建设备名

55.png

然后开启线程  检测MBR是否被感染

读取

56.png

接着使用IOCTL_DISK_GET_DRIVE_GEOMETRY获取磁盘大小。

57.png

58.png

然后读取磁盘末尾5a个扇区数据  并将开机驱动异或写入磁盘尾部。

59.png

写入成功后写入MBR 第个扇区后 F个扇区。

60.png

最后写入0号扇区完成感染,  并且会挂钩磁盘底层设备Dispatch钩子保护自身MBR不被改写。

61.png

且会删除Grub启动项

62.png

改首页部分主要通过挂钩 ProcessNotify注入进程完成。

63.png

注入的进程名字通过Hash计算

64.png

注入进程名

65.png

修复。

完结。

源链接

Hacking more

...