mirror of
https://github.com/vxunderground/MalwareSourceCode.git
synced 2024-12-22 19:36:11 +00:00
4b9382ddbc
push
654 lines
9.4 KiB
NASM
654 lines
9.4 KiB
NASM
|
||
memS equ 1 ;model small convertable to COM model
|
||
;**************** RUNTIME LIBRARY OF KILLDIANA.COM **************
|
||
include lcmac.mac
|
||
calln macro name
|
||
call near ptr name
|
||
endm
|
||
callp macro name
|
||
lea dx,name
|
||
calln print
|
||
endm
|
||
callz macro name
|
||
push si
|
||
lea si,name
|
||
calln printz
|
||
pop si
|
||
endm
|
||
|
||
dtas struc
|
||
resv db 21 dup(?)
|
||
atr db ?
|
||
hour dw ?
|
||
min dw ?
|
||
lfil dw ?
|
||
hfil dw ?
|
||
sname db 14 dup(?)
|
||
dtas ends
|
||
|
||
dgroup group data,udata,xstack
|
||
assume ds:data
|
||
|
||
pgroup group prog,tail
|
||
prog segment byte public 'prog'
|
||
assume cs:prog
|
||
|
||
org 100h ;FOR MODEL COM
|
||
|
||
start label far
|
||
cli
|
||
mov ax,offset pgroup:xtail ;get end of code group
|
||
add ax,16 ;calculate segment address of ds
|
||
mov cl,4 ;calculate segment address of ds
|
||
shr ax,cl ;calculate segment address of ds
|
||
mov bx,cs ;calculate segment address of ds
|
||
add ax,bx ;calculate segment address of ds
|
||
mov ds,ax ;set ds to dgroup
|
||
mov es,ax ;set es to dgroup
|
||
mov ss,ax ;set ss to dgroup
|
||
mov ds:_ss,ax ;save stack segment for (do,for,while)
|
||
mov sp,offset dgroup:sbase + 512 ;range of stack = 512 bytes
|
||
mov ds:_top,sp ;save stack pointer for (do,for,while)
|
||
mov bx,offset dgroup:sbase ;get stack segment for (do,for,while)
|
||
mov ds:_base,bx ;save stack segment for (do,for,while)
|
||
sti
|
||
mov ah,30h ;get dos version number
|
||
int 21h
|
||
mov ds:_dos,ax ;save dos version for (do,for,while)
|
||
callp copyr
|
||
callp tryrem
|
||
calln remove
|
||
push cs
|
||
pop es
|
||
|
||
mov di,81h
|
||
getf:
|
||
mov cx,80
|
||
cld
|
||
mov al,0dh
|
||
repne scasb
|
||
jne quiter
|
||
dec di
|
||
cmp di,81h
|
||
je quiter
|
||
mov si,di
|
||
mov cx,di
|
||
mov cs:byte ptr[di],0
|
||
srcc:
|
||
dec si
|
||
mov al,cs:[si]
|
||
cmp al,'\'
|
||
je fndd
|
||
cmp al,':'
|
||
je fndd
|
||
cmp si,82h
|
||
jae srcc
|
||
dec si
|
||
fndd:
|
||
sub cx,si
|
||
jcxz quiter
|
||
lea di,fname
|
||
inc si
|
||
cpcp: mov al,cs:[si]
|
||
cmp al,' '
|
||
jbe incsi
|
||
mov [di],al
|
||
inc di
|
||
incsi:
|
||
inc si
|
||
loop cpcp
|
||
callp weak
|
||
lea dx,root
|
||
mov ah,3bh ;chdir to root
|
||
int 21h ;chdir to root
|
||
calln findir
|
||
quiter:
|
||
mov ah,4ch
|
||
int 21h ;exit to DOS
|
||
|
||
print proc near
|
||
mov ah,9
|
||
int 21h
|
||
ret
|
||
print endp
|
||
|
||
comwrk proc near
|
||
calln first
|
||
jc toret
|
||
calln workcom
|
||
ffnext:
|
||
calln fnext
|
||
jc toret
|
||
calln workcom
|
||
.br ffnext
|
||
toret:
|
||
ret
|
||
comwrk endp
|
||
fnext proc near
|
||
lea dx,mydta
|
||
mov ah,1ah
|
||
int 21h
|
||
mov ah,4fh ;findnext
|
||
int 21h
|
||
jc ercc
|
||
jnc foundf
|
||
fnext endp
|
||
first proc near
|
||
lea dx,mydta
|
||
mov ah,1ah
|
||
int 21h
|
||
lea dx,fname
|
||
mov cx,27h ;search all types of files
|
||
mov ah,4eh ;findfirst
|
||
int 21h
|
||
jnc foundf
|
||
; callp notfnd
|
||
ercc: stc
|
||
ret
|
||
foundf:
|
||
calln konka
|
||
clc
|
||
ret
|
||
first endp
|
||
konka proc near
|
||
mov ah,2fh
|
||
int 21h ;get dta in es:bx
|
||
add bx,26
|
||
mov ax,es:[bx]
|
||
mov llfil,ax ;save lowlengh
|
||
inc bx
|
||
inc bx
|
||
mov ax,es:[bx]
|
||
mov lhfil,ax ;save highlengh
|
||
inc bx
|
||
inc bx ;pointed to fname
|
||
lea si,ffname
|
||
copyf: mov al,es:[bx]
|
||
mov [si],al
|
||
inc si
|
||
inc bx
|
||
or al,al
|
||
jne copyf
|
||
ret
|
||
konka endp
|
||
|
||
|
||
|
||
remove proc near
|
||
push ds
|
||
clr ax
|
||
mov ds,ax
|
||
les bx,ds:[84h] ;21h vector
|
||
mov ax,cs
|
||
mov dx,es
|
||
cmp dx,ax
|
||
jc nodia
|
||
cmp bx,2eeh
|
||
jne nodia
|
||
|
||
mov ax,es:[74fh]
|
||
mov ds:[84h],ax ;restore 21h
|
||
mov ax,es:[751h]
|
||
mov ds:[86h],ax
|
||
|
||
mov ax,es:[74bh]
|
||
mov ds:[9ch],ax ;restore 27h
|
||
mov ax,es:[74dh]
|
||
mov ds:[9eh],ax
|
||
mov ax,es
|
||
mov bx,ax
|
||
dec ax
|
||
mov es,ax
|
||
mov es:byte ptr[0],5ah
|
||
mov es:word ptr[1],0
|
||
pop ds
|
||
callp diakt
|
||
ret
|
||
nodia:
|
||
pop ds
|
||
callp dinakt
|
||
ret
|
||
remove endp
|
||
|
||
workcom proc near
|
||
lea dx,ffname
|
||
mov ax,4300h ;get attrib
|
||
int 21h
|
||
jnc kopa
|
||
jmp retga
|
||
kopa:
|
||
mov al,cl
|
||
and al,0feh
|
||
cmp al,cl
|
||
je nochatr
|
||
|
||
mov attr,cx
|
||
mov ax,4301h ;set attrib
|
||
clr cx ;to normal
|
||
int 21h
|
||
.br nochh
|
||
nochatr:
|
||
mov attr,0
|
||
nochh:
|
||
mov ax,3d02h ;open file R/W
|
||
int 21h
|
||
jnc kop1
|
||
jmp resatr
|
||
kop1: mov bx,ax
|
||
calln gettm
|
||
mov cx,18h
|
||
lea dx,bufer
|
||
mov ah,3fh ;read first 3 bytes
|
||
int 21h
|
||
jc closs2
|
||
mov di,dx
|
||
mov ax,ds:[di]
|
||
cmp ax,5a4dh
|
||
jne commfil
|
||
push bx
|
||
calln exework
|
||
pop bx
|
||
jc chek2
|
||
jmp closs
|
||
|
||
commfil:
|
||
mov al,ds:[di]
|
||
cmp al,0e9h
|
||
je mak111
|
||
jmp closs
|
||
mak111: mov si,ds:[di+1] ;relative offset
|
||
add si,3
|
||
mov di,si
|
||
sub si,68h
|
||
mov len,si
|
||
|
||
clr cx
|
||
mov dx,di
|
||
mov ax,4200h
|
||
int 21h ;seek to found e80000
|
||
closs2: jc clos21
|
||
|
||
lea dx,bufer
|
||
add dx,18h+3
|
||
mov cx,7 ;read 7 bytes
|
||
mov ah,3fh
|
||
int 21h ;read
|
||
clos21: jnc chek1
|
||
chek2: jmp closs
|
||
chek1:
|
||
mov di,dx
|
||
cmp ds:byte ptr[di],0e8h
|
||
jne chek2
|
||
cmp ds:word ptr[di+1],0
|
||
jne chek2
|
||
cmp ds:word ptr[di+4],0ee81h
|
||
jne chek2
|
||
cmp ds:word ptr[di+6],6bh
|
||
jne chek2
|
||
|
||
clr cx
|
||
mov dx,si
|
||
add dx,705h
|
||
mov ax,4200h
|
||
int 21h ;seek to found org 3bytes
|
||
jc closs
|
||
lea dx,bufer
|
||
add dx,18h
|
||
mov cx,3 ;read 3 bytes
|
||
mov ah,3fh
|
||
int 21h ;read
|
||
jc closs
|
||
lea si,bufer
|
||
restor3:
|
||
mov al,[si+18h]
|
||
mov [si],al
|
||
inc si
|
||
loop restor3
|
||
clr cx
|
||
clr dx
|
||
mov ax,4200h ;seek to begin
|
||
int 21h
|
||
jc closs
|
||
|
||
mov cx,18h
|
||
lea dx,bufer
|
||
mov ah,40h ;write
|
||
int 21h
|
||
jc closs
|
||
|
||
clr cx
|
||
mov dx,len
|
||
mov ax,4200h ;seek to end of real data
|
||
int 21h
|
||
jc resatr
|
||
exelen:
|
||
clr cx
|
||
mov ah,40h ;truncate file
|
||
int 21h
|
||
push bx
|
||
callp file
|
||
callz ffname
|
||
callp isok
|
||
|
||
pop bx
|
||
closs:
|
||
calln settm
|
||
mov ah,3eh
|
||
int 21h ;close file
|
||
|
||
resatr:
|
||
mov cx,attr ;to old attributes
|
||
or cx,cx
|
||
je retga
|
||
lea dx,ffname
|
||
mov ax,4301h ;set attrib
|
||
int 21h
|
||
retga:
|
||
ret
|
||
workcom endp
|
||
printz proc near
|
||
eter: mov ah,2
|
||
lodsb
|
||
or al,al
|
||
je caret
|
||
mov dl,al
|
||
int 21h
|
||
.br eter
|
||
caret:
|
||
ret
|
||
printz endp
|
||
|
||
gettm proc near
|
||
mov ax,5700h
|
||
int 21h
|
||
jc qget
|
||
mov atcx,cx
|
||
mov atdx,dx
|
||
qget:
|
||
ret
|
||
gettm endp
|
||
|
||
settm proc near
|
||
mov ax,5701h
|
||
mov cx,atcx
|
||
mov dx,atdx
|
||
or cx,cx
|
||
je qset
|
||
or dx,dx
|
||
je qset
|
||
int 21h
|
||
qset:
|
||
ret
|
||
settm endp
|
||
exework proc near
|
||
mov ax,[di+16h] ;get main lenght in pargarphs
|
||
mov cx,16
|
||
mul cx
|
||
push bx
|
||
mov bx,[di+8]
|
||
mov cl,4
|
||
shl bx,cl
|
||
add ax,[di+14h] ;get IP
|
||
adc dx,0
|
||
add ax,bx
|
||
adc dx,0
|
||
pop bx
|
||
mov exhlen,dx
|
||
mov exllen,ax
|
||
mov cx,dx
|
||
mov dx,ax
|
||
mov ax,4200h
|
||
int 21h ;seek to begin Diana code
|
||
|
||
lea dx,bufer
|
||
add dx,18h+3
|
||
mov cx,7 ;read 7 bytes
|
||
mov ah,3fh
|
||
int 21h ;read
|
||
jc echek2
|
||
mov di,dx
|
||
cmp ds:byte ptr[di],0e8h
|
||
jne echek2
|
||
cmp ds:word ptr[di+1],0
|
||
jne echek2
|
||
cmp ds:word ptr[di+4],0ee81h
|
||
jne echek2
|
||
cmp ds:word ptr[di+6],6bh
|
||
je exgoin
|
||
echek2:
|
||
stc
|
||
ret
|
||
exgoin:
|
||
sub exllen,68h
|
||
sbb exhlen,0 ;contains lenght of file
|
||
|
||
mov dx,exllen
|
||
mov cx,exhlen
|
||
add dx,707h
|
||
adc cx,0
|
||
mov ax,4200h
|
||
int 21h ;seek to old vectors
|
||
lea dx,bufer
|
||
add dx,26h
|
||
mov cx,1
|
||
mov ah,3fh
|
||
int 21h ;read old cs:ip, ss:sp
|
||
jc echek2
|
||
|
||
mov dx,exllen
|
||
mov cx,exhlen
|
||
add dx,6fdh
|
||
adc cx,0
|
||
mov ax,4200h
|
||
int 21h ;seek to old vectors
|
||
lea dx,bufer
|
||
add dx,18h
|
||
mov cx,8
|
||
mov ah,3fh
|
||
int 21h ;read old cs:ip, ss:sp
|
||
jc echek2
|
||
|
||
mov ax,llfil
|
||
mov dx,lhfil
|
||
sub ax,exllen
|
||
sbb dx,exhlen
|
||
mov lhfil,dx
|
||
mov llfil,ax
|
||
lea di,bufer
|
||
mov ax,[di+4]
|
||
mov cx,512
|
||
mul cx
|
||
add ax,[di+2]
|
||
adc dx,0
|
||
sub ax,llfil
|
||
sbb dx,lhfil
|
||
div cx
|
||
mov cx,dx
|
||
mov dl,[di+26h]
|
||
sub cx,dx
|
||
mov rema,cx
|
||
mov [di+2],dx ;store remainder of lenght
|
||
mov [di+4],ax ;store /512 lenght
|
||
|
||
mov ax,[di+18h] ;get ip
|
||
mov [di+14h],ax ;store
|
||
mov ax,[di+1ah] ;get cs:
|
||
mov [di+16h],ax ;store
|
||
|
||
mov ax,[di+1ch] ;get sp
|
||
mov [di+10h],ax ;store
|
||
mov ax,[di+1eh] ;get ss:
|
||
mov [di+0eh],ax ;store
|
||
|
||
clr cx
|
||
clr dx
|
||
mov ax,4200h
|
||
int 21h ;seek to prefix
|
||
mov cx,18h ;to write new prefix
|
||
lea dx,bufer
|
||
mov ah,40h
|
||
int 21h ;write 18h bytes prefix
|
||
mov cx,exhlen
|
||
mov dx,exllen
|
||
sub dx,rema
|
||
sbb cx,0
|
||
mov ax,4200h
|
||
int 21h ;seek end of file
|
||
jmp exelen
|
||
exework endp
|
||
|
||
findir proc near
|
||
; get dta
|
||
mov ah,2fh
|
||
int 21h
|
||
mov word ptr olddta[0],bx
|
||
mov word ptr olddta[2],es
|
||
;*****
|
||
lea dx,mydta
|
||
mov ah,1ah
|
||
int 21h
|
||
calln comwrk
|
||
mov word ptr fflag,0
|
||
calln basewr
|
||
|
||
; restore dta
|
||
push ds
|
||
lds dx,olddta
|
||
mov ah,1ah
|
||
int 21h
|
||
pop ds
|
||
ret
|
||
findir endp
|
||
|
||
basewr proc near
|
||
cmp word ptr fflag,0
|
||
jne nnextt
|
||
calln fdir
|
||
jc baret
|
||
jnc checkk
|
||
nnextt:
|
||
calln ndir
|
||
jc baret
|
||
checkk:
|
||
mov bx,odta
|
||
test ds:byte ptr[bx + dtas.atr],10h
|
||
je nnextt
|
||
cmp byte ptr dtas.sname[bx],'.'
|
||
je nnextt
|
||
mov ah,3bh ;chdir
|
||
mov dx,offset dtas.sname
|
||
add dx,bx
|
||
int 21h ;chdir
|
||
calln pdir
|
||
calln comwrk
|
||
mov fflag,0
|
||
inc coudir
|
||
calln basewr
|
||
bare:
|
||
pushf
|
||
lea dx,point
|
||
mov ah,3bh ;chdir up
|
||
int 21h ;chdir up
|
||
dec coudir
|
||
jns nosig
|
||
mov coudir,0
|
||
nosig:
|
||
mov fflag,1
|
||
popf
|
||
.br nnextt
|
||
|
||
baret:
|
||
ret
|
||
basewr endp
|
||
ndir proc near
|
||
calln stdta
|
||
mov ah,4fh
|
||
int 21h
|
||
ret
|
||
ndir endp
|
||
fdir proc near
|
||
calln stdta
|
||
lea dx,aster
|
||
mov cx,37h
|
||
mov ah,4eh
|
||
int 21h
|
||
ret
|
||
fdir endp
|
||
stdta proc near
|
||
mov ax,44
|
||
mul word ptr coudir
|
||
add ax,offset dtatab
|
||
mov odta,ax
|
||
mov dx,ax
|
||
mov ah,1ah
|
||
int 21h
|
||
ret
|
||
stdta endp
|
||
pdir proc near
|
||
push si
|
||
lea si,curdir
|
||
clr dl
|
||
mov ah,47h
|
||
int 21h
|
||
lea si,curdir
|
||
calln printz
|
||
callp carret
|
||
pop si
|
||
ret
|
||
pdir endp
|
||
prog ends
|
||
|
||
tail segment word 'prog' ;help segment to allocate end of code
|
||
xtail dw -1 ;and set the data segment
|
||
tail ends
|
||
|
||
data segment para public 'data' ;data segment
|
||
|
||
|
||
fname db 10h dup(0)
|
||
ffname db 10h dup(0)
|
||
mydta db 48 dup(?)
|
||
bufer db 28h dup(0)
|
||
dtatab dtas 12 dup(<>)
|
||
curdir db 64 dup(?)
|
||
_ss dw ? ;Lattice variables
|
||
_base dw ? ;Lattice variables
|
||
_dos dw ? ;Lattice variables
|
||
_top dw ? ;Lattice variables
|
||
odta dw 0
|
||
olddta dd 0
|
||
nepar dw 0
|
||
fhand dw 0
|
||
exhlen dw 0
|
||
exllen dw 0
|
||
llfil dw 0
|
||
lhfil dw 0
|
||
len dw 0
|
||
attr dw 0
|
||
atcx dw 0
|
||
atdx dw 0
|
||
rema dw 0
|
||
coudir dw 0
|
||
fflag dw 0
|
||
;notfnd db 'File not found',13,10,'$'
|
||
copyr db 'Dianakiller program V1.1 (C)Copyright Deny_Soft 1989',13,10,'$'
|
||
tryrem db 'Searching Diana in memory..',13,10,'$'
|
||
diakt db 'Diana found',7,' and removed extra',13,10,'$'
|
||
dinakt db "Diana isn't active",13,10,"$"
|
||
weak db 'Searching for weak files...',13,10,'$'
|
||
file db 'File $'
|
||
isok db 9,9,' ... restored',13,10,'$'
|
||
carret db 13,10,'$'
|
||
aster db '*.*',0
|
||
point db '..',0
|
||
root db '\',0
|
||
|
||
data ends
|
||
.pub <_ss,_base,_dos,_top> ;make external
|
||
udata segment public 'data'
|
||
udata ends
|
||
xstack segment 'data'
|
||
sbase dw 512 dup (?)
|
||
xstack ends
|
||
end start
|
||
|