Сейчас на форуме: jinoweb, bartolomeo, rmn (+5 невидимых) |
eXeL@B —› Программирование —› Перехват прерываний и исключений |
. 1 . 2 . 3 . 4 . 5 . 6 . 7 . >> |
Посл.ответ | Сообщение |
|
Создано: 09 декабря 2013 15:35 · Личное сообщение · #1 Руководствуясь Хоглундом и Батлером на тему перехват прерываний и исключений , написать и запустить драйвер получается но перехват не выходит, пытался перехватить как 0x04 OF так и 0x13 ошибки доступа к памяти, запускал на VB xp 32 с одним процессором, но увы, не опытность даёт знать, вот код на Си который вышел: init.c: Code:
IDT.c Code:
|
|
Создано: 09 декабря 2013 16:15 · Личное сообщение · #2 погугли, кода перехвата ISR в инете валом на первый взгляд не вижу iretd | Сообщение посчитали полезным: MickeyBlueEyes |
|
Создано: 09 декабря 2013 16:25 · Личное сообщение · #3 |
|
Создано: 09 декабря 2013 16:29 · Поправил: ARCHANGEL · Личное сообщение · #4 MickeyBlueEyes Проверьте, правильно ли установился перехват. Например, через RKU посмотрите, каков теперь адрес у перехваченного обработчика. Далее каждый процессор имеет свою idt, вы уверены, что перехватили её на том, на котором исполняете код и ждёте срабатывания? SegFault пишет: на первый взгляд не вижу iretd Code:
----- Stuck to the plan, always think that we would stand up, never ran. | Сообщение посчитали полезным: MickeyBlueEyes |
|
Создано: 09 декабря 2013 16:29 · Поправил: Dr0p · Личное сообщение · #5 MickeyBlueEyes 1. Каждый камень имеет свои таблицы IDT, GDT, TSS, KPCR(софтверная). Посему нужно на всех камнях их изменить. Тут есть множество методов, основные: IDT. o В цикле енум аффинитета(KeQueryActiveProcessors() -> KAFFINITY), установка его для текущего потока(KeSetSystemAffinityThread()). Затем модификация IDT. o Посылка межпроцессорных прерываний(IPI). KeIpiGenericCall etc. Выполняется в синхронной манере, но не универсально(нет экспорта в младших версиях). Это использует ядро для загрузки например msr. o Получение списка IDT. Тут метод тоже несколько, из GDT, из PCR, из массивов HAL или KiAbiosGdt[]. Во всех случаях нужен парсер кода. o Ожидание свича на новый камень. Где то в произвольном коде ожидается переключение потока на новый камень и блокировка переключения(raise irql/cli). Используйте первый метод, так как он прост. 2. т-процессинг: - На стеке IRET-фрейм. Для трапов сохраняется код ошибки. Посему необходимо выделить поле на стеке для приведения к одной структуре. - Сохраняем RGP. - Сохраняем селекторы. - Загружаем ссылку на KPCR(Fs: KGDT_R0_PCR). - Выравниваем стек. Если происходит переключение мода(r3 -> r0), стек загружается из KTSSS.Esp0. Если свича нет(фолт/интеррапт в кернел), то стек используется текущий. А он может быть не выравнен. Что далее может вызвать проблемы. - Заканчиваем список SEH-фреймов: PCR.ExceptionList -> -1, иначе фолт может быть развёрнут вне текущего кода. Также сех не будет обработан если стек не выравнен(r0). Следует использовать структуру KTRAP_FRAME, это системный контекст. Её даже необходимо использовать, так например окончание обработки(Kei386EoiHelper()) потребует эту структуру. Да и нельзя вне её юзать системный функционал. Также нужно сохранить предыдущий вектор. Для #PF бессмысленно юзать дбгпринт, система захлебнётся в лучшем случае, в хучшем будет синь из за оверфлова стека, память отгружаема. | Сообщение посчитали полезным: MickeyBlueEyes |
|
Создано: 09 декабря 2013 17:01 · Личное сообщение · #6 |
|
Создано: 09 декабря 2013 17:04 · Личное сообщение · #7 |
|
Создано: 09 декабря 2013 17:05 · Личное сообщение · #8 |
|
Создано: 09 декабря 2013 17:07 · Личное сообщение · #9 |
|
Создано: 09 декабря 2013 17:14 · Личное сообщение · #10 |
|
Создано: 09 декабря 2013 17:24 · Личное сообщение · #11 |
|
Создано: 09 декабря 2013 17:25 · Поправил: Dr0p · Личное сообщение · #12 |
|
Создано: 09 декабря 2013 19:56 · Личное сообщение · #13 Пока начал ковырять этот же вариант, испробывал перехватывать прерывания от клавиатуры, то тут перехват получается, а с 0x04 нет, с вызовом фций в перехватчике то виснет виртуалка, не БСОД. Короче да вызывать ничего не получится, если только фильтр какойто. Упростил код, вышло щас так так: Code:
Мне нужно обратывать исключения 0x04, наверное есть же специальная ф-ция ? Может кто знает её index в STD , буду признателен, или подскажите пжл отладчик ядра ( Syser loader? или есть ищё что то?). 0x04 должна же обрабатывать такое как если я в UserMode установил в програме определёный участок памяти VirtualProctect - PAGE_NOACCESS , и к нему попытаюься обратится. |
|
Создано: 09 декабря 2013 23:59 · Поправил: Dr0p · Личное сообщение · #14 MickeyBlueEyes > Короче да вызывать ничего не получится Получится после формирования тфрейма. Тогда можно даже размаскировать прерыванья. > Мне нужно обратывать исключения 0x04, наверное есть же специальная ф-ция ? Может кто знает её index в STD Что значит обрабатывать, это ловушка для Into. > подскажите пжл отладчик ядра Виндбг на виртуалке, я например его очень редко использую, обычно хватает сиськи. > VirtualProctect - PAGE_NOACCESS Нет, это не тот вектор. Вам нужен #PF(14-й дескриптор). Лучше задачу огласите, что это вы делаете ? Если вы хотите отслеживать в юзермодной памяти пэйджфолт, то универсальный способ для этого - в юзермоде обработать в VEH. Это и недетект и совместимо с x64, да и ядро трогать не нужно |
|
Создано: 10 декабря 2013 11:58 · Личное сообщение · #15 |
|
Создано: 10 декабря 2013 12:52 · Личное сообщение · #16 |
|
Создано: 10 декабря 2013 13:01 · Личное сообщение · #17 |
|
Создано: 10 декабря 2013 13:11 · Личное сообщение · #18 |
|
Создано: 10 декабря 2013 13:16 · Поправил: MickeyBlueEyes · Личное сообщение · #19 |
|
Создано: 10 декабря 2013 22:56 · Личное сообщение · #20 |
|
Создано: 11 декабря 2013 00:36 · Поправил: Dr0p · Личное сообщение · #21 MickeyBlueEyes И как вы планируете выполнять код в N/A памяти, трассировать и снимать/ставить атрибуты страницы ? Как быть с многопоточностью ? Извращенье полнейшее, не нужно в ядро лезть для сей задачи. Поточная маршрутизация рулит, один экспорт - один фолт. И си у вас ну никак не катит для реализации. df92_11.12.2013_EXELAB.rU.tgz - Reloc.zip | Сообщение посчитали полезным: MickeyBlueEyes |
|
Создано: 11 декабря 2013 10:30 · Личное сообщение · #22 |
|
Создано: 11 декабря 2013 11:03 · Личное сообщение · #23 MickeyBlueEyes пишет: В двух словах, если не сложно ) Если в кратце посмотреть приложенные сорцы, то предлагается сделать в памяти копию модуля в котором находится функция, установить VEH обработчик, поставить N/A на страницу памяти с функцией и при срабатывании сравнивать адрес в VEH. Если совпало - менять адрес EIP на копию, для того чтоб выполнялось дальше без срабатывания N/A. Вообще проще тогда хардварный бряк+VEH сделать. Или если это API-функция, то подменить адрес в таблице импорта на свой обработчик. | Сообщение посчитали полезным: Dr0p |
|
Создано: 11 декабря 2013 11:21 · Личное сообщение · #24 |
|
Создано: 11 декабря 2013 11:22 · Поправил: Dr0p · Личное сообщение · #25 Veliant В целом так, но код избыточен - обычно нет необходимости релоцировать модуль, можно просто как строку в буфер всю секцию кода скопировать(так как нет относительных ветвлений за пределы проекции; IAT в той же секции. Для нтдлл так не желательно, есть очень большая вероятность что код модифицирован относительным ветвлением. Так же user32 и kernel32 не релокабельны, лодер выведет сообщение о фейле). |
|
Создано: 11 декабря 2013 11:30 · Личное сообщение · #26 |
|
Создано: 11 декабря 2013 11:41 · Личное сообщение · #27 Dr0p Железячные точки останова - нестабильность. Хотя бы потому, что их EMET юзает, они уже используются для защиты. Тогда всё таки лучше в этой теме разобраться? Если в кратце посмотреть приложенные сорцы, то предлагается сделать в памяти копию модуля в котором находится функция, установить VEH обработчик, поставить N/A на страницу памяти с функцией и при срабатывании сравнивать адрес в VEH. Если совпало - менять адрес EIP на копию, для того чтоб выполнялось дальше без срабатывания N/A. |
|
Создано: 11 декабря 2013 11:44 · Поправил: Dr0p · Личное сообщение · #28 |
|
Создано: 11 декабря 2013 11:51 · Поправил: Veliant · Личное сообщение · #29 Dr0p пишет: Это просто, быстро Что-то у меня большие сомнения по этому поводу. Архитектурно права доступа ставятся на всю страницу (как правило 4кб) и если в этой странице будут еще какие-нибудь функции для работы с памятью/файлами, которые часто дергаются, то у тебя просядет все же быстродействие из-за постоянных переключений в ядро/обратно и проверки адреса. Хотя признаю, идея передавать управление копии страницы гениальна, и это значительно разгрузит процессор. | Сообщение посчитали полезным: MickeyBlueEyes |
|
Создано: 11 декабря 2013 11:54 · Личное сообщение · #30 |
. 1 . 2 . 3 . 4 . 5 . 6 . 7 . >> |
eXeL@B —› Программирование —› Перехват прерываний и исключений |