Перехват INT 2e

Тема в разделе "WASM.WIN32", создана пользователем Iceberg, 14 фев 2006.

  1. Iceberg

    Iceberg New Member

    Публикаций:
    0
    Регистрация:
    5 дек 2005
    Сообщения:
    54
    Адрес:
    Санкт-Петербург
    Почему не срабатывает перехват INT 2e? Изменяю указатель в IDT по смещению 0x170 (0x8 * 0x2e), перезапись проходит успешно, но следом идет перезагрузка? Да, дело было на xp sp2


    Код (Text):
    1.  
    2. void __declspec(naked) new_syscall(void)
    3. {
    4.     __asm
    5.     {
    6.         pushad
    7.         pushfd
    8.         push    fs
    9.  
    10.         mov     di,     0x30
    11.         mov     fs,     di
    12.  
    13.         ; fs[0x30]      -> struct _KPRC
    14.         ; _KPCR[0x120]  -> struct _KPRCB PrcbData;
    15.         ; _KPRCB[0x4]   -> struct _KTHREAD* CurrentThread;
    16.  
    17.         mov     eax,    fs:[0x124]  ; _KTHREAD*
    18.  
    19.         ; _KTHREAD[0x34]    -> struct _KAPC_STATE ApcState
    20.         ; _KAPC_STATE[0x10] -> struct _KPROCESS* Process;
    21.  
    22.         mov     eax,    [eax+0x44]  ; _KPROCESS* is EPROCESS address
    23.  
    24.         ;push   eax
    25.         ;call   Xxxxxx
    26.  
    27.         pop     fs
    28.  
    29.         popfd
    30.         popad
    31.  
    32.         jmp     old_int2e
    33.     };
    34. }
    35.  
    36. void __int2e_hook()
    37. {
    38.     IDT idt;
    39.     PVOID p = &idt;
    40.    
    41.     __asm
    42.     {
    43.             pushad
    44.  
    45.             mov     ecx,    0x176
    46.  
    47.             rdmsr
    48.  
    49.             mov     old_sysenter,   eax
    50.             mov     eax,    new_syscall
    51.             xor     edx,    edx
    52.  
    53.             wrmsr
    54.  
    55.             sidt    [idt]
    56.             mov     edi,    [p]
    57.             add     edi,    0x02
    58.             mov     ebx,    [edi]
    59.  
    60.             ; 0x8 * 0x2e = 0x170
    61.             xchg    [ebx + 170h],   ax
    62.  
    63.             rol eax, 0x10
    64.  
    65.             xchg [ebx + 0x176], ax
    66.  
    67.             ror eax, 0x10
    68.  
    69.             mov old_int2e, eax
    70.             popad
    71.     }
    72. }
    73.  
     
  2. Ms Rem

    Ms Rem New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2005
    Сообщения:
    1.057
    Адрес:
    С планеты "Земля"
    Пример есть в сорцах phunter, правда там не совсем корректно реализован перехват fast system call.

    на XP SP1 есть такие грабли, которые заключаются в том, что SYSENTER_ESP_MSR = 0, а следовательно стек в обработчике сискала недоступен, сначала надо загрузить esp.

    Примерно это будет выглядеть так:


    Код (Text):
    1. static
    2. _declspec(naked) NewKiFastcallEntry()
    3. {
    4.     __asm
    5.     {
    6.         mov    esp, ss:[0x0FFDFF040]
    7.         mov    esp, ss:[esp+4]
    8.         pushad
    9.         pushfd
    10.         push   fs
    11.         push   ds
    12.         mov    bx, 0x30
    13.         mov    fs, bx
    14.         mov    bx, 0x24
    15.         mov    ds, bx
    16.         call   ProcessSyscall
    17.         pop    ds
    18.         pop    fs
    19.         popfd
    20.         popad
    21.         jmp    [TrueKiFastcallEntry]
    22.     }
    23. }
     
  3. Ms Rem

    Ms Rem New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2005
    Сообщения:
    1.057
    Адрес:
    С планеты "Земля"
    С перехватом sysenter есть еще одни неочевидные грабли, как натолкнешся на них, так спросишь.
     
  4. CARDINAL

    CARDINAL Member

    Публикаций:
    0
    Регистрация:
    23 янв 2004
    Сообщения:
    551
    Адрес:
    Moscow




    да, когда процессор более древней версии просто не поддерживает данную команду, поэтому перед было бы неплохо спрашивать у него cpuid/
     
  5. Ms Rem

    Ms Rem New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2005
    Сообщения:
    1.057
    Адрес:
    С планеты "Земля"
    Ага, и еще читать SYSENTER_CS_MSR, если он нулевой, то fast system call не используется.


    Код (Text):
    1. __asm
    2.     {
    3.         pushad
    4.         mov     eax, 1
    5.         cpuid
    6.         and     edx, 0x800
    7.         test    edx, edx
    8.         jz      _exit
    9.         mov     ecx, 0x174
    10.         rdmsr
    11.         mov     [SeAddr], eax      
    12.      _exit:
    13.         popad
    14.     }
    15.