· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.WIN32 —› Обработчик прерываний

. 1 . 2 . >>

Посл.отвђт Сообщенiе


Дата: Ноя 10, 2004 14:59:54 · Поправил: zss

Приветствую всех !

Мне нужно было осуществить перехват системных вызовов.
Испробовал многие методы, но все они имеют недостатки:

1. Изменение таблицы экспортов - не все функции вызываются через таблицу. Более того, изменение необходимо производить до загрузки всех модулей.
2. jmp - работает безотказно, но существуют функции,
размер которых < 5 байт :(
3. Посоветовали использовать прерывания - есть функции
(из RtlXXX) размер которых 1 байт (XP, SP1)

Осталось единственное решение - int1 или int3

4. int3 - довольно часто встречается в ntoskrnl => много
ложных срабатываний. Кроме того SoftIce его юзает

Остается единственное решение - int1 (Хотя SI его тоже
юзает, но с ним проще).
Идея заключалась в следующем
а) менять вектор прерывания
б) ставить 0xF1 в начало функции
в) в обработчике проверять - если (адрес - 1) = адрес
функции ядра, то взводить флаг трассировки, cli. Если нет,
то отдавать управление оригинальному обработчику. Запоминать адрес, восстанавливать байт и iret
г) после iret из стека извлекаются флаги - начинается
трассировка. При первой же инструкции произойдет вызов
обработчика int1 (гаратнировано, т.к. cli). Читается адрес, пишется 0xF1, и iret

Надеюсь идея понятная - проблемма:
1. Ловится все нормально, но при снятии обработчика - слетает - BSOD даже не выскакивает (подозрение на разрушенный стек). Стек подчищается нормально, регистры восстанавливаются и т.д. Что может быть ?
2. С cli это все не будет работать на многопроцессорной системе, а использовать в обработчике функций ядра нельзя (т.к. может возникнуть ситуация, что прийдется ловить все NativeAPI => ловить самого себя)

З.Ы. А может быть это вообще все бессмысленно :))) Ведь обработчик легко снять, или обойти его

Что можете посоветовать ?

спасибо


Дата: Ноя 11, 2004 19:05:58 · Поправил: nobody

Если необходима работа на многопроцессорных системах то можно использовать KeRaiseIRQL - она экспортируется из HAL а не из ntoskrnl
если тебе хочется и её перехватить - пиши прямо в параметры процессора


Дата: Ноя 11, 2004 19:45:38 · Поправил: zss

Ну до HAL пока дело не дошло :)
>>пиши прямо в параметры процессора
А что этим можно добиться и как это ?

Проблемма немного в другом:
1. Во-первых не на все функции удается поставить 0xF1 - некоторые слетают с DSOD = 7F. Некоторые функции ядра вызываются на IRQL > PASSIVE_LEVEL - может ли это быть из-за этого (или просто надо лучще продумать обработчик)
2. Некоторые функции ловятся по отдельности, но вместе слетают - тут я вообще не пойму в чем дело

В общем проблемм много. Я спрашиваю только о тех, с которыми столкнулся. Очевидно есть и еще какие-нибудь. Если кто этим занимался - просьба подсказать, чтоб не терять кучу времени :)


Дата: Ноя 12, 2004 08:35:32

напиши драйвер, йо мае. и перехватывай прерывания. а еще запрети такую фичу как SYSCALL SYSRET через CR4. потому что ХР их юзает вместо int 2fhю ессно придется самому эмулировать. а что ты будешь делать с перехваченым сискаллом - твое дело. можешь в пайп писать например.


Дата: Ноя 12, 2004 09:43:19

>>напиши драйвер, йо мае. и перехватывай прерывания

Так это и есть драйвер :)

>>а еще запрети такую фичу как SYSCALL SYSRET через CR4

а чем это чревато, если не запрещать ?


Дата: Ноя 12, 2004 10:09:49

а тем что все сискаллы пойдут неперехвачеными
если это ХР конечно. в 2к такого безобразия нету


Дата: Ноя 12, 2004 10:17:43

хм... не совсем понял - какая разница как будет вызвана функция - код то у нее один и тот же. А на этот код я и вешаю int1 - как же они миммо пройдут ?


Дата: Ноя 12, 2004 11:10:15

аааа. я не так тебя понял. в теме то прерывания, и я решил что перхват надо вести при переходе в ядро.
попробуй перехватывать все таки int3 а чтоб софтайс не потер защити от него обработчик с помощью dr? и установи прерывание на обращение к отадочным регистрам.


Дата: Ноя 12, 2004 15:10:58

с int1 удобнее - т.к. я в обработчике и ловлю и меняю байты опять (используя трассировку)

просто другого способа пока не нашел :)


Дата: Ноя 12, 2004 15:11:58 · Поправил: zss

возможно, что проблеммы возникают и из-за SoftIce, но иначе никак не отладить :)


Дата: Ноя 12, 2004 15:13:10

syscall\sysenter можно перехватить через MSR - регистры


Дата: Ноя 12, 2004 15:21:42

„>>пиши прямо в параметры процессора
А что этим можно добиться и как это ?


NT хранит информацию о состоянии процессоров во внутренних
стуктурах
Посмотри на KeRaiseIRQL\KeGetCurrentIRQL в дизассемблере
Их можно изменить и ручками - с тем же эффектом


Дата: Ноя 12, 2004 16:22:58

это мне конечно понадобиться, но потом... :)

а сейчас, как то отклонились от темы :)


Дата: Ноя 15, 2004 09:15:33

меня пока больше интерисуют последствия int1 на IRQL > PASSIVE_LEVEL, или причины ошибок в другом ?


Дата: Ноя 15, 2004 13:53:57

zss

Интересно, хотелось бы увидеть код. А вообще, поищи по сайту. Гдк то была подобная утилитка одного заграничного товарища, там всё работало.

. 1 . 2 . >>


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.047