![]() |
eXeL@B —› Программирование —› Interrupt Descriptor Table - формат, перехват, изменение dpl |
. 1 . 2 . >> |
Посл.ответ | Сообщение |
|
Создано: 08 января 2009 22:15 · Поправил: ARCHANGEL · Личное сообщение · #1 Всем hello, вопрос такой - пишу драйверок для модификации IDT. Драйверок на асме, а документацию нашёл только с примерами на С++ (любимый и ненаглядный язык, как он мне дорог:s1 ![]() Code:
Можно ли это лицезреть на асме? И на асме примеры с перехватом и модификацией dpl. Added В общем, ситуация не много изменилась. Теперь вопрос в обходе антиотладочного трюка, основанного на Int 2D, под олькой. ----- Stuck to the plan, always think that we would stand up, never ran. ![]() |
|
Создано: 08 января 2009 22:27 · Поправил: SLV · Личное сообщение · #2 |
|
Создано: 08 января 2009 22:30 · Личное сообщение · #3 |
|
Создано: 08 января 2009 22:30 · Личное сообщение · #4 |
|
Создано: 08 января 2009 22:54 · Личное сообщение · #5 Возник следующий вопрос по сабжу - если изменить бит присутствия для какого-либо прерывания, то при вызове его из ринг-3 будет ли возникать исключение, которое бы возможно было бы обработать через SEH? И не вызовет ли это бсод в случае вызова этого прерывания из ядра? ----- Stuck to the plan, always think that we would stand up, never ran. ![]() |
|
Создано: 08 января 2009 23:17 · Личное сообщение · #6 половино кода на асме , остальное легко перевести. А вообще как раз для тебя! Половино си половино асм. Постепенно будешь привыкать ![]() ![]() ----- RE In Progress [!] Coding Hazard [!] Stay Clear of this Cube ![]() |
|
Создано: 08 января 2009 23:25 · Личное сообщение · #7 Или вот так =) , мож поможет, но по первому примеру лучше. Он не бсодит) Code:
----- RE In Progress [!] Coding Hazard [!] Stay Clear of this Cube ![]() |
|
Создано: 08 января 2009 23:26 · Личное сообщение · #8 |
|
Создано: 08 января 2009 23:33 · Личное сообщение · #9 Code:
=) не могу найти мои записи по идт , но это вроде структура, и хранится она в interrupt.h , можешь сам поискать ----- RE In Progress [!] Coding Hazard [!] Stay Clear of this Cube ![]() |
|
Создано: 08 января 2009 23:41 · Личное сообщение · #10 |
|
Создано: 08 января 2009 23:56 · Личное сообщение · #11 |
|
Создано: 09 января 2009 11:44 · Личное сообщение · #12 Сейчас изменил dpl и бит присутствия для прерывания int 2Dh ![]() ----- Stuck to the plan, always think that we would stand up, never ran. ![]() |
|
Создано: 09 января 2009 14:23 · Поправил: Clerk · Личное сообщение · #13 ARCHANGEL Я так понял что конечная цель обработка в юзермоде. Кроме исключения ничего не будет. С такимже успехом можно заюзоть любое из прерываний, для которого DPL = 0, а не юзоть именно KiDebugService. Если нужно сгенерировать STATUS_ACCESS_VIOLATION(ядро разворачивает именно это исключение, если сегмент не присутствует), то можно заюзоть NtRaiseException, либо какуюнибудь инструкцию которая вызовет подобное исключение. Если не секрет, как это связано с антиотладкой ? ![]() |
|
Создано: 09 января 2009 14:28 · Поправил: Clerk · Личное сообщение · #14 Да и есчо, вероятно если блокировать какимлибо образом дескриптор 0x2D прерывания, это приведёт к краху юзермодной оболочки и всей системы, ибо данное прерывание юзоется для вывода отладочных сообщение, к примеру тотже лоадер печатает отладочные сообщения, в данном случае это приведёт к исключению с невозможностью корректного исполнения кода. ![]() |
|
Создано: 09 января 2009 15:18 · Личное сообщение · #15 Clerk Цитата из Anti-Reverse Engineering Guide: The INT 2D instruction can be used as a general purpose debugger detection method, because when executing the instruction, if no debugger is present, an exception will occur. However, if a debugger is present, no exception will occur, and things get interesting based on the debugger you are using. OllyDBG will actually skip a byte in its disassembly and will cause the analysis to go wrong. Вот так вот это можно заюзать как антидебаг. И правда - в непатченно ольке это прерывание не вызывает исключения, хотя если подпатчить dpl, то исключение всё же вызовется. И пропускать один байт после этого прерывания прога не будет, но что-то не то. А вот про блокировку этого прерывания никто и не говорит, я вообще с битовой маской не разбирался, сделал так - byte paramcnt; byte attribs; вот это вот я инвертировал через not, и записал полученное значение в IDT, и всё работало - и отладчик, и софт всякий, никаких бсодов. ----- Stuck to the plan, always think that we would stand up, never ran. ![]() |
|
Создано: 09 января 2009 15:20 · Личное сообщение · #16 |
|
Создано: 09 января 2009 15:30 · Личное сообщение · #17 Psalmopoeus Pulcher Ну, с фантиком я антидебаг уже прошёл. Ну тут суть показать, как это сделать чисто своими руками. И что значит Проблема не в том, что int2D не генерирует исключение? Получается, что исключение есть, но олька его сама обрабатывает, и поэтому внешне его как бы нет? Т.е., я имею ввиду, что я снимаю галочку на обрботке каких-либо исключений в ольке, стоя на Int 2D жму F7, и в ольке с фантомом оказываюсь в недрах ntdll.dll, а в нетронутой прохожу на EIP+3. Но исключение и в том, и в том случае происходит? ----- Stuck to the plan, always think that we would stand up, never ran. ![]() |
|
Создано: 09 января 2009 15:56 · Поправил: Hellspawn · Личное сообщение · #18 |
|
Создано: 09 января 2009 16:02 · Личное сообщение · #19 "Anti-Reverse Engineering Guide" жалкий ман для школьнегов, фтопку. Несколько вопросов. 1. Что есть отладка ? Всмысле, что под ней понимать: трассировку посредством TF, DR, Int3 и пр. 2. Что есть антиотладка ? Вопрос изходя из вопроса #1 2. Как вызываетсо Int 0x2D ? Насчёт детекта трассировки, тема заежженая. Тут у вас какието гнилые и не универсальные методы. Курим всей конторой это: wasm.ru/forum/viewtopic.php?id=28576&p=1 wasm.ru/forum/viewtopic.php?id=29922&p=1 www.virustech.org/f/viewtopic.php?id=45 А потом вот это: www.virustech.org/f/viewtopic.php?id=56 Моё ИМХО оля кривая. Я использую Сисер. Насчёт прерывания: > Парсить шлюз следует на всех IDT всех процессоров. Исполняется посредством посылки IPI и исполнения парсящего кода на всех процессорах, посылкой DPC, перечислением бит аффинитета потока в цикле и установка его, получение спика указателей на IDT чтением KPCR, что лучше следует выбрать в зависимости от требований к коду. > Следует установить свой хэндлер, а не просто повысить DPL в шлюзе. В случае повышения DPL, укозатель на ISR будет находится в системном адресном пространстве, а эта память не доступна для юзермода, поэтому при вызове подобного прерывания возникнет исключение по доступу к памяти и хэндлер не будет вызван. Бессмысленные действия это. оказываюсь в недрах ntdll.dll Прерывание 0x2D в виндоз криво реализовано и требует на входе определённые параметры, которые передаются через регистры. Документированы следующие сервисы данного прерывания: #define BREAKPOINT_BREAK 0 #define BREAKPOINT_PRINT 1 #define BREAKPOINT_PROMPT 2 #define BREAKPOINT_LOAD_SYMBOLS 3 #define BREAKPOINT_UNLOAD_SYMBOLS 4 #define BREAKPOINT_COMMAND_STRING 5 А в недрах нтдлл - следует поставить бряк на KiUserExceptionDispatcher(), в стеке контекст диспетчера будет содержать адрес и причину исключения, это так к слову. ![]() |
|
Создано: 09 января 2009 16:15 · Поправил: Hellspawn · Личное сообщение · #20 Clerk пишет: Моё ИМХО оля кривая. Я использую Сисер. а сусер типо не глючный?? )) по юзабилити сусер нервно курит в сторонке. да забыл, я в своём примере юзал BREAKPOINT_BREAK Code:
----- [nice coder and reverser] ![]() |
|
Создано: 09 января 2009 16:29 · Личное сообщение · #21 Hellspawn Если я тебя правильно понял, то ты хотел сказать, что при dwDebugEventCode=00000001, когда u.Exception.pExceptionRecord.ExceptionCode=80000003 нужно, чтоб u.Exception.pExceptionRecord.ExceptionAddress=EIP+2, так? Clerk Syser неплох, но по функционалу до ольки не дотягивает, да и глючит жёстко, во всяком случае у меня. ----- Stuck to the plan, always think that we would stand up, never ran. ![]() |
|
Создано: 09 января 2009 16:33 · Личное сообщение · #22 |
|
Создано: 10 января 2009 00:58 · Личное сообщение · #23 _frmn И это можно назвать антиотладкой хех ![]() Я зашёл в этот топик, думол реально механизм достойный внимания обсуждается, оказалось очередной пиар, который не имеет смысла, я до сих пор не понял зачем нужно лезть в дескрипторные таблицы. Кстати, Гордон это ты чтоли, ник сокращённый, сразу не узнать.. All Сисер значит до ольки по вашему не дотягивает. Ну да, багов хватает, например инструкция std выносит его. Но у кого руки не стого места растут, тому и он плохим будет. Гибкость не сравнить с олей. Тут недавно элито вылажела какойто детский крякми, само собой интересно было взглянуть. Оказалось для ольки это проблема, сисер с этим за пару минут разобралсо.. ![]() |
|
Создано: 10 января 2009 01:19 · Личное сообщение · #24 |
|
Создано: 10 января 2009 01:35 · Поправил: ARCHANGEL · Личное сообщение · #25 _frmn пишет: тут чото типа анти-антиотладки делают как йа понил.. тобишь есть антиотладка на основе int2d, они хотят её пройти без проколов Вообще-то да. Именно это и требуется. Clerk пишет: думол реально механизм достойный внимания обсуждается, оказалось очередной пиар, который не имеет смысла, я до сих пор не понял зачем нужно лезть в дескрипторные таблицы Может и не нужно, но я просто не знал, с чего начать. Глянул вышеупомянутый Anti-Reverse Engineering Guide, решил, что проблема в том, что под дебагером Int 2D не генерит исключения, поэтому решил заменить dpl чтоб в юзермоде даже под олькой было исключение. Это, в общем, удалось. Теперь даже под непатченной олькой, если стоя на Int 2D нажать F7, то окажусь в недрах ntdll.dll, но этого мало, а что нужно сделать Hellspawn написал только на понятном ему языке. Я, конечно, просмотрел форум из вышеупомянутых постов, но форум есть форум, там много для моей проблемы ненужного, а может кто-то по делу что-то рабочее предложить? Added Хотя нет, не буду так категоричен, полезное и по делу было, понял сказанное, KiUserExceptionDispatcher - то, что нужно. Clerk, Hellspawn - спасибо. Пошёл курить статьи... ----- Stuck to the plan, always think that we would stand up, never ran. ![]() |
|
Создано: 10 января 2009 01:41 · Личное сообщение · #26 |
|
Создано: 10 января 2009 01:46 · Личное сообщение · #27 |
|
Создано: 10 января 2009 01:59 · Личное сообщение · #28 Clerk пишет: А в недрах нтдлл - следует поставить бряк на KiUserExceptionDispatcher(), в стеке контекст диспетчера будет содержать адрес и причину исключения Но я так понимаю, делать это надо не в ольке - т.к. там бряк такой не сработает при Step into на Int 2D, а как, другой дебаггер подключать? ----- Stuck to the plan, always think that we would stand up, never ran. ![]() |
|
Создано: 10 января 2009 02:32 · Личное сообщение · #29 |
|
Создано: 10 января 2009 10:31 · Личное сообщение · #30 Clerk Дело в том, что мне нужно не пройти отладку в принципе, Syser её так проходит и ничего делать не надо. Надо пройти антидебаг под олькой, причём непатченной и без всяких плагинов для сокрытия последней. Так что забыть про дебаг АПИ не получится. Но я так понимаю, что ольку надо править при обработке событий через WaitForDebugEvent, т.е. её цикл обработки этих самых ивентов, я прав? ----- Stuck to the plan, always think that we would stand up, never ran. ![]() |
. 1 . 2 . >> |
![]() |
eXeL@B —› Программирование —› Interrupt Descriptor Table - формат, перехват, изменение dpl |
Эта тема закрыта. Ответы больше не принимаются. |