VB基础
- 宏是使用VB语言编写的
- 基本语法
- Sub:过程,没有返回值,一段宏一定是从sub开始执行的
- Function:函数,有返回值
- 基本函数
- VBA容错率高:可以不写括号或者混淆大小写
- 对象
- 代码和数据的组合,我们在使用对象时,要么使用对象的属性(就是数据),要么使用对象的方法(就是代码)。通过 “对象.属性/方法”的方式使用对象的属性/方法。
- 例:ActiveDocument.BuiltInDocumentProperties(5)中就是使用了ActiveDocument对象的BuiltInDocumentProperties()方法,参数是5。 ```powershell Sub autoopen() b End Sub
Function b() MsgBox ActiveDocument.BuiltInDocumentProperties(5) End Function
<a name="f2AW7"></a>
# <br />
<a name="JPlcc"></a>
# **复合文档(OLE文件)二进制解析**
- Office文档(如:.doc、.ppt、.xls等)很多是复合文档(OLE文件),所有文件数据都是存储在一个或多个流中。
- 微软将所有宏相关的内容都放进了**vbaProject.bin**文件中,只要文件中不包含vbaProject.bin,就不可能含有宏,也就不可能是宏病毒。于是,微软推出了以x结尾(docx)和以m结尾(**docm**)的两大类文档文件,这两类文件均是OpenXML文件,但是以x结尾的文件中不含有vbaProject.bin,但是可能被远程**docm**注入宏病毒
- 将docx.docx文件的文件名修改为docx.zip就可以以压缩包的形式打开.docx文件
- document.xml:记录Word文档的正文内容
- footer*.xml:记录Word文档的页脚
- header*.xml:记录Word文档的页眉
- comments.xml:记录Word文档的批注
- footnotes.xml:记录Word文档的脚注
- endnotes.xml:记录Word文档的尾注
- doc文件结构
- **Header**(文件头 512字节):记录着文件解析必须的所有参数
- **Sector**(扇区):实际数据存储的地方,**复合文档中数据都是以扇区为单位进行存储的**。扇区内存储的数据种类有Stroage、Stream、Directory、FAT、Mini-FAT(属于Mini-Sector)、DIF等,但**每个扇区中只能存储一种数据类型**。每个Sector都有一个SectorID,但是Header所在的扇区ID是-1,并不是0。Header后的Sector才是“第一个”Sector,其SectorID为0。
- Sector:一般是512字节
- Mini-Sector:64字节
- **Storage与Stream的功能相当于文件系统中的文件夹与文件的功能**。Storage中是没有任何“实质性”的内容的,只会记录其包含的Stream和Storage,是一个Stream和Storage的目录。“实质性”的内容全在Stream里面。
- **Directory**是一个Storage和Stream的索引。这一部分存储空间是用来记录Storage和Stream的存储结构以及名称、大小、起始地址等信息。
- **FAT**:**索引表**。数据在硬盘上的存储是离散的,需要有一个索引表能找到这些数据,索引表中存放着数据的起始地址(即扇区的),索引中一般还有一条数据指向下一条索引,类似于链表。FAT实际记录了该扇区指向的下一个扇区的地址。
- **DIFAT:分区表**,是FAT的索引表。FAT也是存储在Sector里面,但是FAT本身也比较大,所以利用DIFAT作为FAT的索引表,记录了FAT所在的Sector的起始地址以及逻辑关系。
- docx文档结构
 
- **利用settings.xml.rels远程执行宏病毒**:在**rels文件Relationship标签**中,**Target**表示零件的文件位置,正常情况下,给值是相对路径,且存在于压缩包中。通过恶意构造Target,使其执行远程文件,就可以打开远程文件。

- 利用webSetings.xml.rels窃取NTLM hash(Word模板注入攻击)
- NTLM hash:Windows系统下Security Account Manager中保存的用户密码hash,获得后用hashcat可以解码
<a name="lIeHm"></a>
# 宏
- 是一种批量处理的称谓,是指能组织到一起作为独立的命令使用的一系列的命令,可以实现任务执行的自动化。
- 当前Microsoft Office的宏是使用Visual Basic for Applications(**VBA**)编写的,是Microsoft流行的Visual Basic编程语言的一种变体专门为Office建的
- 分类
- 内建宏:局部宏,位于文档中,对该文档有效,如文档打开(AutoOpen)、保存、打印、关闭等
- 全局宏:位于office模板中,为所有文档所共用,如打开Word程序(AutoExec)
<a name="OZXjs"></a>
# **宏代码数据结构解析**
<br />
- 可以使用“**Attribute**”字符来定位宏代码在文档中的存储位置
- 宏代码里的数据是按组进行划分的,每组包括一个字节的标志,和8个元素。一般来说一个元素对应一个字节,标志字Flag的每一位对应一个元素,表示这一个元素的具有几个字节(0-1个字节,1-2个字节)。
<a name="caLXY"></a>
# 宏病毒
<a name="fzwEX"></a>
## 病毒常用宏
- 自动宏可用于宏病毒自动运行

<a name="HDUys"></a>
# 常见行为
<a name="Fncsw"></a>
## 1、自我保护
<a name="ZTA1I"></a>
### 1)禁止提示信息
```python
On Error Resume Next 如果发生错误,不弹出出错窗口,继续执行下面语句
Application.DisplayAlerts = wdAlertsNone 不弹出警告窗口
Application.DisplayStatusBar = False 不显示状态栏,以免显示宏的运行状态
Options.VirusProtection = False 关闭病毒保护功能,运行前如果包含宏,不提示
Options.SaveNormalPrompt = False '修改公用模板时自动保存,不弹出提示'
2)屏蔽命令菜单,不能查看宏
通过特定宏定义:
Sub ViewVBCode()
MsgBox "Unexcpected error",16
End Sub
Disable或者删除特定菜单项,用来使“工具—宏”菜单失效的语句:
CommandBars(“Tools”).Controls(16).Enabled = False
3)隐藏真实代码
1、在“自动宏”中,不包括任何感染或破坏的代码,但包含了创建、执行和删除新宏(实际进行感染和破坏的宏)的代码;
2、将宏代码字体颜色设置成与背景一样的白色等
常用技术
1、自动执行
- 用户执行某种操作时自动执行的宏(行为):如Sub botton(),当用户单击文档中的按钮控件时,宏自动执行;
- Auto自动执行:如Sub AutoOpen()和Sub AutoClose(),分别在文档打开和关闭时自动执行。
2、隐秘执行
- 隐藏提示信息
- 屏蔽菜单按钮和快捷键
代码 | 措施 |
---|---|
On Error Resume Next | 如果发生错误,不弹出错误对话框 |
Application.DisplayStatusBar = False | 不显示状态栏,避免显示宏的运行状态 |
Options.SaveNormalPrompt = False | 修改公用模板时在后台自动保存,不给任何提示 |
EnableCancelKey = wdCancelDisabled | 使不可以通过ESC键取消正在执行的宏 |
Application.ScreenUpdating = 0 | 不让屏幕更新,让病毒执行时不影响计算机速度 |
Application.DisplayAlerts = wdAlertsNone | 不让Excel弹出报警信息 |
CommandBars(“Tools”).Controls(“Macro”).Enabled = 0 | 屏蔽工具菜单中的“宏”按钮 |
CommandBars(“Macro”).Controls(“Security”).Enabled = 0 | 屏蔽宏菜单的“安全性” |
CommandBars(“Macro”).Controls(“Macros”).Enabled = 0 | 屏蔽宏菜单的“宏” |
CommandBars(“Tools”).Controls(“Customize”).Enabled = 0 | 屏蔽工具菜单的“自定义” |
CommandBars(“View”).Controls(“Toolbars”).Enabled = 0 | 屏蔽视图宏菜单的“工具栏” |
CommandBars(“format”).Controls(“Object”).Enabled = 0 | 屏蔽格式菜单的“对象” |
3、调用外部例程和命令执行
- 网络
- shell
- powershell
- run exe
- windows服务
外部例程 | 介绍 |
---|---|
MSXML2.ServerXMLHTTP | Xmlhttp是一种浏览器对象, 可用于模拟http的GET和POST请求 |
Net.WebClient | 提供网络服务 |
Adodb.Stream | Stream 流对象用于表示数据流。配合XMLHTTP服务使用Stream对象可以从网站上下载各种可执行程序 |
Wscript.shell | WScript.Shell是WshShell对象的ProgID,创建WshShell对象可以运行程序、操作注册表、创建快捷方式、访问系统文件夹、管理环境变量。 |
Poweshell | PowerShell.exe 是微软提供的一种命令行shell程序和脚本环境 |
Application.Run | 调用该函数,可以运行.exe文件 |
WMI | 用户可以利用 WMI 管理计算机,在宏病毒中主要通过winmgmts:\\.\root\CIMV2隐藏启动进程 |
Shell.Application | 能够执行sehll命令 |
4、字符串隐写(混淆)
1)Chr()
- 返回以数值表达式值为编码的字符。利用ascii码,逃避字符串扫描。
2)Replace()
- 替换字符串,返回一个新字符串,其中某个指定的子串被另一个子串替换。
3)CallByname()
- 允许使用一个字符串在运行时指定一个属性或方法
- 例:CallByName Text1, “Move”, vbMethod, 100, 100 == Text1.Move(100,10)
联合调用
Set obj = CallByName(obj, "Text1", VbGet)
Set obj = CallByName(obj, "Font", VbGet)
CallByName obj, "Size", VbLet, 50
'以上代码="Me.Text1.Font.Size = 50"
4)Alias()
通过它所标识的别名对动态库中的函数进行引用
例:clothed作为GetUpdateRect的别名,调用clothed函数相当于调用user32库里的GetUpdateRect函数。
Public Declare Function clothed Lib "user32" Alias "GetUpdateRect" (prestigiation As Long, knightia As Long, otoscope As Long) As Boolean
5)利用窗体、控件隐藏信息
控件的各个属性(name、caption、controtiptext、等)都可以成为危险字符串的藏身之所。而仅仅查看宏代码,分析者无法得知这些字符串内容,分析者必须进入编辑器查看窗体属性,这大大增加了分析的难度。
- 使用时需要调用标签控件属性
6)利用文件属性
- 同样是将一切能存储数据的地方利用起来
- 举例:ActiveDocument.BuiltinDocumentProperties Comments的数据,实际上就是文件备注信息里的数据
7)恶意行为字符串
字符串 | 描述 |
---|---|
http | URL连接 |
CallByName | 允许使用一个字符串在运行时指定一个属性或方法,许多宏病毒使用CallByName执行危险函数 |
Powershell | 可以执行脚本,运行.exe文件,可以执行base64的命令 |
Winmgmts | WinMgmt.exe是Windows管理服务,可以创建windows管理脚本 |
Wscript | 可以执行脚本命令 |
Shell | 可以执行脚本命令 |
Environment | 宏病毒用于获取系统环境变量 |
Adodb.stream | 用于处理二进制数据流或文本流 |
Savetofile | 结合Adodb.stream用于文件修改后保存 |
MSXML2 | 能够启动网络服务 |
XMLHTTP | 能够启动网络服务 |
Application.Run | 可以运行.exe文件 |
Download | 文件下载 |
Write | 文件写入 |
Get | http中get请求 |
Post | http中post请求 |
Response | http中认识response回复 |
Net | 网络服务 |
WebClient | 网络服务 |
Temp | 常被宏病毒用于获取临时文件夹 |
Process | 启动进程 |
Cmd | 执行控制台命令 |
createObject | 宏病毒常用于创建进行危险行为的对象 |
Comspec | %ComSpec%一般指向你cmd.exe的路径 |
常见宏病毒
Mellisa病毒
自动往OutLook邮件用户地址簿中的前50位用户发送病毒副本
Word.Macro.Concept
这是最常见的宏病毒。1995年8月Microsoft运送给数百家OEM公司的名为“Microsoft Compatibility Test”的CD ROM中存在这种病毒。当打开受感染的文档时,屏幕上会出现一个带有文本“ 1”的消息框
Word.Macro.Nuclear
核中的所有宏都受到保护,无法对其进行查看或编辑。被感染的NORMAL.DOC包含名为AutoExec,AutoOpen,DropSuriv,FileExit,FilePrint,FilePrintDefault,FileSaveAs,InsertPayload等九个宏
Word.Macro.Colors
该病毒包含以下宏:AutoOpen, AutoClose, Autoexec, Filenew, Fileexit, Filesave, Filesaveas, Toolsmacro等等
Word.Macro.Hot
此病毒在会WINWORD6.INI配置文件中创建一个包含“hot date”的条目。该“hot date”是从当前日期算起的14天将触发病毒
Word.Macro.DMV
这是一种“demonstration”概念病毒
Word.Macro.FormatC**(TrojanFormat)**
这是特洛伊木马,不会自我复制,会格式化C:
常用工具
- oledump.py:提取宏代码(不需要运行,静态分析)
- decoder_ay.py和-d参数:它可以将文件中的exe数据dump下来。python oledump.py -s 14 -D decoder_ay.py -d 1.doc >1.exe
- VBA Password Bypasser:解密加密宏
- VBE解码脚本
- .VBE
- 使用Microsoft Visual Basic for Application动态调试(打开VBA工程)
- 按住shift键->点击开启宏功能->释放shift键
- 按下alt+f11打开宏调试器
- 可以使用内置messagebox把看不全的命令打印出来
- Office Visualization Tool:微软提供的office二进制格式查看工具,用于学习doc,xls,ppt等文档二进制格式;
防御
1、禁用宏
- 开发工具菜单下的“宏”,单击“宏安全性”,在随后的出现的对话框中选择“禁用所有宏
- 无法阻止启动word时Autoexec.DOT中的宏和Normal.DOT中的宏自动执行。
2、越过自动宏
- 在Office打开文档的时候,始终按住SHift键
3、恢复被宏病毒破坏的文档
- 清除Autoexec.DOT和Normal.DOT
4、利用宏结构
- 破坏宏标志
- 定位宏工程所使用的Directory,将Type位修改为0,即非法Directory,这样Office办公软件在解析VBA工程时,会因为非法Directory而导致解析错误。
- 用于宏的Directory:Macro、VBA、_VBA_PROJECT_CUR
分析技巧
- 直接在混淆后的宏代码中搜索常用的字符串、API等
Macro 4.0
- 古老的XLM宏
- 语法
- EXEC
- ALTER
- HALT
- 默认情况下,XLM宏代码存储在xl\Macrosheets\文件夹下的Sheet1.xml中
- 自动加载
- Auto_Open
- Auto_Close(免杀性更强)
- XLM宏只需要将需要执行宏的单元格名称设置为Auto_Open或Auto_Close即可实现宏代码的自动加载
- 调用系统API
- 浅隐藏:可以通过检查单元格是否有缺来判断,取消隐藏可以看到恶意宏代码
- 深隐藏:使用010editor修改隐藏程度
- 85 00往后数九个字节,这里的值应该是00 01 02中的其中一项。其中00 表示不隐藏,01表示浅隐藏(可通过鼠标右键取消隐藏) 02表示深度隐藏(无法在Excel中找到)
- 把深隐藏修改为浅隐藏就能又看到javascript