初探計算機病毒(2)--感染解釋

    這篇文章是對上一篇文章中代碼的解釋。
    最近幾天,在我的一通“扳鑿斧鋸”之下,第一個病毒終於被我打造出來了。被感染的程序運行將會彈出一個對話框,詢問是否運行該程序,如果選擇是,則會遍歷當前目錄下的所有exe文件,嘗試在文件中插入病毒病毒代碼(即彈對話框詢問是否運行,選是就嘗試感染當前目錄下的所有exe文件)。如果該exe文件被感染過,則不反覆感染。可以說這只是一個PE病毒的雛形,不具破壞能力。或者可以把它比做是遠程導彈試射成功,這裏導彈彈頭沒裝炸藥,更沒裝核彈。
    先來說說病毒的原理。WINDOWS的可執行文件是PE(Portable Executable)格式的。PE文件都會有一個464字節的頭信息,在裏面記錄了程序運行的一些必要信息。平時我們運行一個程序可能會看到提示“不是一個有效的WIN32程序”,就是因爲WINDOWS系統讀取這個頭信息,發現裏面有錯誤就停止運行了。在頭信息裏記錄了程序運行的第一條指令的位置。病毒的原理就是把病毒代碼想辦法附加到一個正常的程序裏,然後再修改頭信息中入口指令的位置爲病毒的第一條指令的位置,等病毒運行完成後,再跳轉到原來的正常的指令運行。
    那現在首要問題是如何把代碼附加到程序裏面。有兩種方法,一是在原來的文件後面新加入代碼;二是在原來文件中代碼的空隙中加入代碼。
    1.  在文件後新加入代碼。這裏可不能簡單在正常的exe文件後面直接寫入病毒程序,這樣做windows系統是會報錯的。因爲在PE文件的頭信息以及PE頭後面的節表(關於節表我們稍後講述)記錄了數據區的詳細屬性,突然在後面加入代碼,就好像有異物突然侵入人體一樣,就會本能的產生排異反映。windows爲了自身的穩定,也必須對一些數據進行校驗,如果不能通過校驗,也是不允許程序運行的。所以還有要修改PE頭裏面的信息以及要增加一個節表。
    這裏我們來說說節(SECTION)和節表(SECTION TABLE)。在464個字節的PE頭之後會跟有若干個40字節的數據。每個40個字節的數據就是一個節表。節的概念是這樣的。在這些節表之後就是真正的數據區了,無論是代碼、數據、資源等等都存放在這裏。然而這些數據的功能不一樣,屬性也就不一樣。比如代碼,是應該可以讀取、運行的,而不能改寫;數據,即程序中用到的數據,一般會存儲一些變量,那它們是可以被讀、寫的,但不能運行;那資源呢,則只能別讀取,而不能被寫和運行。這樣那些屬性相同的數據通常就會被放到同一節(SECTION)裏面,比如所有的代碼通常被放到同一節裏面,資源被同一節裏面。那麼節表(SECTION TABLE)就是描述這些節的信息,每個節表對應一節數據區域。節表當中記錄了這一節的起始位置、節數據的大小、讀寫運行屬性等。可以說節表就像書的目錄一樣,記錄了書中文字屬哪個章節。
    要新加數據在文件末尾,就得在原來的最後一個節表後再填加一個節表(因爲節表都是連續存儲的),幸虧一般在最後一個節表到數據區還有一些空隙,通常會大於40個字節(一個節表的大小)。新加的這個節表會記錄文件最後附加的所謂的病毒代碼的各種屬性。另外還需要修改PE頭信息裏面的一些數據,比如SizeOfImage,SizeOfCode。這種方法修改完後文件大小會增加。
   這種方法詳見羅雲彬著的《Windows環境下32位彙編語言程序設計》第十七章AddCode源碼。
   2. 利用相臨兩節之間的空隙空間插入病毒代碼。
    每個節中的數據可能是隨意長度的,但是在文件中存儲的時候,都要按照一個值對齊,即存儲的空間必定是這個值的整數倍。這是爲了系統讀取磁盤信息的時候可以整塊整塊的讀取提高效率。這個值在PE頭中可以找到,字段名稱叫FileAllignment。比如代碼節裏面的代碼長度是534個字節,而FileAllignment=400,則代碼節在文件中存儲就佔800個字節。這樣就有276個字節的空隙。
    第二種方法,就是遍歷所有的節表,看每節在文件中存儲的空隙是否夠放下“病毒”的代碼。如果夠放,在把“病毒”的代碼放在原來正常的數據後面。這樣除了入口地址以外,其他根本PE頭信息和節表信息幾乎不用動一個字節就可以完成感染。
    這種方法的好處是,感染代碼短小,文件大小可以保持不變(因爲我們是利用原有數據的空隙)。
    上一篇《初探計算機病毒(2)--完成》就是用的這種方法。
    當然這種方法也有缺點,就是如果找不到一個節可以容納“病毒代碼”就無法感染了。當然還可以把“病毒”代碼分成幾份,分別放在不同節的數據空隙裏。但對於非常小的文件,這種辦法也是無能爲力的。比如文件本身就幾百字節,比你病毒的SIZE還小,當然也就無法用這種辦法感染了。

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