One_Half:少尉指揮官?
Eugene Kaspersky
Kami Associates
B85506043 賴勝華
B85506050 江至軒
兩年前,出現一個令許多研究者都對它感染方式的運算。忠實的
VB讀者可能還記得Commander_Bomber(see VB) ,由於這個病毒會將自己插入到受感染的檔案中,因此帶給研究員許多麻煩。控制權並不會從檔案開頭直接轉移到病毒碼本身:在病毒的主體執行前,數的變型的code會將控制權從一個傳到令外一個。這表示用來計算病毒在檔案中節內位址的標準方法已不再適用,而且很多的
Anti-Virus scanner仍然不能正確的偵測出這種病毒(至少,在它們的預設模式下無法辦到)。現在,一個新的病毒出現了
– 變型的、分裂的例子” la Commander Bomber”。就如這個病毒,One_Half(這名字來自於它的內部字串’Dis is one half’)用將變型的程式碼寫到檔案中任意一個位置。這些’spots’ of code不只將控制權交給主要的病毒碼並執行迴圈將病毒主體編碼。Commander Bomber並沒有編碼,所以只要一掃描整個檔案便很容易發現,。而One_Half病毒不會被簡單的”hexadecimal search string”方法所偵測出來。更甚者,它解碼的Routine分割成許多部分,使的解碼更加有技巧性。
Excution of Infected File
當受感染的程式被執行,控制權會轉移到解碼的程式中。解碼的迴圈包含10部分的code分散在寄生檔案中任意的位置:前五個以記錄解碼迴圈初始化;剩下部分對病毒本體解碼。每一塊只包含一個擁有跳到下一組程式碼的短程立即跳躍指令之完整函式。最後一塊把控制權傳遞給病毒Installation Routine。
此病毒行為第一步先發出一個
”你在那裡嗎?(are you there?)”呼叫(INT 21h with ax = 4B53h)。假如病毒副本已經常駐,454Bh被傳到ax。如果呼叫得到回應,寄主檔案的記憶體Image遭到修改並且把控制權傳給他。假如病毒尚未常駐,它打開
INT 13h向量並讀取MBS以檢查病毒的存在,與有00D3h值之Offset 0025h Word做比較。假如情況符合要求,病毒跳過感染Routine並傳回給寄主程式。在MBS Offset 0180h的地方用072Eh值做相同的測試。這部分的啟動磁區並沒有病毒程式碼,我找不出理由此病毒為何不感染這種磁碟,除非說它為了防止與另一種程式的衝突。之所以如此的另一種可能性是病毒作者為了使開發此病毒時有一個乾淨的電腦環境。下一步病毒會用函式
INT 13h向量,ah = 08h檢查磁碟參數並且把原來的MBS(和它原來未經編碼的完整程式碼)存到第0磁軌的後8磁區。假如磁碟是正常的方法分割,這些就是在C槽DOS啟動磁區前的幾個磁區。然後他把程式碼的29h Bytes(從感染的磁區讀出病毒碼並把控制權傳給病毒)拷貝到原來的MBS,接著把MBS寫回磁碟。在硬碟感染之後,
One_Half以標準方法修改記憶體控制權區塊(MCBs),把自己偽裝成Command.com的副本(藉由把字串Command拷貝到MCB的程式名稱欄位)並掛上INT 21h。這Routine有點不可靠 – 在我測試的電腦上正常操作此病毒並未常駐,函式唯有在除錯器的掌控下執行才會正確。最後病毒將感染的寄主程式還原並傳遞控制權給它。假如檔案是
EXE格式,病毒讀取檔頭並更改Relaction Table所指到的Words,此外把解碼區塊傳回原來的表格內。此程序的最後一部分是須要的因為在感染中,病毒以從寄主程式隨機選出的
Bytes覆寫而有可能破壞在Relocation Table所包含的位元資訊。Loading from The Hard Drive
當電腦從受感染的
MBS開機時,病毒檔頭減少系統記憶體(Offset 0000:0413)把病毒本體拷貝到記憶體區因而保留,再把控制權傳給拷貝程式。Installation Routine掛上INT 13h和INT 1Ch,然後讀取原來的MBS並把控制權交給它。某些其它的多分裂(Multi - Partite)病毒以相同的方法利用INT 1Ch:程式碼檢查INT 21h Handler的位置:假如改變的話(如當DOS被載入時),它儲存現在的值並把新的INT 21h向量給指到病毒程式碼。
掛上的INT 13h有兩個公能;第一個是Trigger Routine,另一個是隱藏機制(Stealth Mechanism)的程式碼。一旦經由READ和WRITE函式(INT 13h,ah = 02h,03h)發現到感染的MBS,病毒重新導向此呼叫傳回未受影響的MBS或充滿0的緩衝區。
File Infection
One_Half攔截一長串的INT 21h函式:檔案感染的Routine從INT 21h Handler呼叫。在呼叫FINDNEXT和FINDFIRST函式(ah = 11h,12h,4Eh,4Fh)時病毒呼叫一個semi-stealth Routine來減少明顯的檔案長度。在打開,更名或執行一個檔案(ax = 3D??h,4B00h,56??h),感染Routine被呼叫。假如建立一個檔案(ah = 3Ch,5Bh),病毒儲存它的名字並在關檔時感染。
在感染之前病毒會檢查檔名,它只會感染副檔名為COM或是EXE的檔案。然後它會檢查下列字串SCAN,CLEAN,FINDVIRU,GUARD,NOD,VSAFE,MSAV:假如任何一個被找到的話,此檔將不會被感染。病毒特別注意CHKDSK工具程式並在此程式執行時將semi-stealth Routine禁能掉,防止CHKDSK被發出遺失磁碟空間的警訊。
One_Half進而檢查在兩個暫存器中儲存有關檔案的日期和時間特徵 – cx和dx。cx暫存器包含日期的特徵(年份,月份和日期);dx暫存器有時間的特徵(小時,分鐘和秒數)。One_Half把dx暫存器(儲存時間項)除以30,如果結果和秒數項相等的話,此檔案將不會被感染。奇怪的是,有1 / 30的機率病毒不會將感染過的檔案做上記號,所以有些檔案有可能被多次感染。
假如時間 / 日期特徵允許感染,病毒會執行它的Polymorphic Routine。它在檔案中選取幾個隨機的Offset,從這些Offset中拷貝出程式碼並覆寫有解碼迴圈部分的程式碼,編碼然後把病毒主體儲存在檔案結尾。病毒碼位於從檔尾算起固定的Offset,所以掃瞄程式可藉由檔案尾端偵測到這些病毒而非從檔頭開始 – 一個有用的弱點。不幸地,程式碼藉由隨機取樣的鍵值來編碼,因此必須寫一段特別的Routine來偵測此病毒。
The Trigger Routines
有兩個
Trigger Routines:第1個蠻複雜的,許多次嘗試去執行它都失敗。當此一Routine被呼叫時,病毒會分析DOS主要分割區或延伸分割區的大小,如果存在,它會將後者的一部份用XOR指令和一個隨機取樣的鍵值編碼。病毒在寫入動作前或讀取動作後偷偷地解碼(on-the-fly??)。此分割區在感染的系統下看的到,但隨著病毒的移除而遺失。我可以聽到打給防毒軟體經銷商中的電話抱怨說:”你們的軟體清掉了病毒,但也使我在硬碟上的資料不見了!”當病毒被安置在系統記憶體中,第
2個Routine會被呼叫病毒檢查產生的數值並測試系統的時間值:假如時機對的話,病毒會顯示如下訊息:Dis is one_half.並等待敲鍵動作。它也包含了內部字串”Did you leave the room?”Conclusions
One_Half對防毒軟體研發者帶來了許多問題。這之中最讓人印象深刻的是把此病毒從受感染磁碟中給移除的困難:通常置換磁碟MBS的簡單方法是不夠的。這使得我們更注意是值得的,並且當從受感染磁片中把它移除要極端的小心對於下一個新的威脅有任何預測的方法嗎?
One_Half
化名:
Free Love類型:
Memory-Recident,Multi-partite,Polymorphic,3544 Bytes long感染:
COM和EXE檔,硬碟的MBS磁碟中自我辨識:
Checks the Word at offset 0025h for the value 00D3h檔案中自我辨識:檢查檔案日期和時間特徵
記憶體中自我辨識:
Hex pattern in files:None possible
Hex pattern in MBS:33DB FABC 007C BED3 FB8E DB83
2E13 0404 B106 CD12 D3E0 BA80
Hex pattern in Memory:9CFB 80FC 1174 0580 FC12 752F
EB?? 5306 50B4 2FE8 7FFC 58E8
攔截:
Int 13h stealth and trigger routine ,Int 1ch for installation on loading from infection MBS,Int 21h for infection.Trigger: 對硬碟磁區編碼,顯示訊息。
移除:可能很困難因為它對DOS分ㄍ割區磁區做編碼。