|
|
| Посл.отвђт | Сообщен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 Интересно, хотелось бы увидеть код. А вообще, поищи по сайту. Гдк то была подобная утилитка одного заграничного товарища, там всё работало. |
|
Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.047 |