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