多形現象


多形現象,所指的就是病毒在每次感染時都會改變自己的形態,讓它保持原有的 功能但看起來卻完全不同。這個目的可以利用結果相同但不同的指令來達成。比如:
XOR BP,BP ;db 31h, 0edh
SUB BP,BP ;db 29h, 0edh
這兩行指令做的是同一件事-讓
BP歸零。但是它們的機械碼是不同的!因此,假若我 們隨機地使用這些同樣功能但不同的指令,那要用固定掃描碼式的方式掃描就不可能 了!這在改變病毒中唯一不變的地方-stub(解碼前指令)時是非常好用的。這樣還 不夠。演算法式掃描是AV公司能想到唯一的解決方法;不過這個較難的方法讓他們的 $更難賺了些。所有的掃毒程式都有它們內建的 MtE, SMEG, NED 偵測器,不過那也 都是另外附加的。 多形的產生,不過是把指令集合成堆,並隨機地選用它們。而亂數產生器又總是 和時計有關。下面是兩個方法:

;------ 8 bit 亂數 ----------

IN AL,40H        ;將亂數放入 AL.

            ;40h = timer port.

 

;------ 16 bit 亂數 --------

IN AX,40H        ;將亂數放入 AX.

 

;------ Another 亂數 -------

INT 1AH         ;1ah function 0 讀取系統時間

 

再來你可以用 XOR AND 來製造更大的亂度。 指令集是你所需要的,但是為了寫作方便的考量,二位元組指令的平方是最好的 選擇(可選2,4,8,16 )。如此,你可以得到你要的亂數,並將不需要的位元設為0 AND)。舉例而言,若有4個隨機指令可以選擇,那麼你可用: AND AX,3 ;3 =00000011b 於是乎,你就剩下4個選擇啦! 將指令集的偏移量設到某暫存器內,再把亂數乘以2加到其內(因為指令是2位元組 長)。現在你擁有一個隨機指令啦!你所剩下的工作就是把它移到你想放置的地方, 你的工作就完成啦! 下面是某些簡單多形中所必須同時加入的指令:

IN AX,40H        ;取亂數到 AX.

AND AX,011b      ;限制在 [0,3].

SHL AX,1         ;變兩倍 , 因為 圾垃指令 長度為 2 bytes

MOV SI,OFFSET DATABASE   ;SI 指向 圾垃指令表 開頭

ADD SI,AX          ;SI=SI+AX 指向任意的圾垃指令

MOV DI,OFFSET POLY1     ; 圾垃指令 傳到此處

MOVSW            ;複製 圾垃指令

RET             ;結束

              ;圾垃指令表

DATABASE DB 2CH,0      ; = sub al,0

DB 89H,0C0H         ; = mov ax,ax

DB 88H,0C9H         ; = mov cl,cl

DB 21H,0D2H         ; = and dx,dx

 

這僅僅是一個簡單的範例,但卻是初學者的入門課程!你可以發現它並未使用太多的指令。 MtE NED 表現的更好,但是它們用了超過 1000 Bytes 的指令!這太誇張了吧! 另一個有用的地方就是在編碼器上。隨機垃圾碼可以讓你的病毒比原有的 255種變化增加至少千種!將變化過長度的指令置入,那麼你就有一個不定長度的編碼器啦 (Randomise the actual number of variable bytes put in and you can have a variable length encryptor)而真正的變形程序則必須藏身在編碼過程中並在病毒感染檔案前被呼叫。有些你所需要注意的事。你所用的指令集合中的指令必須是同樣長度的。你可以用三種不同長度的指令集合,但是你不能把它們混在一起。使用 DEBUG,並輸入偽裝指令的程式碼。 這就是有關多形簡單概念的簡述。