【转】反病毒攻防研究第003篇:添加节区实现代码的植入
聲明
因為在評論區看到原博主說要把文章刪掉。。。心想這么好的文章刪了真的可惜,所以就先轉一份。。。
一、前言
? ? ? ? 上一篇文章所討論的利用縫隙實現代碼的植入有一個很大的問題,就是我們想要植入的代碼的長度不能夠比縫隙大,否則需要把自身的代碼截成幾個部分,再分別插入不同的縫隙中。而這次所討論的方法是增加一個節區,這個節區完全可以達到私人訂制的效果,其大小完全由我們自己來決定,這樣的話,即便是代碼較長,也不用擔心。而這種方式最大的缺陷就是不利于惡意代碼自身的隱藏,因此在現實中可能并不常用。其實,我在這里討論節區的添加,是為了以后更加深入的討論打下基礎,因為在加殼以及免殺技術中,經常會對PE文件添加節區。這篇文章首先會討論如何手工添加節區,之后會討論編程實現節區的添加。
?
二、手工添加節區
? ? ? ? 就我個人而言,只要不是過于繁瑣,我都比較傾向于直接利用十六進制代碼編輯軟件來修改目標程序。因為當理解了各種文件的格式之后,純手工對代碼進行編輯會更加靈活,也更加方便。只要ShellCode不太長,那么手工添加節區來植入代碼,其實還是比較容易的。一般來說,添加節區由以下四個步驟組成:
? ? ? ? 1、在節表后面添加一個IMAGE_SECTION_HEADER,用于保存所添加的節的基本信息。
? ? ? ? 2、更新IMAGE_FILE_HEADER中的NumberOfSections字段,添加了幾個節區就增加多少。
? ? ? ? 3、更新IMAGE_OPTIONAL_HEADER中的SizeOfImage字段,這里需要加上所添加節區的大小。如果添加代碼,還需修改SizeOfCode的大小以及程序入口點。
? ? ? ? 4、添加節區的數據。
? ? ? ? 這里先用PEiD看一下上一篇文章中所編寫的helloworld.exe的節區情況(這里所討論的是Release版,如果是Debug版,會有所不同):
圖1 用PEiD查看節區
? ? ? ? 從截圖中可以看到helloworld.exe包含有三個節區,再來看一下IMAGE_SECTION_HEADER的定義:
圖2 用Hex Editor Neo查看節區數據
? ? ? ? 在圖2中可以發現,IMAGE_SECTION_HEADER的長度是40個字節,每一項節表的相關數據在Hex Editor Neo中正好占了兩行半的內容。這里再解釋一下在PEiD中所顯示的那六個成員的意義:
? ? ? ? 1、Name:節區名稱。這是一個8位ASCII碼名(不是Unicode內碼),用來定義節區名稱。一般來說,節區名稱以一個“.”開始(如.text),但是其實這個“.”并不是必需的。需要說明的是,如果節區的名稱超過8個字節,則沒有最后的終止標志“NULL”字節。帶有一個“$”的節區名字會從鏈接器那里得到特殊的對待,前面帶有“$”的相同名字的節區被合并,在合并后的節區中,它們是按“$”后面的字符字母順序進行合并的。
? ? ? ? 對于helloworld.exe這個程序來說,為了實現所添加節區的隱藏,可以將新添加的節區名稱偽裝成正常的節區名稱,比如.crt、.bss、.edata或者.sdata等等?;蛘甙言瓉碚5墓潊^名稱改掉,如將原來的.text改為.jy(我名字的縮寫),而將所添加的節區名稱命名為.text,一般來說,系統不會因為節區改了名字而出錯。這里為了方便起見,將新節區的名字設定為.virus。
? ? ? ? 2、VirtualSize(V.Size):指出實際的、被使用的節區大小,是節區在沒進行對齊處理前的實際大小。如果VirtualSize大于SizeOfRawData,那么SizeOfRawData是來自可執行文件初始化數據的大小,與VirtualSize相差的字節用零填充。這個字段在OBJ文件中是被設定為0的。
? ? ? ? 這里我將節的大小直接設定為對齊后的大小。由于文件對齊是0x1000字節,那么就采用最小值即可,直接設定為0x1000。由于計算機是小端顯示,且占據4個字節,因此應當寫為“00 10 00 00”,這種小端的書寫方式在之后的數據填寫中也會采用。
? ? ? ? 3、VirtualAddress(V.Offset):表示節區裝載到內存中的RVA。這個地址是按照內存頁對齊的,它的值總是SectionAlignment的整數倍。在Microsoft工具中,第一個塊的默認RVA為1000h。在OBJ中,該字段沒有意義,并被設為0。
? ? ? ? VirtualAddress的值是上一個節區的起始位置加上上一個節對齊后的長度的值,在PEiD中可見,上一個節區的起始位置是0x7000,上個節區對齊后的長度是0x4000,因此新節區的起始位置是0xB000。
? ? ? ? 4、SizeOfRawData(R.Size):該節區在磁盤文件中所占的大小。在可執行文件中,該字段包含經過FileAlignment調整后的塊的長度。例如,指定FileAlignment的大小為200h,如果VirtualSize中的塊的長度為19Ah個字節,這一塊應保持的長度為200h個字節。
? ? ? ? 這里只要填寫一個最小值0x1000就可以。
? ? ? ? 5、PointerToRawData(R.Offset):該節區在磁盤文件中的偏移。程序經編譯或匯編后生成原始數據,這個字段用于給出原始數據在文件中的偏移。如果程序自裝載PE或COFF文件(而不是由操作系統裝入),這一字段比VirtualAddress還重要。在這種狀態下,必須完全使用線性映像方法裝入文件,所以需要在該偏移處找到塊的數據,而不是VirtualAddress字段中的RVA地址。
? ? ? ? 由于上一個節區的位移為0x7000,大小為0x3000,所以這里的R.Offset應該為0xA000。
? ? ? ? 6、Characteristics(Flags):節區屬性。該字段是一組指出節區屬性(如代碼/數據/可讀/可寫)的標志。具體的屬性可以查表獲得。
? ? ? ? 這里可以直接參考.text的屬性,即“20 0000 60”(包含代碼,可讀可執行)。
? ? ? ? 那么依據上述分析,在緊接著上一個節區位置的0x240處開始,直接手工填寫相關數據如下:圖3 手工添加節區的基本信息
? ? ? ? 至此,節區的基本信息添加完成,接下來需要修改這個PE文件的節區數量,之前該文件有3個節區,這里需要修改成4個。找到IMAGE_FILE_HEADER中的NumberOfSections字段進行修改:
圖4 更改節區數量
? ? ? ? 接下來需要修改文件映像的大小,也就是SizeOfImage的值。因為這里我新添加了一個節區,那么就應該把新的節區的大小加上原始SizeOfImage的值,就是新的文件映像的大小。這里原始的SizeOfImage大小為0xB000,新節區的大小為0x1000,那么新的SizeOfImage的大小就是0xC000。
圖5 更改文件映像大小
? ? ? ? 由于我在文件中添加了新的代碼段,所以這里還需要修改SizeOfCode的大小,出現多個代碼節,就應該把這個字段修改為它們的總和。我添加了0x1000字節的內容,那么就應將這個數據段修改成0x6000:
圖6 修改代碼節的大小
? ? ? ? 至此,修改PE結構字段的內容都已經做完了,現在開始需要添加真實的數據,根據上述分析,文件的起始位置為0xA000,長度為0x1000。填入ShellCode,并在其后填入00,將0x1000長度的空間補滿(不補滿的話,系統會報錯,補多了的話,會顯示有附加數據):
圖7 添加ShellCode
這里的返回地址(0x00401203)與上一篇文章中的不同,需要注意。最后一步就是將程序的入口點修改為ShellCode的入口點,即將AddressOfEntryPoint修改為0xB000(RVA):圖8 修改程序入口地址為ShellCode地址
? ? ? ? 至此,所有修改完成,再次使用PEiD查看,如圖所示:
圖9 添加成功
? ? ? ? 經過實際測試,程序正常運行,效果與上一篇文章所討論的相同,這里不再贅述。
?
三、編程添加節區
? ? ? ? 與上一篇文章中的在縫隙中添加代碼的方法類似,通過編程添加一個節區其實就是對文件的一系列操作,并且依然需要對PE文件的合法性進行檢驗。通過編程的方法添加節區和手動方法在步驟上是一樣的,只不過是將上面的手動步驟以通過調用API函數的方式進行編程而已。完整代碼如下:? ? ? ? 以上代碼比較簡單,就是基本的文件操作,已給出了相關的注釋,這里不再論述。
?
四、防范方法
? ? ? ? 在我看來,感染類病毒并不容易清除,因為它會把自身代碼植入到正常PE文件中,盡管中毒后可以運用殺毒工具針對其對計算機造成的損害進行清除,但是難以刪除隱藏在正常程序中的惡意代碼。雖然我們可以不再運行含有惡意程序的軟件,但是只要運行過一次,那么它就有可能將計算機中的所有PE文件感染,這樣即便我們使用殺毒工具清除了病毒所產生的不良行為,但是一旦運行別的程序,依舊會再次中病毒。而且就算有方法將藏身于PE文件中的病毒代碼徹底清除,也有可能破壞程序主體,使該程序不能夠正常運行。因此,最好的方法就是從源頭上杜絕這種情況的出現,不要下載和運行來歷不明的程序,并且安裝殺毒軟件。也就是說,一定要培養出良好的計算機安全意識。
?
五、小結
? ? ? ? 這次我們討論了手工以及編程添加節區的方法,其實它的原理非常簡單,只是比較繁瑣而已。通過這篇文章的討論,也為以后的免殺技術的討論打下了基礎。總結
以上是生活随笔為你收集整理的【转】反病毒攻防研究第003篇:添加节区实现代码的植入的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【2017年第1期】基于外卖物流配送大数
- 下一篇: 作者:胡卫生(1964-),男,博士,上