То,что я пытаюсь сделать,примерно описано в этом топике(посты от tylerdurden): http://www.wasm.ru/forum/viewtopic.php?id=22627 А именно: * успешно перехвачен обработчик #NP прерывания(номер 11) * заранее считаны обработчики #DB и #BP прерываний * в дескрипторах прерываний #DB и #BP сброшен флаг P Вот код моего перехватчика #NP прерывания: Код (Text): _NP_IntHandler_Detour: pushad pushfd push fs push ds push es mov eax, 30h mov fs, ax mov eax, 23h mov ds, ax mov es, ax mov eax, [esp+30h] ; // Достаём из стека ErrorCode // test eax, 02 ; // Установлен ли IDT бит?? // jz _not_IDT shr eax, 03 ; // Сдвиг вправо, чтобы выделить индекс IDT-дескриптора // cmp eax, 01 jz _handle_int1 cmp eax, 03 jz _handle_int3 _handle_int1: pop es pop ds pop fs popfd popad add esp, 04 ; // Выталкиваем из стека ErrorCode // jmp g_pInt1Handler _handle_int3: pop es pop ds pop fs popfd popad add esp, 04 ; // Выталкиваем из стека ErrorCode // jmp g_pInt3Handler ; /* Данное нарушение произошло не по причине сброшенного P бита IDT-дескриптора */ _not_IDT: pop es pop ds pop fs popfd popad jmp g_pOld_NP_IntHandler ...всё это дело я пока испытываю на SoftIce.Так вот с обработкой первого прерывания всё в порядке.Отладчик трассирует код как ни в чём не бывало.Но вот с третьим прерыванием возникает какая-то странность.Стоит мне только произвести вышеперечисленные действия,как тут же выскакивает окно отладчика.EIP указывает на функцию @ObfDereferenceObject и пишется,что "Break due embedded INT3 instruction"...И так словно бы в цикле: выходишь из отладчика,а он снова тут же всплывает на той же инструкции.Никаких точек останова при этом не стоит.Команда bc * не помогает. Причём если чуть ниже поставить брейкпоинт,то он нормально обработается, т.е. мой перехватчик по идее работает корректно...или...?? В общем,хотелось бы понять,что же не так...
Хм...что-то я застрял с этой проблемой... Начал было грешить на Resume flag,но после проверки его состояния в теле моего перехватчика оказалось,что он установлен.Проверялся тот образ EFLAGS,который кладётся в стек в месте с ErrorCode, EIP и CS. Теперь я не знаю,за что можно зацепиться.В то же время странно,что обработка прерывания #DB идёт без проблем. ADD. Вот такая также странность: когда отладчик в n-нный раз всплыл на первой команде вышеупомянутой функции,то если мы поставим обычный брейкпоинт на следующую же команду,которая следует за первой,то отладчик всплывёт не на поставленном нами брейкпоинте,а опять на первой команде функции.Словно бы RF бит не устанавливался в единицу,чтобы обойти команду,вызвавшую #BP прерывание.
В интелловских манах читал про отладочные регистры и как в них адреса ляпать ? Если адрес инструкции выровнен по кратности 2 то бряк будет именно на нём, если нет, то бряк будет на следующей инструкции, размер которой таков, что вписывается в кратность 2. Там ваще замут какой то, но смысл вроде в этом. По крайней мере просто в айсе поэкспериментируй.
Хрень какая-то... Я теперь пробую даже так,что сбрасываю P бит только третьего прерывания и в обработчике прерывания #NP просто выталкиваю из стека ErrorCode и сразу прыгаю в обработчик третьего прерывания.И всё равно отладчик постоянно всплывает из-за какой-то непонятной точки останова. В мануале Интела была описана примерно похожая ситуация,когда #BP прерывание совпадает с другим Fault-type исключением(типа нашего "not present"): ...предлагается выставлять в обработчике fault-type исключения бит RF в единицу.Ну,дык он уже установлен...если имеется тот EFLAGS,что передаётся через стек обработчику. Неужели никто не может предложить какого-то решения данной проблемы??