Сейчас на форуме: tyns777 (+4 невидимых) |
eXeL@B —› Программирование —› Возврат в KiUserExceptionDispatcher из ISR |
Посл.ответ | Сообщение |
|
Создано: 03 августа 2010 14:19 · Личное сообщение · #1 Привет всем добрым людям, вопрос следующего характера: недавно дебажил какой-то Хасповский драйвер, перехватывающий _KiTrap06. Для тех, кто не повторял такие подвиги, скажу, что периодически приложение, защищённое хаспом (правда, справедливо для старых версий) генерит исключение Invalid Opcode, которое перехватывается хасповским дровом, далее идёт работа с ключом (но нам сейчас это неинтересно), а потом происходит возврат из исключения банально через IRET. НО! При таком раскладе исключение не разворачивается в юзермоде. Т.е. для NT-систем не происходит передачи управления на KiUserExceptionDispatcher. Скажите, люди добрые, как можно обработать исключение (или прерывание, думаю, тут не принципиально) так, чтоб возврат в вышеупомянутую юзермодную функцию всё-таки осуществился? ----- Stuck to the plan, always think that we would stand up, never ran. |
|
Создано: 03 августа 2010 14:28 · Личное сообщение · #2 |
|
Создано: 03 августа 2010 14:41 · Личное сообщение · #3 А как же его ловить, если он, собственно, и не вызывается? Может, его надо как-то вызывать? Сейчас вписал в гугль "KiDispatchException" и получил всё, кроме того, что нужно (( Тут, по-хорошему, прототипчик бы помог и IRQL, на котором это вызывается, или какая-то ссылочка толковая... ----- Stuck to the plan, always think that we would stand up, never ran. |
|
Создано: 03 августа 2010 14:46 · Личное сообщение · #4 |
|
Создано: 03 августа 2010 14:55 · Личное сообщение · #5 |
|
Создано: 03 августа 2010 15:00 · Личное сообщение · #6 |
|
Создано: 03 августа 2010 15:03 · Личное сообщение · #7 |
|
Создано: 03 августа 2010 16:16 · Личное сообщение · #8 Code:
|
|
Создано: 03 августа 2010 16:38 · Поправил: V0ldemAr · Личное сообщение · #9 Вызов KeUserExceptionDispatcher будет тогда если исключение небыло обработано в кернел моде вы же сами сказали что хасп драйвер хучит int6 и возвращается через IRET из этого логично предположить что KiDispatchException небудет вызвано. Как вариант вызовите свое int6 исключение и отследите как хасп это обработает должен впринцыпе передать управление ISR в ntoskrnl. (только не ставте бряк на первую инструкцию так как отладчик свалится) Archer пишет: И как на это смотрит х64 с патчгардом и подписью дров. Неработает т.е. непотдерживается... большинство старых донгл защит только x86 |
|
Создано: 03 августа 2010 18:04 · Личное сообщение · #10 |
|
Создано: 03 августа 2010 22:18 · Личное сообщение · #11 |
|
Создано: 03 августа 2010 22:53 · Поправил: Clerk · Личное сообщение · #12 mak Там внесистемный трап процессинг, за который автору руки отсечь. Конечно можно поступить как предложил Грейт(использовать KINTERRUPT), вот только это не решит проблему - ENTER_INTERRUPT макро инициирует цепочку сех, изза этого исключения возникающий в этом хэндлере не будут обрабатываться сех, так как цепочка сех предыдущего ISR завершена. Необходимо сформировать код формирующий трап фрейм, после чего могут быть размаскированы прерывания и использоваться сех и подкачиваемая память. А код этот различен в версиях, хотя не проблема некоторые необходимые смещения найти вручную. Тут Code:
|
|
Создано: 04 августа 2010 16:27 · Личное сообщение · #13 он достаточно старый сам по себе, писался давно, как бы не было думаю поможет Архангелу внести немного ясности в вопрос, тем более непострадественно с хаспом работают, тему по перехвату 6 инта как то тут заводил Hook & Revers int 6 , но задача была специфична, да и тема далеко не пошла. Поэтому мне кажется если сам не разберешься то дело туго ... а подсмотреть было бы классно Интересно , нужно глянуть твой код =) ПС. Не знаю куда ты ложишь свои работы на народ или виртех, но на народе нет такой расфасовки классной как на вир техе) в плане удобства. ----- RE In Progress [!] Coding Hazard [!] Stay Clear of this Cube |
|
Создано: 04 августа 2010 17:03 · Поправил: Clerk · Личное сообщение · #14 mak Так всё просто, даже если ISR свои ставить. Исключение разворачивается системой как и сказали выше в KiDispatchException(). Но она не экспортируется, а при трап-процессинге ядро использует стабы для неё, это CommonDispatchExceptionXX(). Они также не экспортируются, но поиск их очень прост: Code:
trap.asm, модель вызова не меняется в версиях. В кодосекции ядра ищется код [CommonDispatchException0Args % CommonDispatchException] используя маску для процедурных ветвлений. Отсюда можно найти KiDispatchException(), хотя стабов достаточно. - Второй способ доставить фолт в лузермод - непосредственно переход по нужному вектору в IDT. Очищается текущий ядерный стек(пользовательский переключается на него из TSS.Esp0, он уже переключен в ISR) и формируется на его дне IRET-фрейм, после чего выполняется переход по нужному вектору в IDT(например на KiTrap0E для #PF), просто извлекая адрес для перехода из соответствующего дескриптора. - Только вот как и говорил вся проблема в формировании трап-фрейма. |
eXeL@B —› Программирование —› Возврат в KiUserExceptionDispatcher из ISR |