| eXeL@B —› Программирование —› ring0 трассировщик и методы реализации |
| . 1 . 2 . >> |
| Посл.ответ | Сообщение |
|
|
Создано: 23 марта 2009 15:07 · Личное сообщение · #1 Вопрос состогит в следующем: нужно выполнить отладку кода, которыйвыполняется в третьем кольце. Но делать это не стандартными Debug API-функциями, а реализовать драйвер, чтоб задействовать всякие левые, например, зарезервированные, прерывания или редкоиспользуемые, например, всякие int 2Dh и другие (это упоминается как пример - не обязательно его). Так вот, чисто в теории, чтоб отлаживать приложение с помощью таких прерываний, нужно расположить в коде жертвы опкоды этих самых прерываний, далее изменить DPL этого прерывания на троечку, чтоб не генерировался эксепшн, далее выполнить перехват этого прерывания на свой обработчик в дровине, и, когда происходит это прерывание, выполнять нужные действия: дамп, правку жертвы в памяти, или же просто лог вести. Но вот в чём проблема - можно ли это делать с зарезервированными прерываниями? Если можно, то после перехвата и обработки данных моим фильтром куда передавать управление? И если мой олбработчик срабатывает, то в контексте какого процесса: процесса-жертвы или System? ----- Stuck to the plan, always think that we would stand up, never ran. ![]() |
|
|
Создано: 23 марта 2009 15:45 · Личное сообщение · #2 вот такая таблетка поможет. Есть еще второй метод , ну очень интересный , но я его что то найти не могу. Найду скину. 9aa2_23.03.2009_CRACKLAB.rU.tgz - tracer.zip
----- RE In Progress [!] Coding Hazard [!] Stay Clear of this Cube ![]() |
|
|
Создано: 23 марта 2009 18:55 · Личное сообщение · #3 |
|
|
Создано: 23 марта 2009 23:26 · Личное сообщение · #4 Я что-то не понял: винда будет ругаться, и чем же это мои перехватчики хуже темиды? Ей можно, а мне нельзя?:-D И что значит не менять DPL? Тогда мой чудесный обработчик в нулевом кольце просто не получит управления, или получит? Я не пойму, исключение генерируется после прерывания, и перехватчик не выполнится, если прерывание вызвано Из пользовательского кода, или он выполнится в любом случае? ----- Stuck to the plan, always think that we would stand up, never ran. ![]() |
|
|
Создано: 23 марта 2009 23:55 · Поправил: Clerk · Личное сообщение · #5 > Так вот, чисто в теории, чтоб отлаживать приложение с помощью таких прерываний, нужно расположить в коде жертвы опкоды этих самых прерываний Лучше исключения юзать. > И если мой олбработчик срабатывает, то в контексте какого процесса: процесса-жертвы или System? Текущий процесс определяется 6-м дескриптором в GDT(более точно в PCR указатели на EPROCESS и пр.), который адресует PCR, его селектор загружается в Fs при смене кольца защиты на нулевое. Никакие инструкции не приведут к его смене, тоесть переключение на другой процесс произойти не может. Исключения и прерывания обрабатываются в контексте процесса, в котором они произошли. ![]() |
|
|
Создано: 24 марта 2009 00:16 · Личное сообщение · #6 |
|
|
Создано: 24 марта 2009 00:22 · Личное сообщение · #7 |
|
|
Создано: 24 марта 2009 00:54 · Личное сообщение · #8 |
|
|
Создано: 24 марта 2009 01:15 · Личное сообщение · #9 |
|
|
Создано: 24 марта 2009 02:50 · Личное сообщение · #10 |
|
|
Создано: 24 марта 2009 03:06 · Личное сообщение · #11 |
|
|
Создано: 24 марта 2009 07:43 · Личное сообщение · #12 |
|
|
Создано: 24 марта 2009 12:37 · Личное сообщение · #13 |
|
|
Создано: 24 марта 2009 19:20 · Личное сообщение · #14 Я имею в виду, что не винда будет ругаться, а что разработчики винды не добряют таких хуков вообще, поэтому 1 хрен, какой именно хукать, все не очень хорошо и не документированно. А в х64 с этим дополнительные сложности есть. И помимо патчгарда. ДПЛ можно и не менять, просто тогда вызовется 13 прерывание, вроде, которое за нарушение защиты отвечает, а не конкретно вызванное тобой, но при нужных хуках это 1 хрен. ![]() |
|
|
Создано: 24 марта 2009 19:46 · Поправил: Clerk · Личное сообщение · #15 |
|
|
Создано: 24 марта 2009 19:54 · Личное сообщение · #16 Ну, значит dpl лучше всё же сменить , теперь идём дальше. Пока положим на х64 большой и длинный, как и на многопроцессорные машины, как и на всякие отладочные функции как уровня пользователя, так и ядра, и сосредоточимся на перехвате прерываний. Вот какой вопрос у меня назрел: как бы при перехвате этих самых чудесных прерываний узнать, по какому адресу в пользовательском коде оно расположено?
----- Stuck to the plan, always think that we would stand up, never ran. ![]() |
|
|
Создано: 24 марта 2009 19:59 · Личное сообщение · #17 |
|
|
Создано: 24 марта 2009 20:05 · Личное сообщение · #18 |
|
|
Создано: 24 марта 2009 22:17 · Личное сообщение · #19 |
|
|
Создано: 25 марта 2009 12:35 · Личное сообщение · #20 Ну, тут, собственно, всё ясно, буду читать матчасть, просвещаться, но в этом мне уже никто не поможет (разве что кто-то будет мне картинки в голову проецировать для лучшего усвоения , если кто умеет - пишите в личку :s5 , единственное - может, кто знает, где их можно скачать, эти мануалы интеловские, а то гуглю инахожу их по кускам , что не очень удобно. Тему пока закрывать не буду - может, ещё кто-нибудь что-то посоветует...
----- Stuck to the plan, always think that we would stand up, never ran. ![]() |
|
|
Создано: 25 марта 2009 12:46 · Личное сообщение · #21 |
|
|
Создано: 25 марта 2009 12:52 · Личное сообщение · #22 |
|
|
Создано: 25 марта 2009 13:25 · Личное сообщение · #23 |
|
|
Создано: 26 марта 2009 05:49 · Личное сообщение · #24 |
|
|
Создано: 27 марта 2009 13:33 · Поправил: ARCHANGEL · Личное сообщение · #25 Собственно, с прочтением некоторой инфы ситуация стала проясняться. Например, чисто в теории, предположим, что я взял и натыкал в исследуемую софтину опкодов int 3 (0ССh), т.к. в юзермоде я никак не обрабатываю исключения, возникающие при попытке жертвы выполнить эту инструкцию, то со 100% вероятностью софтина такая попросту будет валиться, но когда я устанавливаю свою дровину, которая перехватывает исключение #BP, для чего на практике мне придётся установить свойобработчик прерывания int 3h в ядре (конечно же, где ж ещё ), то мойобработчик будет срабатывать, когда юзермодный код попытается выполнить int 3, регистр CR3 укажет на таблицу страниц процесса-жертвы, сегментный регистр fs переключится и будет содержать по смещению 24h указатель, который по смещению 44h будет содержать EPROCESS процесса-жертвы, а в стеке будет содержаться EFLAGS, CS:EIP, а код ошибки для данного исключения будет отсутствовать, тогда как значение CS:EIP будет указывать на следующую за int 3 ячейку памяти жертвы. Чтоб обработать эту радость, я должен:
1. Используя указатель на структуру EPROCESS, определить, тот ли это процесс, т.е. это ли процесс-жертва. 2. Используя трюк с CR0, отключить зашиту от записи в пользовательский код. 3. Переписать опкод int 3 на тот опкод, который там был первоначально. 4. Декрементировать СS:EIP. 5. Включить защиту от записи, т.е. вернуть прежнее значение регистру CR0. 6. Выйти из обработчика перываний. 7. Если исключение возникло не в жертве, то передать управление на оригинальный обработчик. Всё ли верно? ----- Stuck to the plan, always think that we would stand up, never ran. ![]() |
|
|
Создано: 27 марта 2009 18:46 · Поправил: Archer · Личное сообщение · #26 |
|
|
Создано: 28 марта 2009 00:30 · Личное сообщение · #27 Ой, там не 24, а 124 должно быть, ошибочка вышла, а второй пункт - это про синхронизацию? Ну, тогда это вообще другая история, но мне кажется, что тут как раз вопрос синхронизации не особо сложен, мне тут реально нужно только InterlockedExchange использовать, а с хранением оригинальных опкодов вообще проблем никаких-их можно в пуле невыгружаемой памяти хранить, как и код своего обработчика, чтоб не было голубых экранов. Но подумать тут есть над чем: например, всё же непонятно, нужно ли менять DPL? ----- Stuck to the plan, always think that we would stand up, never ran. ![]() |
|
|
Создано: 28 марта 2009 07:03 · Поправил: Clerk · Личное сообщение · #28 ARCHANGEL И как ты собираешся трассировать код с помощью жёстких точек останова в коде ? Как ты узнаешь куда инструкция передаёт управление ? Как обойти самопроверки целостности кода ? Archer > том иркле, что есть в обработчике, вызывать ты сможешь очень мало функций. Что мешает повысить его с PASSIVE_LEVEL на более высокий ? ![]() |
|
|
Создано: 28 марта 2009 09:28 · Личное сообщение · #29 Повысить иркл ничто не мешает, только он при входе и так уже FF, куда уж выше. По крайней мере, если верить виндбг. Лично я просто функций не вызываю, поэтому такой проблемы нет, посему не стал разбираться, какой же там реально иркл. Второй пункт да, про синхронизацию. История, может, и другая, но иметь в виду надо, чтоб без записи в глобальные переменные обойтись. Ну и стоить иметь в виду многоядерные/многопроцессорные тачки, тут код поменяется мало. И про х64-а тут вообще работать не будет. Просто лично я не вижу особого смысла писать софт под медленно, но верно подыхающую платформу. А ты как хочешь. ![]() |
|
|
Создано: 28 марта 2009 09:53 · Личное сообщение · #30 |
| . 1 . 2 . >> |
| eXeL@B —› Программирование —› ring0 трассировщик и методы реализации |




вот такая таблетка поможет. Есть еще второй метод , ну очень интересный , но я его что то найти не могу. Найду скину.



)..
, если кто умеет - пишите в личку
, что не очень удобно. Тему пока закрывать не буду - может, ещё кто-нибудь что-то посоветует...
Для печати