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

  1. <a name="f2AW7"></a>
  2. # <br />
  3. <a name="JPlcc"></a>
  4. # **复合文档(OLE文件)二进制解析**
  5. - Office文档(如:.doc、.ppt、.xls等)很多是复合文档(OLE文件),所有文件数据都是存储在一个或多个流中。
  6. - 微软将所有宏相关的内容都放进了**vbaProject.bin**文件中,只要文件中不包含vbaProject.bin,就不可能含有宏,也就不可能是宏病毒。于是,微软推出了以x结尾(docx)和以m结尾(**docm**)的两大类文档文件,这两类文件均是OpenXML文件,但是以x结尾的文件中不含有vbaProject.bin,但是可能被远程**docm**注入宏病毒
  7. - 将docx.docx文件的文件名修改为docx.zip就可以以压缩包的形式打开.docx文件
  8. - document.xml:记录Word文档的正文内容
  9. - footer*.xml:记录Word文档的页脚
  10. - header*.xml:记录Word文档的页眉
  11. - comments.xml:记录Word文档的批注
  12. - footnotes.xml:记录Word文档的脚注
  13. - endnotes.xml:记录Word文档的尾注
  14. - doc文件结构
  15. - **Header**(文件头 512字节):记录着文件解析必须的所有参数
  16. - **Sector**(扇区):实际数据存储的地方,**复合文档中数据都是以扇区为单位进行存储的**。扇区内存储的数据种类有Stroage、Stream、Directory、FAT、Mini-FAT(属于Mini-Sector)、DIF等,但**每个扇区中只能存储一种数据类型**。每个Sector都有一个SectorID,但是Header所在的扇区ID是-1,并不是0。Header后的Sector才是“第一个”Sector,其SectorID为0。
  17. - Sector:一般是512字节
  18. - Mini-Sector:64字节
  19. - **Storage与Stream的功能相当于文件系统中的文件夹与文件的功能**。Storage中是没有任何“实质性”的内容的,只会记录其包含的Stream和Storage,是一个Stream和Storage的目录。“实质性”的内容全在Stream里面。
  20. - **Directory**是一个Storage和Stream的索引。这一部分存储空间是用来记录Storage和Stream的存储结构以及名称、大小、起始地址等信息。
  21. - **FAT**:**索引表**。数据在硬盘上的存储是离散的,需要有一个索引表能找到这些数据,索引表中存放着数据的起始地址(即扇区的),索引中一般还有一条数据指向下一条索引,类似于链表。FAT实际记录了该扇区指向的下一个扇区的地址。
  22. - **DIFAT:分区表**,是FAT的索引表。FAT也是存储在Sector里面,但是FAT本身也比较大,所以利用DIFAT作为FAT的索引表,记录了FAT所在的Sector的起始地址以及逻辑关系。
  23. - docx文档结构
  24. ![image.png](https://cdn.nlark.com/yuque/0/2021/png/1756019/1615278214830-6186462b-fe84-4929-b487-0bfd9b051a52.png#height=318&id=css12&margin=%5Bobject%20Object%5D&name=image.png&originHeight=318&originWidth=211&originalType=binary&ratio=1&size=12088&status=done&style=none&width=211) ![image.png](https://cdn.nlark.com/yuque/0/2021/png/1756019/1615278265299-0091b59e-bf4d-47a4-9641-a17cd6862d91.png#height=295&id=FbvdX&margin=%5Bobject%20Object%5D&name=image.png&originHeight=295&originWidth=500&originalType=binary&ratio=1&size=113944&status=done&style=none&width=500)
  25. - **利用settings.xml.rels远程执行宏病毒**:在**rels文件Relationship标签**中,**Target**表示零件的文件位置,正常情况下,给值是相对路径,且存在于压缩包中。通过恶意构造Target,使其执行远程文件,就可以打开远程文件。
  26. ![image.png](https://cdn.nlark.com/yuque/0/2021/png/1756019/1615278436307-873877e2-9ac0-4781-b530-594977064133.png#height=96&id=rL2UX&margin=%5Bobject%20Object%5D&name=image.png&originHeight=96&originWidth=497&originalType=binary&ratio=1&size=42435&status=done&style=none&width=497)
  27. - 利用webSetings.xml.rels窃取NTLM hash(Word模板注入攻击)
  28. - NTLM hash:Windows系统下Security Account Manager中保存的用户密码hash,获得后用hashcat可以解码
  29. <a name="lIeHm"></a>
  30. # 宏
  31. - 是一种批量处理的称谓,是指能组织到一起作为独立的命令使用的一系列的命令,可以实现任务执行的自动化。
  32. - 当前Microsoft Office的宏是使用Visual Basic for Applications(**VBA**)编写的,是Microsoft流行的Visual Basic编程语言的一种变体专门为Office建的
  33. - 分类
  34. - 内建宏:局部宏,位于文档中,对该文档有效,如文档打开(AutoOpen)、保存、打印、关闭等
  35. - 全局宏:位于office模板中,为所有文档所共用,如打开Word程序(AutoExec)
  36. <a name="OZXjs"></a>
  37. # **宏代码数据结构解析**
  38. <br />
  39. - 可以使用“**Attribute**”字符来定位宏代码在文档中的存储位置
  40. - 宏代码里的数据是按组进行划分的,每组包括一个字节的标志,和8个元素。一般来说一个元素对应一个字节,标志字Flag的每一位对应一个元素,表示这一个元素的具有几个字节(0-1个字节,1-2个字节)。
  41. <a name="caLXY"></a>
  42. # 宏病毒
  43. <a name="fzwEX"></a>
  44. ## 病毒常用宏
  45. - 自动宏可用于宏病毒自动运行
  46. ![image.png](https://cdn.nlark.com/yuque/0/2021/png/1756019/1615193997512-6b66e167-1819-4343-a290-5bb60109ef97.png#height=304&id=p2ZwC&margin=%5Bobject%20Object%5D&name=image.png&originHeight=358&originWidth=554&originalType=binary&ratio=1&size=150857&status=done&style=none&width=470)
  47. <a name="HDUys"></a>
  48. # 常见行为
  49. <a name="Fncsw"></a>
  50. ## 1、自我保护
  51. <a name="ZTA1I"></a>
  52. ### 1)禁止提示信息
  53. ```python
  54. On Error Resume Next 如果发生错误,不弹出出错窗口,继续执行下面语句
  55. Application.DisplayAlerts = wdAlertsNone 不弹出警告窗口
  56. Application.DisplayStatusBar = False 不显示状态栏,以免显示宏的运行状态
  57. Options.VirusProtection = False 关闭病毒保护功能,运行前如果包含宏,不提示
  58. Options.SaveNormalPrompt = False '修改公用模板时自动保存,不弹出提示'

2)屏蔽命令菜单,不能查看宏

  1. 通过特定宏定义:
  2. Sub ViewVBCode()
  3. MsgBox "Unexcpected error",16
  4. End Sub
  5. Disable或者删除特定菜单项,用来使“工具—宏”菜单失效的语句:
  6. CommandBars(“Tools”).Controls(16).Enabled = False

3)隐藏真实代码

  1. 1、在“自动宏”中,不包括任何感染或破坏的代码,但包含了创建、执行和删除新宏(实际进行感染和破坏的宏)的代码;
  2. 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)
  • 联合调用

    1. Set obj = CallByName(obj, "Text1", VbGet)
    2. Set obj = CallByName(obj, "Font", VbGet)
    3. CallByName obj, "Size", VbLet, 50
    4. '以上代码="Me.Text1.Font.Size = 50"

    4)Alias()

  • 通过它所标识的别名对动态库中的函数进行引用

  • 例:clothed作为GetUpdateRect的别名,调用clothed函数相当于调用user32库里的GetUpdateRect函数。

    1. 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的数据,实际上就是文件备注信息里的数据

image.png

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