[ Pobierz całość w formacie PDF ]

przyjrzeć się sposobowi działania CALL-a pośredniego. Otóż zauważmy iż poprzez zmianę odpowiedniego
wpisu w tablicy wskazywanej przez pole DDB_Service_Table_Ptr w bloku opisu urządzenia uzyskamy
zamierzony, przez nas, cel. W tym momencie mamy dwie możliwości zmiany owego wpisu. Otóż możemy
postąpić podobnie jak w powyższej procedurze uncall z0mb1e go mianowicie dokonać przeglądu zupełnego
 czyli przeglądnąć listę DDB, odszukać interesujący nas sterownik, pobrać z bloku opisu sterownika
wskaznik na tablicę serwisów i dokonać zmiany w tejże tablicy. Możemy natomiast wykorzystać to, iż
system operacyjny zmienia kod naszego VxD-ka wstawiając w miejsce wywołania serwisu CALL-a. Czyli
59
możemy najpierw wywołać interesujący nas serwis a następnie z opkodu CALLa odczytać adres, pod który
wpiszemy wskaznik na naszą procedurę obsługi. Przypatrzmy się przykładowi :
stary_VSD_Bell dd 0
Ring0:
int 20h
wsk_ dw 000Bh,0001h ; VxDCall VSD_Bell
mov esi,dword ptr [wsk_]
mov eax,[esi]
mov [stary_VSD_Bell],eax
mov eax,offset32 Nowy_VSD_Bell
mov [esi],eax
ret
Nowy_VSD_Bell PROC
[& ]
jmp [stary_VSD_Bell]
Nowy_VSD_Bell ENDP
Po wywołaniu serwisu VSD_Bell system operacyjny zmieni kod
int 20h
wsk_ dw 000Bh,0001h ; VxDCall VSD_Bell
na następującą postać :
dw 015FFh
wsk_ dd adres ; CALL DWORD PTR [adres]
Następne instrukcje pobierają owy adres i wykonują dalsze operacje mające na celu przejęcie serwisu.
Jak wcześniej zostało powiedziane VxD pośredniczy w przekazywaniu danych miedzy aplikacją a
urządzeniami peryferyjnymi. Z tego też względu sterownik urządzenia posiada możliwość przejęcia
mechanizmu obsługi plików zapamiętywanych w pamięciach zewnętrznych takich jak dysk twardy,
dyskietka. Możliwość tą gwarantuje sterownik jądra systemu IFSMGR (Installable File System Manager).
Poprzez skorzystanie z serwisu IFSMgr_InstallFileSystemApiHook tego sterownika jesteśmy w stanie
monitorować wszelkie operacje na plikach. Oto przykład jego użycia
push offset32 Procedura_obsługi
VxDCall IFSMgr_InstallFileSystemApiHook
or eax,eax
jz blad_instalacji
mov eax,[eax]
mov [stara_procedura_obsługi],eax
Aby deaktywować naszą procedurę należy użyć następującego serwisu :
push offset32 Procedura_obsługi
VxdCall IFSMgr_RemoveFileSystemApiHook
60
Po instalacji Procedury_obsługi wszelkie operacje na dysku/plikach będą nadzorowane przez naszą
procedurę. System operacyjny wywołuje ją z następującymi parametrami :
push fs_pioreq
push fs_code_page
push fs_res_flags
push fs_drive
push fs_func_num
push fs_fnaddr
call Procedura_obsługi
add esp,6*4
Parametry wejściowe :
fs_fnaddr Wartość tego parametru jest adresem na funkcje FSD (File System Drivers), która będzie
wywołana by obsłużyć daną API
fs_func_num Parametr ten określa funkcję, która jest w tym momencie przetwarzana przez system obsługi
plików. Oto ważniejsze z nich :
IFSFN_READ Odczyt z pliku.
IFSFN_WRITE Zapis do pliku.
IFSFN_OPEN Otwarcie/Stworzenie pliku.
IFSFN_CLOSE Zamknięcie pliku.
fs_drive
fs_res_flags Parametr ten określa na jakiego typu nośnikach jest wykonywana operacja.
fs_code_page Parametr ten określa w jakim standardzie są kodowane łańcuchy. Przyjmuje on następujące
wartości :
BCS_WANSI Standard Windows ASCI
BCS_OEM Standard OEM
fs_pioreq Jest to wskaznik na strukturę IOREQ, która jest wypełniana zależnie od funkcji.
Oto wersja struktury IOREQ dla 32bitowych VxD :
IOREQ
ir_length DWORD ? Długość bufora użytkownika
ir_flags BYTE ? Różne flagi statusowe
ir_user BYTE ? ID użytkownika
ir_sfn WORD ? Numer systemu plików lub uchwyt pliku
ir_pid DWORD ? ID procesu
ir_ppath DWORD ? Nazwa pliku w formacie UNICODE
ir_aux1 DWORD ? Drugi bufor z danymi (CurDTA)
ir_data DWORD ? Wskaznik do bufora użytkownika
ir_options WORD ? Opcje
ir_error WORD ? Kod błędu (0 jeśli OK.)
ir_rh DWORD ? Uchwyt zasobu
ir_fh DWORD ? Uchwyt pliku
ir_pos DWORD ? Pozycja w pliku
ir_aux2 DWORD ? Dodatkowe parametry API
ir_aux3 DWORD ? Dodatkowe parametry API
ir_pev DWORD ? Wskaznik do zdarzenia IFSMGR dla asynchronicznych funkcji.
ir_fsd DWORD 16 dup(?) Obszar roboczy
IOREQ
61
Parametry wyjściowe :
Parametry wyjściowe procedury Procedura_obsługi zależą od numeru funkcji, która jest bieżąco
obsługiwana. Jeśli Procedura_obsługi nie obsługuje danej funkcji powinna, a raczej musi, wywołać
poprzednią procedurę obsługi systemu plików.
Dostęp do plików z poziomu VxD możemy uzyskać w dwojaki sposób mianowicie przez skorzystanie z
serwisów IFSMGR lub też poprzez przerwania.
Poprzez skorzystanie z serwisu IFSMgr_Ring0_FileIO udostępnianego przez IFSMGR jesteśmy w stanie
przeprowadzać wszelkie operacje na plikach
Funkcja Odpowiedniki Opis
R0_OPENCREATEFILE int 21h AH=6Ch Tworzyć/Otwierać plik
R0_READFILE int 21h AH=3Fh Czytać z pliku
R0_WRITEFILE int 21h AH=40h Zapisywać do pliku
R0_CLOSEFILE int 21h AH=3Eh Zamykać plik
R0_GETFILESIZE int 21h AH=23h Pobierać rozmiar pliku
R0_FINDFIRSTFILE int 21h AX=714Eh Przeszukiwać katalog
R0_FINDNEXTFILE
R0_FINDCLOSEFILE
R0_FILEATTRIBUTES Odczytywać/zmieniać atrybuty plików
R0_RENAMEFILE int 21h AH=17h Zmieniać nazwę plików
R0_DELETEFILE int 21h AH=41h Kasować pliki
R0_FILELOCKS int 21h AH=5Ch Nakładać restrykcje na pliki
R0_GETDISKFREESPACE int 21h AH=36h Pobierać informacje o wolnej
przestrzeni dysku [ Pobierz całość w formacie PDF ]
  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • szamanka888.keep.pl