Воствновление регистра SYSENTER_EIP_MSR

Тема в разделе "WASM.NT.KERNEL", создана пользователем Mad666, 10 фев 2009.

  1. Mad666

    Mad666 New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2009
    Сообщения:
    6
    Как сделать hook на sysenter это понятно. А вот как снять чужой не очень.
    Получаю msr[0x176] затем мне надо узнать реальный адрес KiFastCallEntry которая и является обработчиком сисентера, чей адрес находиться в msr[0x176]. Как можно получить этот адрес например из ntoskrnl.exe.
     
  2. blast

    blast New Member

    Публикаций:
    0
    Регистрация:
    8 мар 2008
    Сообщения:
    170
    Из любой Zw** экспортируемой ntoskrnl.exe

    ZwYieldExecution:
    Код (Text):
    1. 004074D5 > B8 16010000      MOV EAX,116
    2. 004074DA   8D5424 04        LEA EDX,DWORD PTR SS:[ESP+4]
    3. 004074DE   9C               PUSHFD
    4. 004074DF   6A 08            PUSH 8
    5. 004074E1   E8 C0090000      CALL ntoskrnl.00407EA6    ;KiFastCallEntry
    6. 004074E6   C3               RETN
    Либо отсюда можно найти по сигнатуре:
    Код (Text):
    1. 0043EB04   8BFF             MOV EDI,EDI
    2. 0043EB06   56               PUSH ESI
    3. 0043EB07   3E:A1 20F0DFFF   MOV EAX,DWORD PTR DS:[FFDFF020]
    4. 0043EB0D   803D FC274800 00 CMP BYTE PTR DS:[4827FC],0
    5. 0043EB14   8BF0             MOV ESI,EAX
    6. 0043EB16   74 31            JE SHORT ntoskrnl.0043EB49
    7. 0043EB18   6A 00            PUSH 0
    8. 0043EB1A   6A 08            PUSH 8
    9. 0043EB1C   68 74010000      PUSH 174
    10. 0043EB21   E8 35000000      CALL ntoskrnl.0043EB5B
    11. 0043EB26   6A 00            PUSH 0
    12. 0043EB28   68 6F7F4000      PUSH ntoskrnl.00407F6F           ;KiFastCallEntry
    13. 0043EB2D   68 76010000      PUSH 176
    14. 0043EB32   E8 24000000      CALL ntoskrnl.0043EB5B
    15. 0043EB37   6A 00            PUSH 0
    16. 0043EB39   FFB6 68080000    PUSH DWORD PTR DS:[ESI+868]
    17. 0043EB3F   68 75010000      PUSH 175
    18. 0043EB44   E8 12000000      CALL ntoskrnl.0043EB5B
    19. 0043EB49   5E               POP ESI
    20. 0043EB4A   C2 0400          RETN 4
    21. 0043EB4D   90               NOP
    22. 0043EB4E   90               NOP
    23. 0043EB4F   90               NOP
    24. 0043EB50   90               NOP
    25. 0043EB51   90               NOP
    26. 0043EB52   0F32             RDMSR                                             ; Privileged command
    27. 0043EB54   C3               RETN
    28. 0043EB55   90               NOP
    29. 0043EB56   90               NOP
    30. 0043EB57   90               NOP
    31. 0043EB58   90               NOP
    32. 0043EB59   90               NOP
    33. 0043EB5A   90               NOP
    34. 0043EB5B   8B4C24 04        MOV ECX,DWORD PTR SS:[ESP+4]
    35. 0043EB5F   8B4424 08        MOV EAX,DWORD PTR SS:[ESP+8]
    36. 0043EB63   8B5424 0C        MOV EDX,DWORD PTR SS:[ESP+C]
    37. 0043EB67   0F30             WRMSR                                             ; Privileged command
    38. 0043EB69   C2 0C00          RETN 0C
    39. 0043EB6C   8D49 00          LEA ECX,DWORD PTR DS:[ECX]
    40. 0043EB6F   C3               RETN
     
  3. Forever

    Forever Виталий

    Публикаций:
    0
    Регистрация:
    12 апр 2008
    Сообщения:
    244
    Что то не похоже на правду :
    Код (Text):
    1. kd> u nt!ZwYieldExecution
    2. nt!ZwYieldExecution:
    3. 804de4d5 b816010000      mov     eax,116h
    4. 804de4da 8d542404        lea     edx,[esp+4]
    5. 804de4de 9c              pushfd
    6. 804de4df 6a08            push    8
    7. 804de4e1 e8c0090000      call    nt!KiSystemService (804deea6)
    8. 804de4e6 c3              ret
    9. 804de4e7 90              nop
    10. 804de4e8 8bff            mov     edi,edi
     
  4. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Mad666
    Хочешь я тебя обламаю :dntknw:
    Тут писал гдето про инструкцию Sysenter, она флажёк трассировки не сбрасывает. Значит я сделою так.
    Перед вызовом Sysenter я установлю EFlags.TF -> 1. Далее произойдёт следующее:
    1. Если ты подменил в MSR вход, то будет вызван твой обработчик, но так как TF останется взведённым после исполнения первой инструкции хэндлера возникнет трассировочное исключение. Управление получит код, указатель на который определён в шлюзе прерывания, по дефолту там KiTrap01(). Далее будет вызван KiDispatchException(), если установлен твой хэндлер исключений в KiDebugRoutine, то он будет вызван. Иначе - голубой огонёк :)
    2. Если ты выполнишь перехват KiFastCallEntry() к примеру сплайсингом. В таком случае дело совсем плохо. Опятьже возникает трассировочное исключение, вызывается KiTrap01(). В нём проверка:
    Код (Text):
    1. cmp ecx,ntoskrnl._KiFastCallEntry
    Далее управление передаётся на KiFastCallEntry2(). А там формирование фрейма и передача управления:
    Код (Text):
    1. 00406DB2 _KiFastCallEntry2                mov ecx,30
    2. 00406DB7                                  mov fs,cx
    3. 00406DB9                                  mov ecx,23
    4. 00406DBE                                  mov ds,cx
    5. 00406DC0                                  mov es,cx
    6. 00406DC2                                  mov ecx,dword ptr fs:[40]
    7. 00406DC9                                  mov esp,dword ptr ds:[ecx+4]
    8. 00406DCC                                  push 23
    9. 00406DCE                                  push edx
    10. 00406DCF                                  pushfd
    11. 00406DD0                                  or byte ptr ss:[esp+1],1
    12. 00406DD5                                  jmp short <ntoskrnl.Kfsc10>
    Управление получит код Kfsc10:
    Код (Text):
    1. 00406E0F _KiFastCallEntry                 mov ecx,23
    2. 00406E14                                  push 30
    3. 00406E16                                  pop fs
    4. 00406E18                                  mov ds,cx
    5. 00406E1A                                  mov es,cx
    6. 00406E1C                                  mov ecx,dword ptr fs:[40]
    7. 00406E23                                  mov esp,dword ptr ds:[ecx+4]
    8. 00406E26                                  push 23
    9. 00406E28                                  push edx
    10. 00406E29                                  pushfd
    11. 00406E2A <Kfsc10>                         push 2
    Тоесть если заюзоть Sysenter с взведённым TF, то в общем первые 10 инструкций в начале KiFastCallEntry() пропускаются и вызов идёт в обход твоего перехвата :))
    blast
    Скачалбы символы - удобно.
     
  5. Freeman

    Freeman New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2005
    Сообщения:
    1.385
    Адрес:
    Ukraine
    Forever, сталобыть сигнатурным поиском остаецо... на ХР и 2к можно идти от KiSystemService вниз, на остальных не знаю.
     
  6. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Freeman
    Ога; http://files.virustech.org/indy/Tracer/subinfo.asm
    Тока есчо не протестил как следует.
     
  7. Mad666

    Mad666 New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2009
    Сообщения:
    6
    Всем спасибо за ответы!

    blast в ZW функциях KiSystemService, которую, например, можно получить перехватив любой Nt вызов и вернуться по стеку или по сигнатурам из ntoskrnl.exe

    Clerk Ничего я перехватывать не хочу. Я пишу драйвер для востановления системы (SSDT, SSDT shadow, IDT, SYSENTER и т.д.)

    FreemanВидимо только это.

    ClerkСпасибо за код, посмотрим, попробуем.
     
  8. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Mad666
    ИМХО задача поиска для многих не экспортируемых функций/переменных слишком сложна и не универсальна. У меня был вариант посмотреть в сторону отладочных символов(нтос у меня занимает ~4М).