[TUTORIAL]Kilka słów o syscallach

grzonu

Były Moderator
Dołączył
Grudzień 26, 2006
Posty
1390
No to chciałem napisać arta o tym jak windows wywołuje funkcje do wywołania których konieczne jest wejście w tryb

jądra do którego program usera który jest w ring3(sterowniki i jądro sa w ring0) nie ma dostepu. Mechanizm ten nosi

nazwe syscall. Przedstawie jak wyglada przykładowe wywołanie np. ZwTerminateProcess.

Kod:
PUSH 0 
PUSH -1     ;rzucamy na stos parametry funkcji
CALL TERM   ;wywolujemy ZwTerminateProcess
RET
TERM:
MOV EAX,101h ;do eax kopiujemy numer funkcji (tutaj jest to numer ZwTerminateProcess)
CALL SYS     ;wywolujemy syscall (tak samo wyglada funkcja KiFastSystemCall)
SYS:
MOV EDX,ESP
SYSENTER     ;tu nastepuje przejscie do trybu jądra
RET

Widzimy wiec ze nie jest to trudne i wydaje sie bardzo wygodne w roznych shellcodach itp ale jak zawsze jest jakies

ale no wiec w tym przypadku oczywiscie tez jest i jest nim to ze numer funkcji jest różny w kazdej wersji systemu.
Mamy 2 opcje albo probujemy dynamicznie pobrac z ZwTerminateProcess który jest w ntdll ale tu musimy znalesc jej

adres. Metoda ta jest dobra jesli potrzebujemy kompatybilnosci z KAZDYM systemem. jesli potrzebujemy

kompatybilnosci tylko z wybranymi to jest inna metoda na pobranie wersji systemu i dopasowanie odpowiedniego numeru

syscalla bez uzywania jakiegokolwiek wywolania API.

Kod:
MOV EAX,DWORD PTR FS:[18h]	;do eax kopiujemy adres TEB
MOV EDI,DWORD PTR DS:[EAX+30h]	;do edi kopiujemy adres PEB
MOV EBX,DWORD PTR DS:[EDI+A4h]	;do ebx kopiujemy major version number
MOV ECX,DWORD PTR DS:[EDI+A8h]	;do ecx kopiujemy minor version number

przykladowo dla XP wersja to 5.1 wiec major = 5 a minor = 1 wiec ebx = 5 a ecx = 1
numery innych systemow znajdziemy w MSDN

Teraz mozemy juz dopasowac numer zaleznie od wersji jaka chcemy.

Jakie sa inne zalety?
-Omijamy w ten sposob wszystkie hooki zalozone w user-mode.
-Nie musimy szukac adresu potrzebnej nam funkcji.
-Kod dzieki temu jest mniejszy

Teraz mała uwaga dla piszacych sterowniki.
Dodam na koniec ze numer funkcji jest indexem danej funkcji w tabeli SSDT (numery 1-1000) i ShadowSSDT(1000+).
Obie te tablice znajdują się w przestrzeni adresowej jądra więc nie mamy do niej dostepu z User-mode.
W tablicy SSDT znajduja sie funkcji eksportowane przez ntoskrnl.exe(jądro) a w ShadowSSDT funkcje eksportowane

przez win32k.sys gdzie znajduja sie funkcje zwiazane z okienkami,wejsciem,wyjsciem. SSDT jest eksportowane przez

jadro i nie ma wiekszych klopotow z jego znalezieniem za to ShadowSSDT nie jest eksporotwane i metode na jej

znalezienie wymyslil Alexander Volynkin(http://www.volynkin.com/sdts.htm)

Tablice syscalli dla poszczególnych systemów:
http://j00ru.vexillium.org/win32k_syscalls/
http://www.metasploit.com/users/opcode/syscalls.html

Artykuł pochodzi ze strony http://grzonu.pl

//Do innych modów: nie przenoscie do tutoriali narazie ;)
 

D.F.

Były Moderator
Członek Załogi
Dołączył
Listopad 4, 2009
Posty
493
Prosto opisane, łatwo zrozumieć. Są podstawy by sięgnąć później do artykułów technicznych, nawet obcojęzycznych.

Czekam na kolejne artykułu o programowaniu niskopoziomowym, może coś o pisaniu sterowników? ;)
 
Do góry Bottom