![]() |
eXeL@B —› Программирование —› Интересуют delphi исходники демонстрирующие установку и обработку memory breakpiont |
. 1 . 2 . >> |
Посл.ответ | Сообщение |
|
Создано: 24 марта 2009 17:51 · Личное сообщение · #1 |
|
Создано: 24 марта 2009 18:15 · Личное сообщение · #2 |
|
Создано: 24 марта 2009 18:44 · Личное сообщение · #3 |
|
Создано: 24 марта 2009 18:48 · Поправил: Hellspawn · Личное сообщение · #4 в чём сложность??? Code:
обрабатывай как хочешь ![]() ----- [nice coder and reverser] ![]() |
|
Создано: 24 марта 2009 20:24 · Личное сообщение · #5 |
|
Создано: 24 марта 2009 20:25 · Личное сообщение · #6 |
|
Создано: 24 марта 2009 22:05 · Личное сообщение · #7 |
|
Создано: 24 марта 2009 22:48 · Личное сообщение · #8 Ради бога, можно и без исходников - главное принцип, звучит он так: установка memory breakpoint есть назначение коду, на который хочешь поставить этот самый breakpoint, атрибутов PAGE_GUARD, когда программа обратиться к странице с такими атрибутами, получим исключение, его нужно обработать, чтоб снять этот breakpoint и продолжить выполнение кода жертвы, для этого мы должны либо подключиться к жертве в качестве отладчика, либо использовать VEH, но это уже менее универсально, ещё можно написать свой драйвер, который будет обрабатывать эти исключения, всё зависит от того, как далеко ты готов зайти ![]() ----- Stuck to the plan, always think that we would stand up, never ran. ![]() |
|
Создано: 24 марта 2009 22:50 · Личное сообщение · #9 Hellspawn пишет: может тогда стоит подучить сабж? Да, да... Вот хочу на конкретном примере. Надобность возникла. v0id2k пишет: Если ты не силен в делфе, зачем тогда тебе пример именно на этом языке? Не, ну что-то могу, просто углубляюсь в более сложное по мере надобности... А так вообще дельфи для меня оптимальный вариант. Посмотри исходники анпакера для аспака от пеко. Посмотрел и нашёл всё... Отстал я от жизни, не понял сразу кого ты так назвал, иначе нашёл бы раньше. ![]() |
|
Создано: 24 марта 2009 22:52 · Поправил: Clerk · Личное сообщение · #10 |
|
Создано: 24 марта 2009 22:57 · Личное сообщение · #11 |
|
Создано: 25 марта 2009 12:49 · Поправил: ARCHANGEL · Личное сообщение · #12 Clerk пишет: Вам товарищ тока драйвера писать Ээх, это да, справедливо подколол ![]() ToBad Если жертва подгружает твою библиотеку, то так можно и не делать, достаточно VEH, нот.к. вехи ппашут, начиная с WinXp, то для более ранних версий ОС это не годится, а по этому вопросу советую почитать Рихтера, там, вроде бы, если мне не изменяет память (щас перед собой у менянету этой книженции) описываются такие извраты, как длл подключить в качестве отладчика, ещё можно установить финальный обработчик через SetUnhandledExceptionFilter, и, если происходит исключение, которое в нормальных условиях просто не могло произойти, т.е. программист не продумывал такую ситуацию,что страницы кода могут иметь такой атрибут, как PAGE_GUARD, то,вероятно, что его сехи могут такую ситуацию и не обработать, тогда управление получит твой обработчик, далее, из извратов, никто ведь не запрещает нам вмешиваться в процесс обработки исключений непосредственно перехватом в ntdll.dll из третьего кольца KiUserExceptionDispatcher. Но это уже действительно изврат))) ----- Stuck to the plan, always think that we would stand up, never ran. ![]() |
|
Создано: 26 марта 2009 05:36 · Поправил: Clerk · Личное сообщение · #13 > непосредственно перехватом в ntdll.dll из третьего кольца KiUserExceptionDispatcher. Но это уже действительно изврат Почемуже изврат ? Если только потому, что это жесткий перехват и обнаруживается например рку то наверно это нигде не имеет значения. Я считаю перехват ядерных калбэков в нтдлл самым эффективным. Более того, довольно часто возникает задача установить свой обработчик исключений в чужом процессе, из юзермода невозможно удалённо зарегистрировать VEH, так как указатель на обработчик шифруется ксором с значением, которое случайно и не может быть определено из другого процесса. А VEH это единственный механизм обработки исключений, который глобален в процессе(для всех потоков), именно он обрабатывается первым, после идёт обработка SEH, но она локальна для каждого потока. Так что к сожалению никак глобально первым исключение не обработать, кроме как выполнив жёсткий перехват(например Call RtlDispatchException). А обработка в конечном обработчике слишком не надёжна, исключение по доступу к сторожевой страницы является палевным, аналогично как трассировочное. ![]() |
|
Создано: 26 марта 2009 09:53 · Личное сообщение · #14 |
|
Создано: 27 марта 2009 05:07 · Поправил: ToBad · Личное сообщение · #15 Погуглил и нашёл пример: Смогу ли я так перехватывать и обрабатывать обращение к памяти? Code:
![]() |
|
Создано: 27 марта 2009 05:58 · Поправил: Clerk · Личное сообщение · #16 ToBad Тебе нужно определить для себя что есть останов по доступу к памяти. В юзермоде варианты разные есть. > Использовать аппаратный останов, адрес определён в отладочных регистрах. Для потока максимум 4 точки останова можно задать, локален в потоке. Также существенным недостатком является адрес останова, который получает диспетчер исключений - по доступу к данным Eip будет указывать на следующую инструкцию, при исполнении инструкции по адресу останова Eip указывает на адрес инструкции, вызвавшей останов(который в DrX). > Использовать сторожевые страницы. Страница помечается атрибутом PAGE_GUARD, при обращении к ней этот атрибут снимается и генерируется исключение STATUS_GUARD_PAGE_VIOLATION. Недостаток заключается в рассинхронизации, тоесть первый поток обращается к сторожевой странице, она разлочивается(снимается атрибут PAGE_GUARD), этот поток входит в диспетчер исключений, в это время второй поток обратится к этой странице и исключение не произойдёт. Можно считать что этот механизм локален для потока. > Использовать исключение по доступу к не выделенной странице. Страница помечается как PAGE_NOACCESS, либо иной атрибут, в зависимости от типа доступа генерируется исключение STATUS_ACCESS_VIOLATION. Глобально в процессе. У каждого способа есть свои недостатки и преимущества. ![]() |
|
Создано: 27 марта 2009 07:34 · Личное сообщение · #17 |
|
Создано: 27 марта 2009 07:49 · Личное сообщение · #18 SLV 1. Невозможность исполнения кода, который находится в тойже странице, за которой необходимо следить. 2. При каждом обращении к странице для исполнения инструкции после останова необходимо восстанавливать атрибуты страницы, после чего снова страница должна быть не доступной к примеру на запись. Тоесть необходимо выполнить трассировку инструкции. Трассировка будет обнаружена. 3. Скорость исполнения низкая. ![]() |
|
Создано: 27 марта 2009 11:29 · Поправил: SLV · Личное сообщение · #19 Clerk, а есть идеи как тогда можно контролировать доступ к памяти без потери скорости и без потерь на многопоточности? если бы цель была поставить простой breakpoint без debug api было бы намного проще, обрабатывать ExceptionRecord->ExceptionCode на STATUS_BREAKPOINT, но это изменение памяти и сработает только при выполнении, т.е. другая задача. кроме хука KiUserExceptionDispatcher, можно хитро перехватить саму ZwRaiseException для контроля эксепшенов, с выходом из функции без вызова при необходимости ![]() ----- Shalom ebanats! ![]() |
|
Создано: 27 марта 2009 11:57 · Личное сообщение · #20 Clerk я не знаю как лучше и что именно мне подойдет. Задача написать логгер обращения к определенной ячейке. В принципе только это интересует. Буду запоминать предыдущее состояние ячейки, а при срабатывании писать в файл адрес из которого изменилось содержимое, старое и новое значение. Разумеется после этого должен продолжать нормальную работу жертвы. Знаю что доступ происходит не очень часто, так что скорость не важна, но возможно осуществляется из нескольких потоков и наверняка применяется косвенная адресация к ячейке которую и хочу отловить. ![]() |
|
Создано: 27 марта 2009 12:58 · Личное сообщение · #21 |
|
Создано: 27 марта 2009 13:10 · Поправил: daFix · Личное сообщение · #22 |
|
Создано: 28 марта 2009 07:13 · Личное сообщение · #23 |
|
Создано: 28 марта 2009 21:31 · Поправил: g-l-u-k · Личное сообщение · #24 в свое время нашел на ачате: Code:
![]() |
|
Создано: 28 марта 2009 21:54 · Личное сообщение · #25 |
|
Создано: 28 марта 2009 22:22 · Личное сообщение · #26 |
|
Создано: 30 марта 2009 15:42 · Личное сообщение · #27 |
|
Создано: 31 марта 2009 02:13 · Личное сообщение · #28 |
|
Создано: 31 марта 2009 11:40 · Личное сообщение · #29 |
|
Создано: 31 марта 2009 12:06 · Личное сообщение · #30 |
. 1 . 2 . >> |
![]() |
eXeL@B —› Программирование —› Интересуют delphi исходники демонстрирующие установку и обработку memory breakpiont |