Русский / Russian English / Английский

Сейчас на форуме:
 · Начало · Статистика · Регистрация · Поиск · ПРАВИЛА ФОРУМА · Язык · RSS ·

 eXeL@B —› Основной форум —› Обработчик прерываний
Посл.ответ Сообщение

Ранг: 0.0 (гость)
Статус: Участник

Создано: 30 ноября 2004 00:52 New!
Цитата · Личное сообщение · #1

Доброго всем дня

Стоит задача написания собственного обработчика прерываний int1. Проблемма в том, что работает не всегда. Не могу отловить свой баг. Под SI естественно проверить не удается, т.к. он тоже юзает int1 и int3.

Идея проста: в обработчике проверяется адрес возврата - 1. Если это мой адрес, то я обрабатываю прерывание, возвращаю оригинальный байт, в стеке выставляю флаг трассировки и cli. Когда произойдет выход из обработчика, из стека восстановится регистр флагов и начнется трассировка. После первой же инструкции произойдет опять вызов обработчика. В нем я проверяю - если флаг взведен - значит это мое второе прерывание. Я опять ставлю int11.

Если же не удовлетворяет ни одному условию, то я возвращаю управление оригинальному обработчику (если он есть) либо просто iretd.

Схематично:
1. Ставится свой обработчик (изменяется IDT). Старый обработчик сохраняется.
2. Если произошло прерывание, то

Это обработчик int1

StartAddress и CurrAddress - глобальные dd
ModuleImage - глобальная структура
OldHandler - старый обработчик

[code]
pop [CurrAddress]
pushad

cmp dword ptr [StartAddress], 0
jz _nonflag

// флаг взведен

mov ebx, cr0
push ebx
and ebx, ~0x10000
mov cr0, ebx

mov esi, [StartAddress]
mov al, 0xF1
mov byte ptr [esi], al

pop ebx
mov cr0, ebx

mov dword ptr [StartAddress], 0
popad
push [CurrAddress]
and dword ptr [esp + 8], 0xFFFFFEFF // TF
or dword ptr [esp + 8], 0x00000200 // cli
iretd

_nonflag:

mov esi, [CurrAddress]
dec esi
push esi
lea eax, [ModuleImage]
push eax
call IsFunc
test al, al
je _error

// начало функции

mov [StartAddress], esi
mov ebx, cr0
push ebx
and ebx, ~0x10000
mov cr0, ebx

mov byte ptr [esi], al
pop ebx
mov cr0, ebx

push [StartAddress]
call WriteHookData

popad
push [StartAddress]
or dword ptr [esp + 8], 0x00000100 // TF
and dword ptr [esp + 8], 0xFFFFFDFF //cli
iretd

_error:

mov eax, [OldHandler]
test eax, eax
je _nonhandler

popad
push [CurrAddress]
jmp [OldHandler]

_nonhandler:
// нет обработчика
popad
push [CurrAddress]
iretd
[/code]

Вопрос: где подводные камни Может есть еще способы ?
 eXeL@B —› Основной форум —› Обработчик прерываний

Видеокурс ВЗЛОМ