Сейчас на форуме: ==DJ==[ZLO], Magister Yoda, Rio, Dart Raiden, Alf (+4 невидимых) |
eXeL@B —› Основной форум —› Обработчик прерываний |
Посл.ответ | Сообщение |
|
Создано: 30 ноября 2004 00:52 · Личное сообщение · #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 —› Основной форум —› Обработчик прерываний |