第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样本,我建议你这么做:

  1. 提取MBR镜像:用dd命令或者WinHex直接读取物理磁盘的前512字节。
  2. 反汇编:MBR代码是16位实模式汇编,用IDA或者ndisasm都行。
  3. 定位挂钩点:看它修改了哪个中断向量(通常是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的流程,你参考一下:

  1. 确定感染类型:是MBR、VBR还是UEFI?用磁盘编辑器看一眼就知道了。
  2. 提取样本:对于MBR/VBR,直接读扇区。对于UEFI,需要读SPI Flash。
  3. 静态分析:反汇编,找挂钩点,分析payload。
  4. 动态分析:用模拟器(比如QEMU)或者硬件调试器跑一下,看它到底干了什么。
  5. 清除方案:理解了它的行为,才能写出干净的清除工具。

下面这张图展示了Bootkit从加载到隐藏的完整流程:

Bootkit 感染与执行流程 感染阶段 MBR/VBR/UEFI固件 加载阶段 早于操作系统启动 挂钩阶段 中断/协议/服务 隐藏阶段 文件/进程/网络隐藏 持久化阶段 重装系统无法清除 载荷执行 键盘记录/后门 分析工具:IDA Pro、QEMU、SPI编程器、WinHex 传统BIOS UEFI 混合型

实战分析技巧

分析Bootkit时,有几个技巧能让你少走弯路:

  • 用模拟器跑:QEMU配合GDB,可以单步调试Bootkit的启动过程。我习惯在QEMU里加载一个干净的磁盘镜像,然后手动写入Bootkit样本。
  • 监控磁盘I/O:Bootkit通常会修改磁盘读写。用Process Monitor或者自己写一个过滤驱动,可以抓到它的行为。
  • 分析内存转储:Bootkit加载后,它的代码会驻留在内存中。用WinDbg或者Volatility分析内存转储,能找到它的踪迹。

个人经验:我曾经遇到一个Bootkit,它会在系统启动后自我删除MBR中的代码,只保留内存中的副本。这样你关机后再开机,它就消失了,但系统已经被感染。这种「一次性」Bootkit最难分析,因为它只在内存中存活。

总结

Bootkit分析是恶意软件分析中的硬骨头。它涉及底层硬件、固件和操作系统内核,任何一个环节出错都可能导致分析失败。但反过来,如果你能搞定Bootkit,其他类型的恶意软件对你来说就是小菜一碟。

嗯,今天就聊到这里。记住,分析Bootkit时,耐心比技术更重要。有时候一个样本要反复跑几十次才能抓到它的真实行为。


公众号:蓝海资料掘金营,微信deep3321