BMW Trojan 样本分析

仅用于链接已经删却但是需要方便查阅的原文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.exebmw.exe两个文件,前者负责感染biosmbr,后者用于可执行文件感染,下载木马等。

 

一、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通过进程枚举,如果检测到瑞星或金山杀毒,则弹对话框,并对IMEhook,在用户按键时,执行3;如果没有发现瑞星和金山,直接执行第3步;

3解析参数和检测windows版本,参数主要是-w,-d,-u,其中-u是修复系统,-w-d不明朗;一般情况下是继续执行感染系统;

4安装BIOS驱动,从资源中抽取出bios.sys,放入系统drivers文件夹;

然后会根据情况采用三种方式来安装BIOS驱动(\\.\bios设备):

A使用\\.\MyDeviceDriver(注:不是My.sys安装上的,是另一个RootKitDLL注入技术,将Flash.dll依次注入到services.exe Explorer.exe来测试是否安装\\.\bios成功;

B如果A安装不成功,针对有瑞星或KVWIN7WIN2008R2版本,则直接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.exeAward BIOS工具)和hook.romBIOS Patch,含MBRWinlogon Patch),使用cbrom.exe c:\bios.bin /isa hook.romhook.rom作为ISA扩展BIOS添加进BIOS固件(另一个cbrom.exe c:\bios.bin /isa release为卸载扩展BIOS模块),然后使用DeviceIoControl(BIOS, 80102184h,..)BIOS固件写入Flash中。

如果不是Award BIOS,则使用hook.romMBR直接替换原MBR。具体是,读取hook.rom,空过前面0x5D字节(BIOS部分)到MBR代码部分,复制MBRex到局部缓冲区(0x1C00字节,0x0E扇区);打开\\\\.\\PHYSICALDRIVE0且调整权限,读取MBR扇区到局部缓冲0x0E00处,检查是否感染(“int1” signature),若没有感染,则使用[0x01F8]值初始化[0x0226](是DayCounter),用0x0F000x80字节(从磁盘上读出的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_DETACHDllUnload实现中,OpenSCManager =>> ControlService (bios, STOP) =>> DeleteService(bios)

 

1.3    bios.sys分析

BIOS驱动文件,服务形式,安装\\.\bios设备,用于Ring0访问BIOS

DriverEntry->DriverEntryImpl =>> IoCreateDevice("\\Device\\Bios")

主要是DriverIoControlIOCTL_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) =>> ZwReadFileExAllocatePoolWithTag分配的缓冲区中;擦除Flash,将缓冲区中内容编程到Flash中;释放缓冲,关闭文件。

EraseFlash流程:

首先,写"$SMI"EBP寄存器,然后OUT 0x29SMI_PORT(是扩展端口),适当延时(应当延时相对比较长时间?),检测EBP是否TOGGLE“SMI$”,若是,擦除成功。

ProgramFlash流程:

分页,每次编程16字节;依次编程;use page auto increament

页编程流程:

首先,写"$SMI"EBP寄存器,然后OUT 0x2FSMI_PORT(是扩展端口),适当延时,检测EBP是否TOGGLE“SMI$”,若是,页编程成功。

 

1.4    my.sys分析

IoCreateDevice(\\Device\\hide)钩到\\Device\\Harddisk0\\DR0的驱动disk.sys,对READWRITEDEVICEIOCONTROLDISPTACH进行HOOK,阻止MBRex扇区部分被读取和修改。在WINLOGON的感染代码里my.sysfileprt服务的名义被加载。

DriverReadHook:

判断如果是读前63个扇区,则设置完成例程DriverReadCompletionRoutine,若不是,调用原读例程正常读;

DriverReadCompletionRoutine会根据读模式,找到相关缓冲区,清零,使这样无法读取MBRex14扇区)所在的扇区。

DriverWriteHook:

根据写模式,得到相关缓冲区,如果是写前14扇区ÿ

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值