FORMATY PLIKóW VxDtut2



SYSTEM SERWISOW
Writeln by [CoxoC]


Nasz VxD ma mozliwosc zakladania filtrow , przejmowania serwisow innego wirtualnego urzadzenia
w celu monitorowania lub podmiany serwisu na swoj itd. A wiec potrzebna jest czesc kodu
inicjalizacyjna i konczaca wykonywanie VxDka.Czyli :


VXD_Icode_Seg

BeginProc PIERWSZY_Device_Init

mov eax, FFh
mov esi, OFFSET32 HookIntFF
VMMCall Hook_V86_Int_Chain ;przejmij przerwanie FFh (trybu V86)


clc ;informacja dla systemu ze procedura zakonczyla sie powodzeniem
ret
EndProc PIERWSZY_Device_Init

VXD_Icode_Ends

VXD_Locked_Code_Seg

BeginProc PIERWSZY_Device_Exit

mov eax, FFh
mov esi, OFFSET32 HookIntFF
VMMCall UnHook_V86_Int_Chain ; nie bede tego opisywal :>


clc
ret
EndProc PIERWSZY_Device_Exit


;=====================
; Procedura obslugi przerwania FFh
;=====================

BeginProc HookIntFF
pushfd
pushad ;wszystkie rejestry na stos

mov AH,[ebp.Client_AH]
cmp AH,04h
je ...

itd..

popad ;przywroc wszystkie wartosci
popfd
clc
ret
EndProc KookIntFF


VXD_LOCKED_CODE_ENDS

Powyzszy przyklad przejmuje przerwanie FFh.Widac,ze odczyt stanu rejestrow przed wywolaniem
tego przerwania wyglada nastepujaca :

mov AH,[ebp.Client_AH]

Oczywiscie jak chcemy odczytac wartosc innego rejestru to napiszemy :

mov BX,[ebp.Client_DS]
mov EAX,[ebp.Client_EIP]
itd.

Ale koniec z tymi przerwaniami narazie ....


Aby przejac serwis innego wirtualnego urzadzenia uzywa sie serwisu Hook_Device_Service
Przykladowo gdy chcemy przejac serwis VKD_Get_Kbd_Owner napiszemy :

GetVxDServiceOrdinal eax, VKD_Get_Kbd_Owner
mov esi, offset32 Proc_Get_Kbd_Owner
VMMCall Hook_Device_Service
mov Poprzednia_Proc, esi

A gdy chcemy usunac swoja procedure napiszemy :

GetVxDServiceOrdinal eax, VKD_Get_Kbd_Owner
mov esi, offset32 Proc_Get_Kbd_Owner
VMMCall UnHook_Device_Service

.... lecz w tym momencie musimy byc ostrozni gdyz gdy przejmujemy takie serwisy ktore
obsluguja np mysz wtedy gdy usuniemy swoja procedurke w sposob pokazany wyzej to przy
nastepnym ruchu myszka zawiesi sie system !! dlaczego ? zauwazmy,ze serwis
Hook_Device_Service zwraca w esi entrypoint do poprzedniej procedury obslugi tego
serwisu nie na darmo zreszta ! gdyz jak by byly np. dwie procki obslugi to system
by nie wiedzial do ktorej skoczyc (poniewaz jest tak juz napisany). Wiec czasami
aby usunac nasza procke obslugi serwisu musimy uzyc :

GetVxDServiceOrdinal eax, VKD_Get_Kbd_Owner
mov esi,Poprzednia_Proc
VMMCall Hook_Device_Service


GetVxDServiceOrdinal jest to makro ktore do EAX wpisuje reprezentacje liczbowa serwisu
podanego w parametrze drugim

A VMMCall uzywa sie do uruchamiania serwisow urzadzenia VMM (Virtual Manager)




Wyszukiwarka