15.05.2000 Пару слов о sPIDER'е [Green Monster]
  Хитрая тварь...
  Кстати, красиво написан, черт его побери ;-) Я даже совсем было
  подумал, что на 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