第86章 恶意软件分析(六):Bootkit分析、MBR/VBR感染、UEFI恶意软件
Bootkit,说白了就是比Rootkit更底层的恶意软件。它抢在操作系统启动之前就加载了,所以杀毒软件根本来不及反应。我早年分析过一个Bootkit样本,那家伙直接趴在MBR里,每次开机都比Windows早一步拿到控制权。嗯,今天我们就来聊聊这个。
Bootkit的核心原理
Bootkit的生存之道就一个字——「早」。它要确保自己比操作系统更早运行。怎么做到?
- 感染MBR:主引导记录,硬盘的第一个扇区。BIOS加载它,它再加载操作系统。Bootkit就藏在这里。
- 感染VBR:卷引导记录,每个分区的第一个扇区。如果MBR被保护了,那就搞VBR。
- 感染UEFI固件:现代电脑都用UEFI了,Bootkit也跟着升级,直接藏在固件里。
我个人习惯把Bootkit分成两类:传统BIOS下的和现代UEFI下的。两者的分析思路完全不同。
关键点:Bootkit的最终目标通常是挂钩系统内核的加载过程,注入自己的代码,然后隐藏自身。它不一定要破坏系统,但一定要「活着」。
MBR/VBR感染分析
先说说传统的MBR感染。MBR只有512字节,其中还包含分区表。Bootkit的代码必须塞进这狭小的空间里。怎么办?
我见过一个样本,它的MBR代码只有不到200字节。剩下的空间用来存放加密的payload。MBR加载后,先解密payload,然后把它写到内存的高地址区域,最后跳转过去执行。
分析MBR样本,我建议你这么做:
- 提取MBR镜像:用dd命令或者WinHex直接读取物理磁盘的前512字节。
- 反汇编:MBR代码是16位实模式汇编,用IDA或者ndisasm都行。
- 定位挂钩点:看它修改了哪个中断向量(通常是INT 13h),或者它怎么劫持后续的引导流程。
; 一个典型的MBR Bootkit入口代码片段
; 注意:这是简化后的示例,实际样本会更复杂
org 0x7C00
start:
; 保存原始的INT 13h向量
mov ax, 0x3513
int 0x21
mov [original_int13], bx
mov [original_int13+2], es
; 安装自己的INT 13h处理程序
mov ax, 0x2513
mov dx, new_int13
int 0x21
; 加载真正的引导扇区
mov ax, 0x0201
mov bx, 0x7C00
mov cx, 0x0002 ; 从第二个扇区读取
mov dx, 0x0080
int 0x13
jmp 0x0000:0x7C00
new_int13:
; 这里拦截磁盘读写,隐藏恶意代码
; ...
jmp far [original_int13]
original_int13:
dd 0
避坑指南:我曾经在分析一个VBR样本时,直接拿虚拟机跑,结果样本检测到虚拟环境就自毁了。后来我改用硬件调试器才抓到它的真实行为。所以,分析Bootkit时,最好先用静态分析摸清它的反调试逻辑。
UEFI恶意软件分析
UEFI时代的Bootkit更狡猾了。它不再躲在512字节的MBR里,而是直接寄生在固件中。UEFI固件是一个完整的PE文件系统,Bootkit可以是一个独立的DXE驱动,也可以是一个修改过的SMM模块。
为什么会这样?因为UEFI规范允许在固件中加载第三方驱动。恶意软件就利用这个机制,把自己伪装成一个合法的UEFI驱动。
分析UEFI恶意软件,你需要掌握:
- UEFI固件结构:了解FV(固件卷)、FFS(固件文件系统)、GUID等概念。
- UEFI协议:恶意软件通常会使用某些UEFI协议来获取系统信息或修改内存。
- PE解析:UEFI驱动本质上是PE32+格式,但入口点是EFI_ENTRY_POINT。
我记得有一个著名的UEFI Bootkit叫「LoJax」,它感染了系统的UEFI固件,即使重装系统也无法清除。分析它的过程让我印象深刻——它把自己注入到固件的DXE阶段,然后挂钩了UEFI运行时服务。
注意:分析UEFI恶意软件需要专门的硬件工具,比如SPI编程器。因为固件存储在SPI Flash中,普通软件无法直接读取。别指望用WinHex就能搞定。
Bootkit分析流程
我总结了一套分析Bootkit的流程,你参考一下:
- 确定感染类型:是MBR、VBR还是UEFI?用磁盘编辑器看一眼就知道了。
- 提取样本:对于MBR/VBR,直接读扇区。对于UEFI,需要读SPI Flash。
- 静态分析:反汇编,找挂钩点,分析payload。
- 动态分析:用模拟器(比如QEMU)或者硬件调试器跑一下,看它到底干了什么。
- 清除方案:理解了它的行为,才能写出干净的清除工具。
下面这张图展示了Bootkit从加载到隐藏的完整流程:
实战分析技巧
分析Bootkit时,有几个技巧能让你少走弯路:
- 用模拟器跑:QEMU配合GDB,可以单步调试Bootkit的启动过程。我习惯在QEMU里加载一个干净的磁盘镜像,然后手动写入Bootkit样本。
- 监控磁盘I/O:Bootkit通常会修改磁盘读写。用Process Monitor或者自己写一个过滤驱动,可以抓到它的行为。
- 分析内存转储:Bootkit加载后,它的代码会驻留在内存中。用WinDbg或者Volatility分析内存转储,能找到它的踪迹。
个人经验:我曾经遇到一个Bootkit,它会在系统启动后自我删除MBR中的代码,只保留内存中的副本。这样你关机后再开机,它就消失了,但系统已经被感染。这种「一次性」Bootkit最难分析,因为它只在内存中存活。
总结
Bootkit分析是恶意软件分析中的硬骨头。它涉及底层硬件、固件和操作系统内核,任何一个环节出错都可能导致分析失败。但反过来,如果你能搞定Bootkit,其他类型的恶意软件对你来说就是小菜一碟。
嗯,今天就聊到这里。记住,分析Bootkit时,耐心比技术更重要。有时候一个样本要反复跑几十次才能抓到它的真实行为。
公众号:蓝海资料掘金营,微信deep3321