[系統安全] 十七.Windows PE病毒概念、分類及感染方式詳解

您可能之前看到過我寫的類似文章,爲什麼還要重複撰寫呢?只是想更好地幫助初學者瞭解病毒逆向分析和系統安全,更加成體系且不破壞之前的系列。因此,我重新開設了這個專欄,準備系統整理和深入學習系統安全、逆向分析和惡意代碼檢測,“系統安全”系列文章會更加聚焦,更加系統,更加深入,也是作者的慢慢成長史。換專業確實挺難的,逆向分析也是塊硬骨頭,但我也試試,看看自己未來四年究竟能將它學到什麼程度,漫漫長征路,偏向虎山行。享受過程,一起加油~

作者前文介紹了PE文件格式,熟悉各種PE編輯查看工具,針對目標EXE程序新增對話框等;這篇文章將介紹Windows PE病毒, 包括PE病毒原理、分類及感染方式詳解,並通過案例進行介紹。這些基礎性知識不僅和系統安全相關,同樣與我們身邊的APP、常用軟件及操作系統緊密聯繫,希望這些知識對您有所幫助,更希望大家提高安全意識,安全保障任重道遠。本文參考了《軟件安全》視頻、安全網站和參考文獻中的文章,並結合自己的經驗和實踐進行撰寫,也推薦大家閱讀參考文獻。

從2019年7月開始,我來到了一個陌生的專業——網絡空間安全。初入安全領域,是非常痛苦和難受的,要學的東西太多、涉及面太廣,但好在自己通過分享100篇“網絡安全自學”系列文章,艱難前行着。感恩這一年相識、相知、相趣的安全大佬和朋友們,如果寫得不好或不足之處,還請大家海涵!

接下來我將開啓新的安全系列,叫“系統安全”,也是免費的100篇文章,作者將更加深入的去研究惡意樣本分析、逆向分析、內網滲透、網絡攻防實戰等,也將通過在線筆記和實踐操作的形式分享與博友們學習,希望能與您一起進步,加油~

作者的github資源:

前文分析:

聲明:本人堅決反對利用教學方法進行犯罪的行爲,一切犯罪行爲必將受到嚴懲,綠色網絡需要我們共同維護,更推薦大家瞭解它們背後的原理,更好地進行防護。該樣本不會分享給大家,分析工具會分享。(參考文獻見後)


一.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文件頭。

在這裏插入圖片描述

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

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

2.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, NULL, addr szMsgOK, addr szCap, 40h+1000h
  • invoke ExitProcess, NULL

在這裏插入圖片描述

當該程序編譯之後,反彙編結構顯示如下圖所示,比如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.exe
shell\open=打開(&O)
shell\open\Command=calc.exe
shell\open\Default=1
shell\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病毒典型案例
    關鍵技術


  • 捆綁釋放型
  • 系統感染型
    控制權再次獲取
    病毒的傳播方式

學安全一年,認識了很多安全大佬和朋友,希望大家一起進步。這篇文章中如果存在一些不足,還請海涵。作者作爲網絡安全和系統安全初學者的慢慢成長路吧!希望未來能更透徹撰寫相關文章。同時非常感謝參考文獻中的安全大佬們的文章分享,感謝師傅、實驗室小夥伴的教導,深知自己很菜,得努力前行。編程沒有捷徑,逆向也沒有捷徑,它們都是搬磚活,少琢磨技巧,幹就對了。什麼時候你把攻擊對手按在地上摩擦,你就贏了,也會慢慢形成了自己的安全經驗和技巧。加油吧,少年希望這個路線對你有所幫助,共勉。

歡迎大家討論,是否覺得這系列文章幫助到您!如果存在不足之處,還請海涵。任何建議都可以評論告知讀者,共勉~

2020年8月18新開的“娜璋AI安全之家”,主要圍繞Python大數據分析、網絡空間安全、人工智能、Web滲透及攻防技術進行講解,同時分享CCF、SCI、南核北核論文的算法實現。娜璋之家會更加系統,並重構作者的所有文章,從零講解Python和安全,寫了近十年文章,真心想把自己所學所感所做分享出來,還請各位多多指教,真誠邀請您的關注!謝謝。

(By:Eastmount 2021-02-01 星期一 夜於貴陽 http://blog.csdn.net/eastmount/ )


參考文獻:
[1] 武大《軟件安全》課程
[2] MOOC《軟件安全之惡意代碼機理與防護》
[3] PE文件格式分析 - Erio
[4] 第二章PE文件結構解析 - 百度文庫






發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章