多型引擎如何工作在病毒中(譯)

看雪資料發表於2015-11-15

標 題:多型引擎如何工作在病毒中(譯)

發信人:virtualspace 

時 間:2003年9月27日 09:27 

詳細資訊:


小弟截譯了一篇短文,雖然東西較老,但可能對於初次瞭解多型引擎的原理有點益處。由於水平很低,各位大俠多多包涵,不清楚的地方,敬請參見原文,謝謝。
www.fuhs.de/en Encryption Generators Used in Computer Viruses Part 2
Copyright (C) 05/1995 by Howard Fuhs

內建變化引擎 
以下我們透過一個簡單的例項來演示多型引擎時如何在病毒中工作的。這個演示用的引擎(我們取名MutaGen變換器)很簡單,它僅需要幾個引數去初始化,為了它能夠執行,下面的語句應該在你的病毒原始碼開始處放置: extm -MUTAGEN:near
MutaGen 要求如下的引數來初始化: 
・  DS:DI = 被加密程式碼的地址
・  ES:DI = 被加密程式碼的區域. 分配足夠的空間用於加密模組的工作。預設長度 40 - 180 位元組.
・  CX 程式碼的總長度.
・  DX 加密模組的記憶體偏移地址.
當 MutaGen工作完成後,CX 包含被加密程式碼和解金鑰的長度, DS:DX 指向被加密的程式. 
 
變化器如何工作 
為了保護一個病毒有效地隱藏自身避免被掃描程式捕獲一個多型引擎必須具有許多功能: 
  
・  1. 特徵性固有程式碼必須被加密.
・  2. 加密必須採用不同的加密鍵key甚至不同的演算法,由此,經處理的加密部分,看上去沒有兩個相同的加密例項存在,即每次加密過的病毒程式碼完全不同。
・  3. 解密程式必須是改變的,它的生成基於每一個新產生的加密模組,去保證對應的正確解碼,維持固有的功能特性。任何兩個解密程式應該具有足夠的相異性.
如果上述2,3條沒有包含在病毒中,這個病毒很容易被檢查程式透過掃描字串發現
病毒包含解密程式去還原自身程式碼,多型引擎是內嵌在被加密的病毒體之中。
當程式執行時,如下的事件將會發生: 
程式開始處,一條直接跳轉指令JMP首先將IP轉到解密程式,它解密包含由多型引擎的病毒程式。一旦病毒程式碼被解密,它就可以象任何其他程式一樣被執行在它完成自己的使命後,轉交控制權給原先被感染的程式。 
病毒感染一個檔案,首先在目標程式開頭寫一個跳轉命令jmp,簡單的方法,可以是指向被感染檔案的結束處,因為這裡準備放入病毒自身的程式碼。下一步是呼叫多型引擎去產生一個使用新的加密方法加密的病毒體和相應的解密鍵KEY,並將他們合併到被感染的程式,最後在病毒執行程式碼結束處設定jmp指令,返回被感染程式.
以上是對多型引擎很簡單的描述. 
 
多型加密程式
多型加密程式採用幾種不同的加密演算法去加密病毒程式碼. 這不僅是為了阻止病毒被發現,也是為了能夠以儘量小的程式碼量產生更多的不同的被加密的病毒版本(例項)。為了產生更多的變化,這個過程需要許多不同的變數來初始化。比如利用日期,時間,被感染檔案的大小等等不確定因素來保證最大可能的變化性.病毒可能會根據一個結論來決定是否繼續繁殖自身。因為在一個固定的環境下,可能不再有適合的可變化因素提供產生足夠多的不同加密方法。
 
垃圾程式碼生成器(混淆器) 
病毒程式碼的加密依然不足以對抗字串掃描。多型引擎的最弱一環是它自身的解密器.因為解密器本身需要首先用於轉換被加密的病毒程式碼到可執行程式碼,它必須是可執行的,同樣的解密程式被用於所有被加密的病毒中,掃描器可能透過字串掃描發現這個解密器的特徵,它的加密是個大問題。因此,為了避免解密器被偵測,需要在其中插入足夠的無意義的程式碼片斷和指令(如NOP 或者 MOV BX:BX)這些合法但沒什麼作用的程式碼,去迷惑掃描器。許多多型引擎帶有垃圾程式碼生成器(混淆器)以一定的規則參照執行主機的特性去改變解密程式的程式碼同時保留它的完整功能性. 這裡的一個基本條件是需要一個偽隨機數發生器去隨機地產生和插入程式程式碼到解密程式中。還有更多的技術用於保護解密程式不被掃描器發現。
 
不同的加密程式 
使用一組相同的加密指令,但不斷改變被使用的暫存器,如此增加了許多病毒的特徵
在被加密的程式中使用許多可交換的程式碼片斷,一個程式碼片斷可以出現在不同的程式位位置,整個執行效果相同,因此,對於一個解密器,許多程式碼執行序列是有效的。
更好的方式是組合各種有效的方法去增強病毒的隨機變化性。

相關文章