Python大本營 今天以下文章來源于CSDN ,作者楊秀璋 作者 | 楊秀璋,責編 | 夕顏 出品 | CSDN博客 這是一篇基礎(chǔ)性文章,將介紹Windows PE病毒, 包括PE病毒原理、分類及感染方式詳解,并通過案例進行介紹。 01 PE病毒概念什么是PE病毒?
PE病毒數(shù)量非常之多,包括早起的CIH病毒,全球第一個可以破壞計算機硬件的病毒,它會破壞主辦的BIOS,對其數(shù)據(jù)進行擦寫修改。再比如熊貓燒香、機器狗等等,其危害非常之大。 什么叫感染?
CIH病毒
CIH病毒曾入榜全球十大計算機病毒之首,該病毒引起了許多重要部門的嚴密關(guān)注,其原因不言而喻。如果指揮、通信、政務(wù)等系統(tǒng)受到了CIH病毒的威脅甚至破壞,其后果不堪設(shè)想。 如果我們要編寫PE病毒,則需要掌握以下的關(guān)鍵:
02 PE病毒的分類以感染目標進行分類,包括: (1) 文件感染 將代碼寄生在PE文件,病毒本身只是PE文件的一部分,依賴于感染目標,通常也叫HOST文件,控制權(quán)獲得也是以目標程序運行來獲得的。分為:
(2) 系統(tǒng)感染 將代碼或程序寄生在Windows操作系統(tǒng),該類病毒越來越多,它不感染具體文件,但是它會在操作系統(tǒng)中保存自己的實體。同時也可以通過系統(tǒng)啟動的方法來獲取控制權(quán)。傳播途徑包括:
03 傳統(tǒng)文件感染型1.感染思路當我們了解PE文件格式之后,要了解PE文件感染型病毒就非常容易了。如下圖所示,左邊是一個正常的PE文件,右邊是PE病毒感染該程序時的修改,可以看到病毒代碼在最后面,通常它是一種新節(jié)的形式。我們知道PE文件是由多個節(jié)組成的,病毒代碼為了融入目標程序會以節(jié)的形式,同時修改PE文件頭。 對感染來說,它一方面需要使得對方具備自己的功能,另一方面也不破壞對方程序的功能。所以病毒代碼執(zhí)行完畢之后,它必須要將控制權(quán)交給原始程序,從而防止病毒被發(fā)現(xiàn)。
PE病毒典型案例下面是演示代碼,感染本目錄下的test.ext文件,它沒有破壞性,tset.exe被感染后,首先執(zhí)行病毒代碼,然后執(zhí)行自身代碼。如下圖所示,存在四個文件。其中main.exe是PE病毒程序,它會感染當前目錄下名為“test.exe”的文件。這里僅是測試PE病毒感染代碼,沒有破壞功能。
第一步,我們嘗試打開test.exe文件。它是一個正常的PE文件,前面的文章也分析過,它包括兩個彈窗,如下圖所示。 第二步,使用OD打開test.exe如下圖所示,發(fā)現(xiàn)起始地址為0x00401000,該exe程序大小為2.50KB。 第三步,運行main.exe程序,它是PE病毒。注意,它會彈出如下圖所示對話框,這是為了方便演示,而真實的PE病毒不會提示你信息。程序是兩位大佬所寫,其中一位是Hume前輩,另一位 ^ _ ^ 同時,如果360會查殺該病毒,添加信任即可。但當我們在真實惡意樣本分析時,一定要在虛擬機等有保護環(huán)境下進行。 IDA分析mian.exe如下圖所示: 第四步,此時test.exe文件大小已經(jīng)增加為6.50KB,說明其已經(jīng)被惡意感染。
雙擊test.exe顯示如下圖所示,它會先彈出一個感染測試對話框,然后才是接下來的正常程序?qū)υ捒颉?/span>
用OD動態(tài)分析,發(fā)現(xiàn)程序入口地址是0x004042DC。說明該程序先執(zhí)行PE病毒,之后才執(zhí)行正常的程序,而真實的PE病毒不會只簡單的彈出提示窗口,而會隱蔽的進行一些破壞或收集信息。
第五步,將被感染的“test.exe”重命名為“test-ok.exe”,然后將記事本修改為“test.exe”,因為我們的代碼只感染當前目錄下“test”命名的文件。
接著運行“test-ok.exe”程序,發(fā)現(xiàn)打開記事本也會彈出如下圖所示的對話框,接著才是記事本,說明該程序也被感染。
第六步,通過同樣的方法感染計算器程序,如下圖所示。
寫到這里,該案例就演示完畢,這是一個傳統(tǒng)典型的PE病毒感染示例。 3.關(guān)鍵技術(shù)(1) 重定位重定位在前面講PE文件格式化時介紹過,尤其DLL文件常見重定位。因為DLL文件會加載到不同的位置,如果再按照VA地址定位會出現(xiàn)差錯,所以會出現(xiàn)重定位。對于病毒程序也是一樣的,它有相應(yīng)的代碼去感染目標程序,而目標程序有很多,病毒程序?qū)懺谀繕顺绦蚴裁次恢媚??這就需要病毒代碼去定位目標程序的位置,就要利用重定位技術(shù)。
① 為什么需要重定位呢? 下面是一段源代碼(PE最小文件案例),通過mas32編譯生成的目標程序。源代碼非常簡單,就是調(diào)用invoke,通過invoke調(diào)用MessageBox函數(shù),包括四個參數(shù);程序第二個語句是invoke調(diào)用退出。這里彈出對話框涉及兩個字符串szCap和szMsgOK。
當該程序編譯之后,反匯編結(jié)構(gòu)顯示如下圖所示,比如Start位置,MessageBox函數(shù)包括四個參數(shù),我們采用PUSH壓入堆棧,再CALL調(diào)用該函數(shù)。
圖中紅色圓圈顯示的是PE文件代碼的二進制部分,它是一個VA的地址,即RVA+ImageBase。程序在編譯后,某些VA地址(如變量Var 004010xxh)就已經(jīng)以二進制代碼的形式固定,這就是需要重定位的原因。
下圖展示正常情況的ImageBase,值為400000H。比如HEX數(shù)據(jù)為“00104000”,由于高位在后面,所以對應(yīng)的地址是“00 40 10 00”。
如果ImageBase為600000H,則代碼不做重定位,PUSH壓入堆棧的值為401000和401014。而此時的值什么也不是,通過數(shù)據(jù)窗口定位地址發(fā)現(xiàn)不存在。左下角可以看到,00601000位置才是存放的數(shù)據(jù)。所以,重定位需要將這里的40修改為60。
總之,如果病毒代碼插入位置不固定,也會遇到類似的問題。病毒代碼必須通過重定位解決類似的問題。 ② 下面看看病毒代碼植入HOST文件后的位置差異。 左邊是病毒在感染前的VAR位置,其地址為004010xx;當這段代碼插入到另一個HOST文件后,如右圖所示,變量的實際位置和預(yù)期位置出現(xiàn)了差異,而重定位的關(guān)鍵是知道這個差異是多少,后續(xù)遇到的各種變量或地址都可以通過這種差異方式校正。
但是根據(jù)HOST特征逐一硬編碼這種方式不太可取,其繁瑣且未必準確,所以采用另一種方法,病毒代碼運行過程中自我重定位。首先它計算剛才的差異值,接著調(diào)用call delta將下一條語句開始位置壓入堆棧,此時堆棧頂端存放的是pop ebp語句,它在內(nèi)存匯總真實的地址;再后面是sub減法操作,ebp減去offset delta;最后當我們需要重定位時,比如使用varl變量,重定位則為ebp+offset來消除差異,此時eax中存放varl在內(nèi)存中的真實地址。 CALL語句功能:
(2) API函數(shù)自獲取前面介紹了PE文件的引入函數(shù)節(jié),它是目標程序作者編寫的,當調(diào)用外部DLL中的API函數(shù)時,通過引入函數(shù)節(jié)將這種關(guān)系定義出來,系統(tǒng)加載時就能加載對應(yīng)的DLL文件并找到相應(yīng)的API函數(shù),再將地址寫入到PE文件的引入函數(shù)表中,程序運行時就直接從引入函數(shù)表中取地址進行調(diào)用,這是正常的PE文件運行過程。 但對于病毒程序來說,它是一段代碼,當它感染另外一個程序時,它是否能修改目標程序的引入函數(shù)節(jié),而使得其可以服務(wù)病毒代碼呢?從原理上來說,這是可以實現(xiàn)的,但非常復(fù)雜,因為要在引用函數(shù)節(jié)添加東西一定會導致其他結(jié)構(gòu)的變化,需要做很多的修正工作,這也可能破壞原有功能。所以對于病毒來說,它需要自己去獲取API函數(shù)地址,并且沒有引入函數(shù)節(jié)的支撐,但它又必須要使用很多API函數(shù)來實現(xiàn)病毒功能。
① 如何獲取API函數(shù)地址呢?
② 當我們獲得GetProcAddress和LoadLibraryA地址后,想獲取任何一個API函數(shù)地址都可以。那么,怎么獲取這兩個函數(shù)的地址呢?
③ 接著,我們看看獲取Kernel32模塊基地址的典型方法。
– 程序入口代碼執(zhí)行時Stack頂端存儲的地址
(3) 目標程序遍歷搜索通常以PE文件格式的文件(如EXE、SCR、DLL等)作為感染目標,其關(guān)鍵點為全盤查找或者部分盤符查找,遍歷算法包括遞歸或非遞歸。在對目標進行搜索時,通常調(diào)用兩個API函數(shù):
搜索目標進行感染算法如下:
(4) 文件感染感染的關(guān)鍵是病毒代碼能夠得到運行,常用方法包括:
同時,病毒代碼執(zhí)行時,程序的正常功能不能被破壞,即控制權(quán)的交換。
感染文件的基本步驟為: ①判斷目標文件開始的兩個字節(jié)是否為“MZ” ②判斷PE文件標記“PE” ③判斷感染標記,如果已被感染過則跳出繼續(xù)執(zhí)行HOST程序,否則繼續(xù) ④獲得Directory(數(shù)據(jù)目錄)的個數(shù)(每個數(shù)據(jù)目錄信息占8個字節(jié)) ⑤得到節(jié)表起始位置(Directory的偏移地址+數(shù)據(jù)目錄占用的字節(jié)數(shù)=節(jié)表 ⑥得到目前最后節(jié)表的末尾偏移(緊接其后用于寫入一個新的病毒節(jié))節(jié)表起 ⑦開始寫入節(jié)表和病毒節(jié) ⑧修正文件頭信息 04 捆綁釋放型捆綁釋放型感染實現(xiàn)起來比較簡單,目前很大一部分病毒程序都采用這種方法。捆綁釋放型感染時將目標HOST程序作為數(shù)據(jù)存儲在病毒體內(nèi),當執(zhí)行病毒程序時,它先執(zhí)行病毒程序,然后還原并執(zhí)行HOST文件,從而保證被感染的程序本身能正常運行,不會引起一些異樣。
05 系統(tǒng)感染型系統(tǒng)感染型本身不對PE文件做任何感染操作,但它感染的目標是操作系統(tǒng),也是一種寄生類的方式,只是寄生目標有所不同。這類病毒通常為獨立個體,不感染系統(tǒng)內(nèi)的其他文件。 兩個關(guān)鍵問題:
1.控制權(quán)再次獲取下面簡單講解控制權(quán)再次獲取的自啟動方式。首先看看操作系統(tǒng)啟動流程:
整個啟動流程也是控制權(quán)傳遞的過程,包括現(xiàn)在提出的可信計算,也是對控制權(quán)一步一步的校驗,控制流程的數(shù)據(jù)完整性或行為的校驗。對于操作系統(tǒng)本身,它的啟動方式很多,系統(tǒng)內(nèi)部包括:
下圖展示了Autoruns軟件看到Windows操作系統(tǒng)進行自啟動的選項。如果病毒本身能很好地結(jié)合這套機制,它可以做的事情非常多,并且具有很好的隱蔽性。
其他啟動方式:
2.病毒的傳播方式一切可對外交互的渠道都可傳播,包括:
郵件蠕蟲越來越常見,其中以郵件附件的形式進行傳播較多。附件中可能包含病毒包括exe文件、rar文件、pdf文件、doc文件、xls文件、jpg文件、chm文件等。下圖是一個包含病毒的郵件附件,顯示為一個word文檔,后綴名doc,圖標顯示也是word。但它的真實后綴是scr(屏保),它其實是利用了一種技術(shù),在文件名里插入翻轉(zhuǎn)字符,然后將翻轉(zhuǎn)字符之后的其他字符進行了翻轉(zhuǎn),它的完整文件名應(yīng)該是“5月TW行l(wèi)mcod.scr”。這也是一種欺騙性很強的攻擊手法。
再補充一個通過可移動存儲設(shè)備傳播的非感染式病毒,即Autorun.inf。右圖顯示了Autorun.inf文件,如果文件存在U盤根目錄,當我們雙擊這個U盤時,它就會觸發(fā)對應(yīng)的病毒,如果選擇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操作系統(tǒng)默認不顯示“.exe”時,它就能偽裝成文件夾,當我們雙擊之后就會運行病毒,同時可以打開某個文件夾進行隱蔽。
最后,補充“擺渡”知識點,這種攻擊行為經(jīng)常發(fā)生在一些具有特殊目的病毒程序身上。期望通過可移動的媒介來滲透一些平時不聯(lián)網(wǎng)的電腦中,并從中獲取數(shù)據(jù),利用擺渡的方式植入病毒或木馬到內(nèi)網(wǎng),比較典型的案例就是Stuxnet。
下圖展示了Stuxnet震網(wǎng)事件的漏洞利用過程和啟動方式,傳統(tǒng)的Autorun方式很容易被禁止掉,而Stuxnet利用的是lnk漏洞(MS10-046),它會在目標U盤下放入lnk快捷方式及病毒程序(如DLL文件)。不管通過什么方式進入U盤,lnk文件會被解析從而觸發(fā)漏洞,導致U盤中的病毒程序被執(zhí)行。
06 總結(jié)寫到這里,這篇文章就介紹完畢,通過這些PE病毒原理、分類及感染方式的講解,有利于大家去做一些拓展和思考,也體現(xiàn)出當下的網(wǎng)絡(luò)形式,存在很多安全隱患,安全防御是非常必要的。
原文鏈接: https://blog.csdn.net/Eastmount/article/details/106204633 |
|
|
來自: 風聲之家 > 《服務(wù)器與開發(fā)》