Kilka słów na temat syscalli

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.

1
2
3
4
5
6
7
8
9
10
11
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.

1
2
3
4
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

Podziel się:
  • Digg
  • Facebook
  • Google Bookmarks
  • Blip
  • Flaker
  • RSS
  • Twitter
  • Wykop
Tags: , , , , ,


5 Responses to “Kilka słów na temat syscalli”

  1. hxv Says:

    Brawo, w końcu coś napisałeś, ak kiedyś nauczę się programować to na pewno się przyda ;)

  2. Grzonu Says:

    oj nie przesadzaj ;) obaj wiemy ze potrafisz :)

  3. widmo Says:

    Zrozumiałem tylko pierwszy paragraf, jest nieźle. : d

  4. Grzonu Says:

    w takim razie powiedz czego konkretnie w dalszej czesci nie rozumiesz. Bo to zadna sztuka pisac niezrozumiałe arty xD

  5. Gynvael Coldwind Says:

    Cześć :)

    Warto dodać jeszcze, że Windows korzysta z dwóch mechanizmów do uruchamiania syscalli, i wykorzystuje odpowiedni, w zależności od zdolności (wirtualnego?) procesora. Niezależnie od tego który jest wykorzystywany, to oba są aktywne (http://gynvael.coldwind.pl/?id=91).

    Pierwszym jest wspomniany przez autora sysenter, a drugim int 0x2e.

    Jeżeli ręcznie implementujmy wywołanie syscalli, warto sprawdzić czy CPU obsługuje sysenter (cpuid), i korzystać odpowiedniej metody. Wydawałoby się, że nie jest to istotne „bo przecież każdy nowy procesor ma sysenter”. Jednak od niedawna popularyzują się wszelkiego rodzaju wirtualizery (VirtualPC, Virtual Box, VMWare, Qemu, etc etc) i jak się okazuje, nie wszystkie obsługują sysenter (o czym pisze m.in. Icewall w poście http://www.icewall.pl/2009/10/27/vboxvirtual-pcvmware-i-idt-hooking/).

    I tyle chyba ;>

Leave a Reply