0x01 前言
暗云Ⅳ的隐藏技术真的厉害,通过调试暗云Ⅳ,可以提高调试技巧,也能熟悉MBR相关知识。
内核分析部分参考 火绒的 “隐匿者”病毒团伙技术升级传播病毒 暴力入侵电脑威胁全网用户
0x02 环三感染MBR
1. 获取系统所在磁盘的DeviceNumber
通过打开逻辑盘符\\.\%c,这里格式化的是系统盘符, 通过GetSystemDirectory获得.
向\\.\%c链接的磁盘发送IOCTL_STORAGE_GET_DEVICE_NUMBER获取磁盘的DeviceNumber。
2. 格式化\\.\PhysicalDrive%d,这里将DeviceNumber格式化
3.保存原来的Boot分区
打开\\.\PhysicalDrive0后,读取0x400的内容,判断是否为GPT分区,如果是则不支持。判断是否已经写过Mbr,写过则退出。判断是否有其他软件写了Mbr,会进行覆盖,这里我们展开。
4. 重写MBR,写入驱动shellcode
首先将MBR改写
改写后的MBR为:
之后将内核shellcode从dat文件中写入2-53扇区,在下次开机时刻进行执行。
0x03 调试内核
1.使用IDA调试MBR
设置虚拟机的VMX文件
debugStub.listen.guest32 = "TRUE" debugStub.hideBreakpoints = "TRUE" bios.bootDelay = "3000"
打开IDA--Debugger--Attach--Remote GDB debugger
Hostname为localhost,port为8832
启动虚拟机后点击上面窗口OK按钮,弹出选择附加进程,选择第一个,点OK
在MBR载入内存的地方下断,也就是断在0x7c00
F9运行起来,停在0x7C00的地方
这个时候最好Alt+s下,选择16位的模式,因为这个时候还未进入32位模式
现在我们就可以开始调试了。
2.我们可以查看环三程序中写入mbr的代码,这个时候由于是mbr代码,是16位模式,我们修改到16bit后,可以看到代码
可以对照着调试的代码看
Hook ZwCreateSection, 获得内核的执行权.
开机过程中可以对ZwCreateSection下断点, 跟踪暗云Ⅳ驱动的感染过程.
2.线程回调, 等待csrss进程启动
x64
.for(r $t0=0;$t0<0x40;r $t0 = $t0+1){r $t1=poi($t0*8+nt!PspCreateThreadNotifyRoutine);.if($t1==0){.continue};r $t1=$t1&0xFFFFFFFFFFFFFFF0;r $t1=poi($t1+8);r $t1;u $t1;ln $t1;}
x86
.for(r $t0=0;$t0<0x40;r $t0 = $t0+1){r $t1=poi($t0*4+nt!PspCreateThreadNotifyRoutine);.if($t1==0){.continue};r $t1=$t1&0xFFFFFFF8;r $t1=poi($t1+4);r $t1;u $t1;ln $t1;}
使用上面的windbg脚本,可以看到暗云Ⅳ驱动注册的PspCreateThreadNotify函数, 同时看到暗云Ⅳ驱动申请的shellcode内存大小为0x20000, 起始地址为fffffa8003dd5000. 而PspCreateThreadNotify偏移为0x5824
3.对该shellcode+0x5035下断点,进入Hook Disk的逻辑
对该shellcode+0x5035下断点,进入Hook Disk的逻辑,在调试win7上对不同磁盘类型实现上,我们在shellcode+0x521c下断点,针对miniport为atapi/msahci是一类处理方式,针对miniport是storahci是一类处理方式,不是上述的则为另一类,win7上共三种Hook方式。
参考: