当前位置:首页 > web安全培训 > 正文

VBA“干净”利器,堪比一把隐形盾

VBA“干净”利器,堪比一把隐形盾

VBA“干净”利器,堪比一把隐形盾 掌握 VBA 清除技术,可以避开杀毒软件的“锁”;承载病毒的宏代码,也能通过巧妙手法被过滤、“洗白”,变得无害。本文将为大家介绍一...

VBA“干净”利器,堪比一把隐形盾

VBA“干净”利器,堪比一把隐形盾

掌握 VBA 清除技术,可以避开杀毒软件的“锁”;承载病毒的宏代码,也能通过巧妙手法被过滤、“洗白”,变得无害。本文将为大家介绍一些 VBA 清除的小技巧,让你的代码更加安全、干净。

一、VBA 的两种清除方式

首先,我们要明确,在 VBA 中,清除宏代码的方式一般有两种:一是通过修改二进制文件,二是通过字符串操作。

1、修改二进制文件

清除 VBA 宏代码最直接的方式是通过修改二进制文件。修改后的文件在代码运行时没有任何副作用,因为对应 VBA 代码的内存中其实还是存在的,但是杀毒软件和其他的检测工具却无法监测到它的存在。因此修改二进制文件已经成为了当今的 VBA 清除技术主流。

2、字符串操作

另外一种 VBA 清除方式是通过字符串操作。无论是修改二进制文件还是字符串操作,都需要确定在 VBA 代码中哪些部分需要清除,哪些可以保留。以字符串方式清除代码更为灵活,提高了代码的可读性,但是相对于二进制文件,其安全性还有待提高。

二、VBA 清除技巧

1、VBA清除宏代码中的空格

有时候写 VBA 代码习惯了自然的打空格,这会使 VBA 代码变得难以阅读,同时也会留下漏洞。因此,我们可以用 Trim 函数快捷地去除代码中的空格,这样就能让代码看起来干净利落了。

2、替换命令

常见的 VBA 查杀工具会通过查找字符串来揭示宏病毒的踪迹,因此在编写 VBA 代码时,我们可以尝试使用 Replace 函数,将一些常见的命令或字符串替换为不相关或随机的字符串,这样就可以躲过查杀工具的检测了。

3、加密代码

将 VBA 代码进行加密是最实用的防护代码,这样可以让宏病毒在查杀时无法被检测到,并难以恢复。目前常用的加密方式有:Base64、Sha1、AESCBC 等。其中 Sha1 是一种单向加密方式,可用于代码的验证,而 Base64,AESCBC 则能够将代码进行混淆,增加了查杀的难度。

三、VBA 清除技术的应用案例

下面,我们举一个实际应用案例,以方便大家理解和掌握 VBA 清除技术。

例如,我们需要发一封邮件附带着一份 VBA 宏代码的 Excel 文件,但是下文所述的方法都可以对 Excel 文件进行控制。首先,我们通过代码将生成的文件为“name1”,并保存在 tmp 目录下:
```VBA
newFileName = \"name1\"
filePath = \"C:\\tmp\"
ActiveWorkbook.SaveAs Filename:=filePath & \"\\\" & newFileName
```

然后,我们将这个文件读入内存中,将 VBA 宏代码另存为 tmp 目录下同名的 .bin 文件(这里我们默认排除了激活 Book1 的提示,读者可以对其进行更改,比如指定打开时是否允许更新,是否允许自动计算公式等):
```VBA
Const wb1 = &H10
Set InputFile = CreateObject(\"Scripting.FileSystemObject\").OpenTextFile(filePath & \"\\\" & newFileName, 1, False, wb1)
contents = InputFile.ReadAll
Set InputFile = Nothing
VarPtrAddress = VarPtr(contents)
dataLen = Len(contents)
Dim tmpBytes() As Byte
ReDim tmpBytes(1 To dataLen) As Byte
For i = 1 To dataLen
tmpBytes(i) = Asc(Mid(contents, i, 1))
Next i
Const adTypeBinary = 1
Const adModeReadWrite = 3
Set outputStream = CreateObject(\"ADODB.Stream\")
outputStream.Type = adTypeBinary
outputStream.Mode = adModeReadWrite
outputStream.Open
outputStream.Write tmpBytes
outputStream.SaveToFile filePath & \"\\\" & newFileName & \".bin\", adSaveCreateOverWrite
outputStream.Close
Set outputStream = Nothing
```

最后,我们通过以下代码重新载入文件,并清除文件中的 VBA 代码。
```VBA
newFileName = \"name1\"
filePath = \"C:\\tmp\"
ActiveWindow.Close False
Const adTypeBinary = 1
Const adModeReadWrite = 3
Set inputStream = CreateObject(\"ADODB.Stream\")
inputStream.Type = adTypeBinary
inputStream.Mode = adModeReadWrite
inputStream.Open
inputStream.LoadFromFile filePath & \"\\\" & newFileName & \".bin\"
tmpContent = inputStream.Read(inputStream.Size)
tmpLength = Len(tmpContent)
ReDim tmpBytes(1 To tmpLength) As Byte
For i = 1 To tmpLength
tmpBytes(i) = Asc(Mid(tmpContent, i, 1))
Next i
Set inputStream = Nothing
Set outputStream = Nothing
On Error GoTo endhere
newFileName = \"name1\"
filePath = \"C:\\tmp\"
Set outputStream = CreateObject(\"ADODB.Stream\")
outputStream.Type = adTypeBinary
outputStream.Mode = adModeReadWrite
outputStream.Open
For i = 1 To tmpLength Step 2
tmpWord = tmpBytes(i) * 256 + tmpBytes(i + 1)
outputStream.Write Chr(tmpWord)
Next i
outputStream.SaveToFile filePath & \"\\\" & newFileName, adSaveCreateOverWrite
outputStream.Close
Set outputStream = Nothing
Workbooks.Open filePath & \"\\\" & newFileName, False, False, 0
Application.Run \"ThisWorkbook.Macro1\"
ActiveWorkbook.Close False
MsgBox \"完成!\"
endhere:
If Err.Number <> 0 Then
MsgBox Err.Description, vbCritical
End If
End Sub
```

最新文章