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