Хитрая тварь...
Кстати, красиво написан, черт его побери ;-) Я даже совсем было
подумал, что на ASMе...
Вот вам из него кусок (spider.vxd), из которого ясно видно,
какой способ защиты IDT/GDT используется там:
(от WEB'а v4.16)
;----------------------------------------------------------------------
;Инициализация:
;----------------------------------------------------------------------
C001F773 sidt qword ptr ds:IDT_base ;Получил IDTR
C001F77A mov esi, ds:IDT_base+2 ;ESI = IDT.base
C001F780 shr esi, 0Ch ;ESI = IDT page
C001F783 mov ds:IDT_Page, esi ;Сохранил страничку IDT
C001F789 call Protect_Page ;Защитил страничку от
;записи
C001F78E cmp eax, 0FFFFFFFFh ;Облом?
C001F791 jz loc_C001F855 ;
C001F797 mov ds:dword_C001DBDD, eax ;
C001F79C sgdt qword ptr ds:GDT_base ;Получил GDTR
C001F7A3 mov esi, ds:GDT_base+2 ;ESI = GDT.base
C001F7A9 shr esi, 0Ch ;ESI = GDT page
C001F7AC mov ds:GDT_Page, esi ;Сохранил страничку GDT
C001F7B2 call Protect_Page ;Защитил страничку от
;записи
C001F7B7 cmp eax, 0FFFFFFFFh ;Облом?
C001F7BA jz loc_C001F844 ;
C001F7C0 mov ds:dword_C001DBE1, eax ;
C001F7D2 mov eax, 1008Ah ;VMM_Set_PM_Exec_Mode
;equ 00001008Ah
C001F7D7 mov esi, offset loc_C001F99D ;Обработчик
C001F7DC VMMcall Hook_Device_Service ;Перехватить
C001F7E2 jb short loc_C001F828 ;
C001F7E4 mov eax, 10089h ;VMM_Set_V86_Exec_Mode
;equ 000010089h
C001F7E9 mov esi, offset loc_C001F9B6 ;Обработчик
C001F7EE VMMcall Hook_Device_Service ;Перехватить
C001F7F4 jb short loc_C001F818 ;
C001F7F6 mov eax, 100E9h ;VMM_Hook_Invalid_Page_Fault
;equ 0000100E9h
C001F7FB mov esi, offset loc_C001F96C ;Обработчик
C001F800 VMMcall Hook_Device_Service ;Перехватить
C001F806 jnb short loc_C001F866 ;
ну, и так далее...
;----------------------------------------------------------------------
;Invalid_Page - обработчик исключения Invalid_Page_Fault
;----------------------------------------------------------------------
C001F9C7 Invalid_Page proc near ;
C001F9C7 mov eax, [edi] ;EAX = адрес,
;обращение к
;которому вызвало
;исключение.
C001F9C9 shr eax, 0Ch ;EAX = страничка
C001F9CC cmp eax, ds:IDT_Page ;Это страничка IDT?
C001F9D2 jz short Wow_!_! ;Ага-а-а-а!!!
C001F9D4 cmp eax, ds:GDT_Page ;Это страничка GDT?
C001F9DA jnz short no_vpf ;Нет? Тогда нам
;пополам.
C001F9DC ;
C001F9DC Wow_!_!: ;Обработать вирусную
;активность
C001F9DC cmp ds:AntiRecurse, 0 ;Обработчик уже
;выполняется?
C001F9E3 jnz short vpf ;Да? Ну и фиг с ним!
C001F9E5 inc ds:AntiRecurse ;Забарикадировался
C001F9EB mov ebx, [edi+0Ch] ;???
C001F9EE mov dword ptr ds:byte_C001DBE9+14h, ebx
C001F9F4 VMMcall Get_Cur_Thread_Handle ;Получить текущий
;хэндл
C001FA0B mov ebx, ds:dword_C001B251 ;Прописать процедуру,
C001FA11 mov esi, offset loc_C001FA23 ;выкидывающую экран
;СПИДЕРа.
C001FA16 xor edx, edx ;
C001FA18 VMMcall Schedule_VM_Event ;
C001FA1E ;
C001FA1E vpf: ;
C001FA1E clc ;Сказать, что все ok
C001FA1F jmp short locret_C001FA22 ;Вломы человеку
;было RET
;поставить, что ли?
C001FA21 ; ---------------------------------------------------------
C001FA21 ;
C001FA21 no_vpf: ;
C001FA21 stc ;
C001FA22 ;
C001FA22 locret_C001FA22: ;
C001FA22 retn ;
C001FA22 Invalid_Page endp ;
;---------------------------------------------------------------------
Выражаясь понятным человеческим языком, никакой SEH не спасает нас
от СПИДЕРовского экрана. Вероятно дело обстоит так:
1. Int 0E - низкоуровневое исключение Page_Fault.
2. Invalid_Page_Fault - VxD'шная цепочка перехватов посредством
VMM_Hook_Invalid_Page_Fault
3. Windows exception - исключение формализуется, и вызывается
цепочка
SEH-обработчиков.
Ошибка доступа к странице проходит эти 3 (может больше?) ступени
последовательно: (1) --> (2) --> (3).
Нам (в win32) доступен только SEH, его мы и перехватываем.
СПИДЕР же получает управление на 2-ом уровне, следовательно до нас
ошибка просто НЕ ДОХОДИТ.
Думаю, ситуация со СПИДЕРом ясна.
;-----------------------------------------------------------------------
Что со всем этим делать:
1. СПИДЕРа можно игнорировать, используя методы перехода в ring0,
против которых он бессилен (LDTA/LDTS/PVMM), а потом все ему
нахрен отрубать через VxdCall'ы.
2. СПИДЕРа можно пропатчить с ring3 !!!!!!!!
Это, я вам скажу, КРУТО!
Надо ж было додуматься оставить странички самого СПИДЕРа без
защиты.
Правда, искать его по памяти долго и нудно
(если брать поиск в 64Mb, на моем 300ом пеньке занимает 0.5 секунд
в случае присутствия SPIDER'а и 4 - ежели его нет).
Ну да ладно, юзерам торопиться некуда ;-)
Реализацию см. в test2.asm
;-------------------------------------------------------------------------
Green Monster, 03.05.00
[email protected]
P.S. Недавно залил WEB 4.17, ну и СПИДЕРа естесьно апгрейднутого.
Там все, вроде, то же самое, только теперь он еще хватает
_PageModifyPermissions и переустанавливает защиту xDT'ей
после каждого ее вызова. Сигнатуры, забитые в test2.asm,
работают и с ним.
P.P.S. Кому интересно, могет глянуть, че я там IDA'ой на дизассемблил
(см. SPIDER.IDB).
Копал только маленький кусочек, отвечающий за защиту памяти.
Также в качестве шутки можно послать указанный файл в ДиалогНауку
с приветом от Лаборатории Касперского. Во крику-то будет...
Статья для журнала Top Device
|