Странное поведение при перехвате третьего прерывания

Тема в разделе "WASM.NT.KERNEL", создана пользователем DillerInc, 10 окт 2007.

  1. DillerInc

    DillerInc New Member

    Публикаций:
    0
    Регистрация:
    20 авг 2006
    Сообщения:
    41
    То,что я пытаюсь сделать,примерно описано в этом топике(посты от tylerdurden):
    http://www.wasm.ru/forum/viewtopic.php?id=22627

    А именно:
    * успешно перехвачен обработчик #NP прерывания(номер 11)
    * заранее считаны обработчики #DB и #BP прерываний
    * в дескрипторах прерываний #DB и #BP сброшен флаг P

    Вот код моего перехватчика #NP прерывания:
    Код (Text):
    1. _NP_IntHandler_Detour:
    2.      
    3.       pushad
    4.       pushfd
    5.       push   fs
    6.       push   ds
    7.       push   es
    8.       mov    eax, 30h
    9.       mov    fs, ax
    10.       mov    eax, 23h
    11.       mov    ds, ax
    12.       mov    es, ax
    13.  
    14.       mov    eax, [esp+30h]        ; // Достаём из стека ErrorCode //
    15.       test   eax, 02               ; // Установлен ли IDT бит?? //
    16.       jz     _not_IDT
    17.  
    18.       shr    eax, 03               ; // Сдвиг вправо, чтобы выделить индекс IDT-дескриптора //
    19.  
    20.       cmp    eax, 01
    21.       jz     _handle_int1
    22.  
    23.       cmp    eax, 03
    24.       jz     _handle_int3
    25.  
    26. _handle_int1:
    27.  
    28.       pop    es
    29.       pop    ds
    30.       pop    fs
    31.       popfd
    32.       popad
    33.  
    34.       add    esp, 04               ; // Выталкиваем из стека ErrorCode //
    35.  
    36.       jmp    g_pInt1Handler
    37.  
    38. _handle_int3:
    39.      
    40.       pop    es
    41.       pop    ds
    42.       pop    fs
    43.       popfd
    44.       popad
    45.  
    46.       add    esp, 04               ; // Выталкиваем из стека ErrorCode //
    47.  
    48.       jmp    g_pInt3Handler
    49.  
    50. ; /* Данное нарушение произошло не по причине сброшенного P бита IDT-дескриптора */
    51. _not_IDT:
    52.       pop    es
    53.       pop    ds
    54.       pop    fs
    55.       popfd
    56.       popad
    57.  
    58.       jmp    g_pOld_NP_IntHandler
    ...всё это дело я пока испытываю на SoftIce.Так вот с обработкой первого прерывания всё в порядке.Отладчик трассирует код как ни в чём не бывало.Но вот с третьим прерыванием возникает какая-то странность.Стоит мне только произвести вышеперечисленные действия,как тут же выскакивает окно отладчика.EIP указывает на функцию @ObfDereferenceObject и пишется,что "Break due embedded INT3 instruction"...И так словно бы в цикле: выходишь из отладчика,а он снова тут же всплывает на той же инструкции.Никаких точек останова при этом не стоит.Команда bc * не помогает.
    Причём если чуть ниже поставить брейкпоинт,то он нормально обработается, т.е. мой перехватчик по идее работает корректно...или...??

    В общем,хотелось бы понять,что же не так...
     
  2. k3internal

    k3internal New Member

    Публикаций:
    0
    Регистрация:
    11 янв 2007
    Сообщения:
    607
    Ты бы код полностью выложил
     
  3. k3internal

    k3internal New Member

    Публикаций:
    0
    Регистрация:
    11 янв 2007
    Сообщения:
    607
    Это тот самый что в аттаче по сцылке ?
     
  4. DillerInc

    DillerInc New Member

    Публикаций:
    0
    Регистрация:
    20 авг 2006
    Сообщения:
    41
    ...не совсем.
    Вот прикрепляю только драйвер(старая программка лоадер тут уже не подойдёт).
     
  5. DillerInc

    DillerInc New Member

    Публикаций:
    0
    Регистрация:
    20 авг 2006
    Сообщения:
    41
    Хм...что-то я застрял с этой проблемой...
    Начал было грешить на Resume flag,но после проверки его состояния в теле моего перехватчика оказалось,что он установлен.Проверялся тот образ EFLAGS,который кладётся в стек в месте с ErrorCode, EIP и CS.

    Теперь я не знаю,за что можно зацепиться.В то же время странно,что обработка прерывания #DB идёт без проблем.

    ADD.

    Вот такая также странность: когда отладчик в n-нный раз всплыл на первой команде вышеупомянутой функции,то если мы поставим обычный брейкпоинт на следующую же команду,которая следует за первой,то отладчик всплывёт не на поставленном нами брейкпоинте,а опять на первой команде функции.Словно бы RF бит не устанавливался в единицу,чтобы обойти команду,вызвавшую #BP прерывание.
     
  6. k3internal

    k3internal New Member

    Публикаций:
    0
    Регистрация:
    11 янв 2007
    Сообщения:
    607
    В интелловских манах читал про отладочные регистры и как в них адреса ляпать ? Если адрес инструкции выровнен по кратности 2 то бряк будет именно на нём, если нет, то бряк будет на следующей инструкции, размер которой таков, что вписывается в кратность 2.
    Там ваще замут какой то, но смысл вроде в этом. По крайней мере просто в айсе поэкспериментируй.
     
  7. DillerInc

    DillerInc New Member

    Публикаций:
    0
    Регистрация:
    20 авг 2006
    Сообщения:
    41
    Хрень какая-то...
    Я теперь пробую даже так,что сбрасываю P бит только третьего прерывания и в обработчике прерывания #NP просто выталкиваю из стека ErrorCode и сразу прыгаю в обработчик третьего прерывания.И всё равно отладчик постоянно всплывает из-за какой-то непонятной точки останова.

    В мануале Интела была описана примерно похожая ситуация,когда #BP прерывание совпадает с другим Fault-type исключением(типа нашего "not present"):
    ...предлагается выставлять в обработчике fault-type исключения бит RF в единицу.Ну,дык он уже установлен...если имеется тот EFLAGS,что передаётся через стек обработчику.

    Неужели никто не может предложить какого-то решения данной проблемы??
     
  8. DillerInc

    DillerInc New Member

    Публикаций:
    0
    Регистрация:
    20 авг 2006
    Сообщения:
    41
  9. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    хе. действительно, а я и забыл про это различие.