仅用于链接已经删却但是需要方便查阅的原文http://blog.csdn.net/zirconsdu/article/details/7997470
转载请注明出处http://blog.csdn.net/zirconsdu/article/details/8153813。
一些具体数据结构和具体路径隐去。
BMW木马样本分析
摘要
2011年底和某Hunter的谈话涉及到当时新检测到的病毒BMW,于是有了这篇分析报告.今天打开该目录时,卡巴又报发现病毒,又看到了这片文章.
曾经想象病毒侵入BIOS的危害,果然就出现了BMW,不过幸亏BMW只是用BIOS工具加入了个模块,而不是对BIOS的代码进行更深层次的修改.很久以前,就认为病毒侵入控制系统固件会有更大的社会危害,而修改重烧工业自动化系统的PLC控制器固件的病毒已经见诸报端.
正文
木马包含bios.exe和bmw.exe两个文件,前者负责感染bios和mbr,后者用于可执行文件感染,下载木马等。
一、BIOS感染文件
主要包括:
bios.exe--是BIOS感染主文件.
Flash.dll--用于装载sys文件.
bios.sys--是BIOS驱动服务文件,用于访问BIOS.
my.sys—一个文件驱动hook实现文件.
hook.bin--是BIOS文件和MBRex文件.(MBRex含在BIOS中,便于直接感染)
hook7k.bin---是hook.bin 中的7k内容,由MBRex注入到winlogon/WinInit.
winlogon/WinInit:下载calc.exe并执行.以fileprt服务装载my.sys,原理同使用beep.sys装载bios.sys.
1.1 bios.exe分析
1首先XOR 98h解码代码段中0x1000-0x1500的部分,解出代码段;XOR 89h解码出数据段部分;
2通过进程枚举,如果检测到瑞星或金山杀毒,则弹对话框,并对IME做hook,在用户按键时,执行3;如果没有发现瑞星和金山,直接执行第3步;
3解析参数和检测windows版本,参数主要是-w,-d,-u,其中-u是修复系统,-w和-d不明朗;一般情况下是继续执行感染系统;
4安装BIOS驱动,从资源中抽取出bios.sys,放入系统drivers文件夹;
然后会根据情况采用三种方式来安装BIOS驱动(\\.\bios设备):
A使用\\.\MyDeviceDriver(注:不是My.sys安装上的,是另一个RootKit)DLL注入技术,将Flash.dll依次注入到services.exe 和Explorer.exe来测试是否安装\\.\bios成功;
B如果A安装不成功,针对有瑞星或KV或WIN7或WIN2008R2版本,则直接LoadLibrary Flash.dll进行bios设备安装;
C大多数情况下,停止beep服务,使用bios.sys代替beep.sys,然后启动beep服务的方式来加载bios驱动安装bios设备,然后使用备份恢复beep.sys文件;
5然后会从资源中释放出过滤驱动My.sys;
6 DeviceIoControl(BIOS, 80102188h,..)来检测是否是Award BIOS,如果是,则DeviceIoControl(BIOS, 80102180h,..)备份当前BIOS为”c:\bios.bin”,打开文件,搜索“hookrom”(hook.bin的内容)来检查当前BIOS是否已经感染,如果没有感染,则从资源中释放出cbrom.exe(Award BIOS工具)和hook.rom(BIOS Patch,含MBR和Winlogon Patch),使用cbrom.exe c:\bios.bin /isa hook.rom将hook.rom作为ISA扩展BIOS添加进BIOS固件(另一个cbrom.exe c:\bios.bin /isa release为卸载扩展BIOS模块),然后使用DeviceIoControl(BIOS, 80102184h,..)将BIOS固件写入Flash中。
如果不是Award BIOS,则使用hook.rom中MBR直接替换原MBR。具体是,读取hook.rom,空过前面0x5D字节(BIOS部分)到MBR代码部分,复制MBRex到局部缓冲区(0x1C00字节,0x0E扇区);打开\\\\.\\PHYSICALDRIVE0且调整权限,读取MBR扇区到局部缓冲0x0E00处,检查是否感染(“int1” signature),若没有感染,则使用[0x01F8]值初始化[0x0226](是DayCounter),用0x0F00处0x80字节(从磁盘上读出的MBR部分)覆盖到0x0100处,主要是保存硬盘分区表。然后,将局部缓冲区14个扇区写入磁盘。
至此感染完毕。至于-u恢复,则是相反过程恢复回去。
1.2 flash.dll分析
用于以服务形式加载BIOS.sys, 主要功能在是DllMain中,其余代码是heap实现选择。
DLL_PROCESS_ATTACH DllLoad实现中,通过打开\\.\bios检测是否有Bios驱动,若没有,OpenSCManager =>> CreateService(bios) =>> StartService(bios);
DLL_PROCESS_DETACH的DllUnload实现中,OpenSCManager =>> ControlService (bios, STOP) =>> DeleteService(bios)
1.3 bios.sys分析
BIOS驱动文件,服务形式,安装\\.\bios设备,用于Ring0访问BIOS。
DriverEntry->DriverEntryImpl =>> IoCreateDevice("\\Device\\Bios")
主要是DriverIoControl,IOCTL_CODE有三个:
80102180h --- BackupBIOS
80102184h --- BurnBIOS
80102188h --- CheckBIOS
CheckBIOS流程:
使用MmMapIoSpace map BIOS物理地址[0x0F0000+0x10000] to liner space,然后搜索字符串“$@AWDFLASH”确定是否Award BIOS;找到后,在其后0x2A处,找SMI_PORT保存;然后通过 “_MS_”和“IMD_”辅助找到BIOS_SIZE并保存。
BackupBIOS流程:
MmMapIoSpace map BIOS物理地址[0x0F0000+BIOS_SIZE] to liner space =>> ZwCreateFile(\\DosDevices\\C:\\bios.bin) =>> ZwWriteFile。
BurnBIOS流程:
ZwCreateFile(\\DosDevices\\C:\\bios.bin) =>> ZwReadFile到ExAllocatePoolWithTag分配的缓冲区中;擦除Flash,将缓冲区中内容编程到Flash中;释放缓冲,关闭文件。
EraseFlash流程:
首先,写"$SMI"到EBP寄存器,然后OUT 0x29到SMI_PORT(是扩展端口),适当延时(应当延时相对比较长时间?),检测EBP是否TOGGLE为“SMI$”,若是,擦除成功。
ProgramFlash流程:
分页,每次编程16字节;依次编程;use page auto increament。
页编程流程:
首先,写"$SMI"到EBP寄存器,然后OUT 0x2F到SMI_PORT(是扩展端口),适当延时,检测EBP是否TOGGLE为“SMI$”,若是,页编程成功。
1.4 my.sys分析
IoCreateDevice(\\Device\\hide)钩到\\Device\\Harddisk0\\DR0的驱动disk.sys,对READ、WRITE、DEVICEIOCONTROL的DISPTACH进行HOOK,阻止MBRex扇区部分被读取和修改。在WINLOGON的感染代码里my.sys以fileprt服务的名义被加载。
DriverReadHook:
判断如果是读前63个扇区,则设置完成例程DriverReadCompletionRoutine,若不是,调用原读例程正常读;
DriverReadCompletionRoutine会根据读模式,找到相关缓冲区,清零,使这样无法读取MBRex(14扇区)所在的扇区。
DriverWriteHook:
根据写模式,得到相关缓冲区,如果是写前14扇区ÿ