![]() |
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 ![]() ![]() ----- 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 лучше всё же сменить ![]() ----- 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 Ну, тут, собственно, всё ясно, буду читать матчасть, просвещаться, но в этом мне уже никто не поможет (разве что кто-то будет мне картинки в голову проецировать для лучшего усвоения ![]() ![]() ![]() ![]() ----- 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 в ядре (конечно же, где ж ещё ![]() 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 трассировщик и методы реализации |