Перехват SYSTEM_THREAD_EXCEPTION_NOT_HANDLED

Тема в разделе "WASM.NT.KERNEL", создана пользователем JCronuz, 2 авг 2010.

  1. JCronuz

    JCronuz New Member

    Публикаций:
    0
    Регистрация:
    26 сен 2007
    Сообщения:
    1.240
    Адрес:
    Russia
    Установил бряк

    Код (Text):
    1. NTSTATUS DriverEntry(IN PDRIVER_OBJECT pDriverObject,
    2. IN PUNICODE_STRING pusRegistryPath)
    3. {
    4. __asm int 3
    5.  
    6.  
    7. //[...]
    8. }
    Естественно вылетел БСОД с исключением SYSTEM_THREAD_EXCEPTION_NOT_HANDLED.
    Как можно обработать исключение SYSTEM_THREAD_EXCEPTION_NOT_HANDLED, какой сервис ответственнен за обработку этого исключения?

    Естественно __try / __except не интересует :)
     
  2. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    Я правильно понимаю, что тебе нужно брякаться и в отладке и без оной, и чтобы система не падала?
     
  3. JCronuz

    JCronuz New Member

    Публикаций:
    0
    Регистрация:
    26 сен 2007
    Сообщения:
    1.240
    Адрес:
    Russia
    Мне нужно научится перехватывать исключение вызыванное вызовом int 3, так как это делает ядерный отладчик, что бы получить дальнейшее управление из своего драйвера который и вызвал исключение
     
  4. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    JCronuz
    #BP, KiTrap03.
    KiDebugRoutine.
     
  5. JCronuz

    JCronuz New Member

    Публикаций:
    0
    Регистрация:
    26 сен 2007
    Сообщения:
    1.240
    Адрес:
    Russia
    Спасибо, перевариваю полученную инфу :)
     
  6. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    JCronuz
    Тут семпл можите посмотреть http://files.virustech.org/indy/Code/XcptIp/, вам статус нужно изменить на STATUS_BREAKPOINT здесь:
    Код (Text):
    1. U_Xcpt:
    2.     cmp [esi].ExceptionCode,STATUS_ILLEGAL_INSTRUCTION  ; #UD
    3.     jne Chain
    Вот тут можите посмотреть как выполняется работа с графом, это для обработки сепшенов из первого семпла, так как код мутирующий его границы не определены, создаётся граф для всего кода(GpCreateSnapshot()) и диспетчер исключений проверяет принадлежность инструкции вызвавшей фолт графу(GpFastCheckIpBelongToSnapshot()): http://files.virustech.org/indy/Code/XcptGp/
    Тогда обработчик должен выполнить вместо линейной проверки:
    Код (Text):
    1.     Call XDT1
    2. XDT1:
    3.     pop eax
    4.     lea ecx,[eax + (offset GV_L1 - offset XDT1)]    ; Base
    5.     lea edx,[eax + (offset GV_L2 - offset XDT1)]    ; Limit
    6.     cmp ebx,ecx
    7.     jb Chain
    8.     cmp ebx,edx
    9.     jnb Chain
    Проверку на вхождение в граф:
    Код (Text):
    1.     lea eax,GpEntry
    2.     mov ecx,fs:[PcEnvironment]
    3.     push eax
    4.     push [esi].rEip ; KTRAP_FRAME.rEip
    5.     push ENGINE_ENVIRONMENT.GpSelf[ecx]
    6.    
    7. ; * Для быстрого поиска описателя в графе он должен быть создан с замаскиро
    8. ; * ванным флагом GCBE_PARSE_SEPARATE(один вход описывает линейный блок, а
    9. ; * не каждую инструкцию).
    10.  
    11.     Call GpFastCheckIpBelongToSnapshot
    12.     test eax,eax
    13.     jnz Chain   ; Инструкция вызвавшая фолт не определена в графе.
    (эта часть из руткита).