花式感染 Windows PE 病毒的一百種方法,你中過招嗎?

csdn 發佈 2020-08-10T22:46:26+00:00

這是一篇基礎性文章,將介紹Windows PE病毒, 包括PE病毒原理、分類及感染方式詳解,並通過案例進行介紹。

作者 | 楊秀璋,責編 | 夕顏

出品 | CSDN博客

這是一篇基礎性文章,將介紹Windows PE病毒, 包括PE病毒原理、分類及感染方式詳解,並通過案例進行介紹。


PE病毒概念

什麼是PE病毒?

PE病毒是以Windows PE程序為載體,能寄生於PE文件或Windows系統的病毒程序。

PE病毒數量非常之多,包括早起的CIH病毒,全球第一個可以破壞計算機硬體的病毒,它會破壞主辦的BIOS,對其數據進行擦寫修改。再比如熊貓燒香、機器狗等等,其危害非常之大。

什麼叫感染?

說到病毒,不得不提感染。感染是指在儘量不影響目標程序(系統)正常功能的前提下,而使其具有病毒自身的功能。什麼叫病毒自身的功能呢?一個病毒通常包括如下模塊:

  • 感染模塊: 被感人程序同樣具備感染能力
  • 觸發模塊: 在特定條件下實施相應的病毒功能,比如日期、鍵盤輸入等
  • 破壞模塊
  • 其他模塊

CIH病毒

CIH病毒是一種能夠破壞計算機系統硬體的惡性病毒。這個病毒產自TW,原集嘉通訊公司工程師陳盈豪在其於TW大同工學院念書期間製作。最早隨國際兩大盜版集團販賣的盜版光碟在歐美等地廣泛傳播,隨後進一步通過網絡傳播到全世界各個角落。CIH的載體是一個名為「ICQ中文Chat模塊」的工具,並以熱門盜版光碟遊戲如「古墓奇兵」或Windows95/98為媒介,經網際網路各網站互相轉載,使其迅速傳播。目前傳播的主要途徑主要通過Internet和電子郵件,當然隨著時間的推移,其傳播主要仍將通過軟盤或光碟途徑。

CIH病毒曾入榜全球十大計算機病毒之首,該病毒引起了許多重要部門的嚴密關注,其原因不言而喻。如果指揮、通信、政務等系統受到了CIH病毒的威脅甚至破壞,其後果不堪設想。

如果我們要編寫PE病毒,則需要掌握以下的關鍵:

  • 病毒的重定位
  • 獲取API函數地址
  • 文件搜索
  • 內存映射文件
  • 病毒如何感染其他文件
  • 病毒如何返回到Host程序


PE病毒的分類

以感染目標進行分類,包括:

(1) 文件感染

將代碼寄生在PE文件,病毒本身只是PE文件的一部分,依賴於感染目標,通常也叫HOST文件,控制權獲得也是以目標程序運行來獲得的。分為:

  • 傳統感染型:以Win32彙編程序編寫為主
  • 捆綁釋放型:編寫難度較低,通過高級語言均可編寫,將目標程序和病毒程序捆在一起,和捆綁器有相似之處

(2) 系統感染

將代碼或程序寄生在Windows作業系統,該類病毒越來越多,它不感染具體文件,但是它會在作業系統中保存自己的實體。同時也可以通過系統啟動的方法來獲取控制權。傳播途徑包括:

  • 即時通信軟體,如QQ尾巴
  • U盤、光碟
  • 電子郵件
  • 網絡共享
  • 其他途徑


傳統文件感染型


1.感染思路

當我們了解PE文件格式之後,要了解PE文件感染型病毒就非常容易了。如下圖所示,左邊是一個正常的PE文件,右邊是PE病毒感染該程序時的修改,可以看到病毒代碼在最後面,通常它是一種新節的形式。我們知道PE文件是由多個節組成的,病毒代碼為了融入目標程序會以節的形式,同時修改PE文件頭。

對感染來說,它一方面需要使得對方具備自己的功能,另一方面也不破壞對方程序的功能。所以病毒代碼執行完畢之後,它必須要將控制權交給原始程序,從而防止病毒被發現。

  • 優點: 被感染後的程序主題依然是目標程序,不影響目標程序圖標,隱蔽性稍好
  • 缺點: 對病毒代碼的編寫要求較高,通常是彙編語言編寫,難以成功感染自校驗程序


PE病毒典型案例

下面是演示代碼,感染本目錄下的test.ext文件,它沒有破壞性,tset.exe被感染後,首先執行病毒代碼,然後執行自身代碼。如下圖所示,存在四個文件。其中main.exe是PE病毒程序,它會感染當前目錄下名為「test.exe」的文件。這裡僅是測試PE病毒感染代碼,沒有破壞功能。

  • calc.exe:計算器
  • notepad.exe:記事本
  • test.exe:測試PE文件
  • main.exe:PE病毒程序

第一步,我們嘗試打開test.exe文件。它是一個正常的PE文件,前面的文章也分析過,它包括兩個彈窗,如下圖所示。

第二步,使用OD打開test.exe如下圖所示,發現起始地址為0x00401000,該exe程序大小為2.50KB。

第三步,運行main.exe程序,它是PE病毒。注意,它會彈出如下圖所示對話框,這是為了方便演示,而真實的PE病毒不會提示你信息。程序是兩位大佬所寫,其中一位是Hume前輩,另一位 ^ _ ^

同時,如果360會查殺該病毒,添加信任即可。但當我們在真實惡意樣本分析時,一定要在虛擬機等有保護環境下進行。

IDA分析mian.exe如下圖所示:

第四步,此時test.exe文件大小已經增加為6.50KB,說明其已經被惡意感染。

雙擊test.exe顯示如下圖所示,它會先彈出一個感染測試對話框,然後才是接下來的正常程序對話框。

用OD動態分析,發現程序入口地址是0x004042DC。說明該程序先執行PE病毒,之後才執行正常的程序,而真實的PE病毒不會只簡單的彈出提示窗口,而會隱蔽的進行一些破壞或收集信息。

第五步,將被感染的「test.exe」重命名為「test-ok.exe」,然後將記事本修改為「test.exe」,因為我們的代碼只感染當前目錄下「test」命名的文件。

接著運行「test-ok.exe」程序,發現打開記事本也會彈出如下圖所示的對話框,接著才是記事本,說明該程序也被感染。

第六步,通過同樣的方法感染計算器程序,如下圖所示。

寫到這裡,該案例就演示完畢,這是一個傳統典型的PE病毒感染示例。


3.關鍵技術


(1) 重定位

重定位在前面講PE文件格式化時介紹過,尤其DLL文件常見重定位。因為DLL文件會加載到不同的位置,如果再按照VA地址定位會出現差錯,所以會出現重定位。對於病毒程序也是一樣的,它有相應的代碼去感染目標程序,而目標程序有很多,病毒程序寫在目標程序什麼位置呢?這就需要病毒代碼去定位目標程序的位置,就要利用重定位技術。

  • 關鍵點:病毒代碼目標寄生位置不固定
  • shellcode類似:通常需要注入遠程系統,但這段代碼在遠程系統什麼位置有時並不能確定,另外遠程系統的環境有時也不能準確感知,故需要使用重定位和API函數自獲取技術

① 為什麼需要重定位呢?

下面是一段原始碼(PE最小文件案例),通過mas32編譯生成的目標程序。原始碼非常簡單,就是調用invoke,通過invoke調用MessageBox函數,包括四個參數;程序第二個語句是invoke調用退出。這裡彈出對話框涉及兩個字符串szCap和szMsgOK。

  • invoke MessageBox, , addr szMsgOK, addr szCap, 40h+1000h
  • invoke ExitProcess,

當該程序編譯之後,反彙編結構顯示如下圖所示,比如Start位置,MessageBox函數包括四個參數,我們採用PUSH壓入堆棧,再CALL調用該函數。

  • push offset off_00401000
  • push offset off_00401014

圖中紅色圓圈顯示的是PE文件代碼的二進位部分,它是一個VA的地址,即RVA+ImageBase。程序在編譯後,某些VA地址(如變量Var 004010xxh)就已經以二進位代碼的形式固定,這就是需要重定位的原因。

下圖展示正常情況的ImageBase,值為400000H。比如HEX數據為「00104000」,由於高位在後面,所以對應的地址是「00 40 10 00」。

如果ImageBase為600000H,則代碼不做重定位,PUSH壓入堆棧的值為401000和401014。而此時的值什麼也不是,通過數據窗口定位地址發現不存在。左下角可以看到,00601000位置才是存放的數據。所以,重定位需要將這裡的40修改為60。

總之,如果病毒代碼插入位置不固定,也會遇到類似的問題。病毒代碼必須通過重定位解決類似的問題。

② 下面看看病毒代碼植入HOST文件後的位置差異。

左邊是病毒在感染前的VAR位置,其地址為004010xx;當這段代碼插入到另一個HOST文件後,如右圖所示,變量的實際位置和預期位置出現了差異,而重定位的關鍵是知道這個差異是多少,後續遇到的各種變量或地址都可以通過這種差異方式校正。

  • 重定位本質:修正實際地址與預期地址的差異

但是根據HOST特徵逐一硬編碼這種方式不太可取,其繁瑣且未必準確,所以採用另一種方法,病毒代碼運行過程中自我重定位。首先它計算剛才的差異值,接著調用call delta將下一條語句開始位置壓入堆棧,此時堆棧頂端存放的是pop ebp語句,它在內存匯總真實的地址;再後面是sub減法操作,ebp減去offset delta;最後當我們需要重定位時,比如使用varl變量,重定位則為ebp+offset來消除差異,此時eax中存放varl在內存中的真實地址。

CALL語句功能:

  • 將下一條語句開始位置壓入堆棧
  • JMP到目標地址執行


(2) API函數自獲取

前面介紹了PE文件的引入函數節,它是目標程序作者編寫的,當調用外部DLL中的API函數時,通過引入函數節將這種關係定義出來,系統加載時就能加載對應的DLL文件並找到相應的API函數,再將地址寫入到PE文件的引入函數表中,程序運行時就直接從引入函數表中取地址進行調用,這是正常的PE文件運行過程。

但對於病毒程序來說,它是一段代碼,當它感染另外一個程序時,它是否能修改目標程序的引入函數節,而使得其可以服務病毒代碼呢?從原理上來說,這是可以實現的,但非常複雜,因為要在引用函數節添加東西一定會導致其他結構的變化,需要做很多的修正工作,這也可能破壞原有功能。所以對於病毒來說,它需要自己去獲取API函數地址,並且沒有引入函數節的支撐,但它又必須要使用很多API函數來實現病毒功能。

  • 關鍵點:需要使用的API函數,但無引入函數節支撐
  • shellcode類似:通常需要注入遠程系統,但這段代碼在遠程系統什麼位置有時並不能確定,另外遠程系統的環境有時也不能準確感知,故需要使用重定位和API函數自獲取技術

① 如何獲取API函數地址呢?

  • DLL文件的引出函數節
  • Kernel32.dll:核心API函數為 GetProcAddress和LoadLibraryA
  • GetProcAddress函數:包括兩個參數,模塊基地址和想要獲取API函數名稱,它將動態獲得DLL函數的入口地址
  • LoadLibraryA函數:將制定的DLL動態連結庫加載到內存中,返回值為DLL文件加載到內存中的基地址

② 當我們獲得GetProcAddress和LoadLibraryA地址後,想獲取任何一個API函數地址都可以。那麼,怎麼獲取這兩個函數的地址呢?

  • 首先,獲得kernel32.dll的模塊加載基地址
  • 一種方法是採用硬編碼(兼容性差),另一種方法通過Kernel模塊中的相應結構和特徵定位
  • 其次,通過Kernel32.dll的引出目錄表結構定位具體函數的函數地址

③ 接著,我們看看獲取Kernel32模塊基地址的典型方法。

  • 定位Kernel32模塊中任何一個地址,然後按照模塊首地址特徵(對齊於10000H,PE文件開始標識MZ)向低地址遍歷定位PE文件頭
  • Kernel32模塊內的地址從何處獲得?

– 程序入口代碼執行時Stack頂端存儲的地址

– SEH鏈末端

– PEB相關數據結構指向了各模塊地址

– Stack特定高端地址的數據

注意:不同作業系統存在差別


(3) 目標程序遍歷搜索

通常以PE文件格式的文件(如EXE、SCR、DLL等)作為感染目標,其關鍵點為全盤查找或者部分盤符查找,遍歷算法包括遞歸或非遞歸。在對目標進行搜索時,通常調用兩個API函數:

  • FindFirstFile
  • FindNextFile

搜索目標進行感染算法如下:


(4) 文件感染

感染的關鍵是病毒代碼能夠得到運行,常用方法包括:

  • 選擇合適的位置放入病毒代碼(已有節、新增節)
  • 將控制權交給病毒代碼,如修改程序入口點AddressofEntryPoint,或者在原目標代碼執行過程中運行病毒代碼(EPO技術,EntryPoint Obscuring)

同時,病毒代碼執行時,程序的正常功能不能被破壞,即控制權的交換。

  • 感染時,記錄原始「程序控制點位置」
  • 病毒代碼執行完畢之後,返回控制權
  • 避免重複感染,感染標記

感染文件的基本步驟為:

①判斷目標文件開始的兩個字節是否為「MZ」

②判斷PE文件標記「PE」

③判斷感染標記,如果已被感染過則跳出繼續執行HOST程序,否則繼續

④獲得Directory(數據目錄)的個數(每個數據目錄信息占8個字節)

⑤得到節表起始位置(Directory的偏移地址+數據目錄占用的字節數=節表起始位置)

⑥得到目前最後節表的末尾偏移(緊接其後用於寫入一個新的病毒節)節表起始位置+節的個數*(每個節表占用的字節數28H)=目前最後節表的末尾偏移

⑦開始寫入節表和病毒節

⑧修正文件頭信息


捆綁釋放型

捆綁釋放型感染實現起來比較簡單,目前很大一部分病毒程序都採用這種方法。捆綁釋放型感染時將目標HOST程序作為數據存儲在病毒體內,當執行病毒程序時,它先執行病毒程序,然後還原並執行HOST文件,從而保證被感染的程序本身能正常運行,不會引起一些異樣。

  • 熊貓燒香病毒左邊是一個正常程序(QQ),感染之後會將病毒放在前面,正常程序放在後面,程序運行之後,病毒會拿到控制權。但是程序圖標會顯示前面的病毒程序,顯示熊貓燒香,這也是一個明顯的被感染特徵。
  • 優點: 編寫簡單、效率高,可感染自校驗程序
  • 缺點: 被感染後的程序主體是病毒程序,易被發現(程序疊加+釋放執行),程序圖標問題


系統感染型

系統感染型本身不對PE文件做任何感染操作,但它感染的目標是作業系統,也是一種寄生類的方式,只是寄生目標有所不同。這類病毒通常為獨立個體,不感染系統內的其他文件。

兩個關鍵問題:

  • 如何再次獲得控制權——自啟動由於該程序不感染PE文件,它沒有HOST文件,所以如何再次獲得控制權是一個關鍵性問題,也是目標很多病毒程序設計時不得不考慮的問題。此時和作業系統自啟動相關,病毒必須依賴於該機制再次獲得控制權。
  • 如何傳播可移動存儲介質(U盤、移動硬碟刻錄光碟等)網絡共享電子郵件或其他應用


1.控制權再次獲取

下面簡單講解控制權再次獲取的自啟動方式。首先看看作業系統啟動流程:

  • BIOS --> 硬碟MBR --> 活動分區DBR --> 系統內部

整個啟動流程也是控制權傳遞的過程,包括現在提出的可信計算,也是對控制權一步一步的校驗,控制流程的數據完整性或行為的校驗。對於作業系統本身,它的啟動方式很多,系統內部包括:

  • 註冊表中的鍵值
  • 系統中的特定位置
  • 配置文件
  • 特定路徑的特定文件,如Explorer.exe(顯示桌面)

下圖展示了Autoruns軟體看到Windows作業系統進行自啟動的選項。如果病毒本身能很好地結合這套機制,它可以做的事情非常多,並且具有很好的隱蔽性。

其他啟動方式:

  • 利用系統自動播放機制Autorun.inf比如U盤病毒或光碟病毒就是利用U盤或光碟的自動播放功能。目前,也有一些U盤插入之後,不需要你去雙擊這個U盤,裡面的程序就會自啟動。
  • 在其他可執行文件嵌入少量觸發代碼修改引入函數節啟動DLL病毒文件(添加相應結構,初始化代碼觸發)在特定PE文件代碼段插入觸發代碼等(只需定位可執行程序並運行)
  • DLL劫持:替換已有DLL文件很多應用程式或作業系統執行時,都會去執行DLL文件,如果病毒將自身做成一個DLL文件,同時將系統DLL文件替換。可想而知,系統啟動時,它是根據文件名啟動的,此時病毒DLL文件就會拿到控制權,如果拿到控制權之後再進一步裝載原始DLL文件,這樣系統的本身機制也不會受到影響,隱蔽性更強。該方法非常常見,甚至有一些病毒程序將反病毒軟體可依賴的DLL文件替換。


2.病毒的傳播方式

一切可對外交互的渠道都可傳播,包括:

  • 各類存儲設備(軟盤、光碟、U盤、移動硬碟、智能設備)
  • 各類網絡通信方式(QQ、MSN、Email、淘寶旺旺、微信、微博等)
  • 各類網絡連接方式(有線、wifi、藍牙等)
  • 各類網絡應用(迅雷、BT等)

郵件蠕蟲越來越常見,其中以郵件附件的形式進行傳播較多。附件中可能包含病毒包括exe文件、rar文件、pdf文件、doc文件、xls文件、jpg文件、chm文件等。下圖是一個包含病毒的郵件附件,顯示為一個word文檔,後綴名doc,圖標顯示也是word。但它的真實後綴是scr(屏保),它其實是利用了一種技術,在文件名里插入翻轉字符,然後將翻轉字符之後的其他字符進行了翻轉,它的完整文件名應該是「5月TW行lmcod.scr」。這也是一種欺騙性很強的攻擊手法。

再補充一個通過可移動存儲設備傳播的非感染式病毒,即Autorun.inf。右圖顯示了Autorun.inf文件,如果文件存在U盤根目錄,當我們雙擊這個U盤時,它就會觸發對應的病毒,如果選擇U盤盤符右鍵打開或打開資源管理器,這是進入的也是病毒程序。當然下面的演示是計算器程序。

[AutoRun]open=mspaint.exeshell\open=打開(&O)shell\open\Command=calc.exeshell\open\Default=1shell\explore=資源管理器(&X)shell\explore\Command=calc.exe

還有一類是偽裝的文件夾,如下圖所示photo.exe文件,當Windows作業系統默認不顯示「.exe」時,它就能偽裝成文件夾,當我們雙擊之後就會運行病毒,同時可以打開某個文件夾進行隱蔽。

最後,補充「擺渡」知識點,這種攻擊行為經常發生在一些具有特殊目的病毒程序身上。期望通過可移動的媒介來滲透一些平時不聯網的電腦中,並從中獲取數據,利用擺渡的方式植入病毒或木馬到內網,比較典型的案例就是Stuxnet。

下圖展示了Stuxnet震網事件的漏洞利用過程和啟動方式,傳統的Autorun方式很容易被禁止掉,而Stuxnet利用的是lnk漏洞(MS10-046),它會在目標U盤下放入lnk快捷方式及病毒程序(如DLL文件)。不管通過什麼方式進入U盤,lnk文件會被解析從而觸發漏洞,導致U盤中的病毒程序被執行。


總結

寫到這裡,這篇文章就介紹完畢,通過這些PE病毒原理、分類及感染方式的講解,有利於大家去做一些拓展和思考,也體現出當下的網絡形式,存在很多安全隱患,安全防禦是非常必要的。

  • PE病毒概念
  • PE病毒的分類
  • 傳統文件感染型感染思路PE病毒典型案例關鍵技術
  • 捆綁釋放型
  • 系統感染型控制權再次獲取病毒的傳播方式

原文連結:

https://blog.csdn.net/Eastmount/article/details/106204633

關鍵字: