Главная » Статьи » Крэкинг

Ollydbg: Инструкция По Применению
OllyDbg – достаточно неплохой отладчик уровня пользователя. Последнее замечание означает, что драйвера, работающие в Ring 0, отладить вы, конечно же, не сможете, но это отнюдь не умаляет его боеспособности. К достоинствам можно отнести простоту использования, наличие в сети достаточно большого количества плагинов, функциональность и т.п. Все это и определяет его популярность, в частности, в среде реверсеров.
Итак, рассмотрим Олли поближе. При запуске отладчика перед нами появляется рабочее окно, в котором мы в дальнейшем сможем извращаться над подопытной программой, как нам вздумается. Исследуемый процесс может быть выбран как в виде исполняемого PE-файла (File – open, либо F3), так и в виде уже запущенного процесса (File - attach). В последнем случае следует отметить, что при завершении работы с отлаживаемым процессом, после того, как мы закроем Олли, грохнется и сам процесс, так что будьте аккуратны при отладке всякой нечисти типа Csrss.EXE, Winlogon.EXE или Explorer.EXE =).
Внешне отладчик с запущенным под ним процессом выглядит приблизительно следующим образом:
[Image]


где:
1. – фрейм с дизассемблированным листингом отлаживаемой проги,
2. – фрейм дампа памяти,
3. – фрейм регистров CPU,
4. – фрейм стека.

В данной статье я не буду углубляться в ассемблерные тонкости для реверсера (учите матчасть, в пределах одной статьи это не охватить), так что будем считать, что в этом плане вы несколько подкованы.
Вкратце пройдусь по перечисленным выше окнам.



Фрейм отлаживаемого кода (1)


Во первых, в первом фрейме с кодом программы рекомендую установить включить режим подсказки для условных и безусловных переходов (Options – Debugging Options – CPU – поставить галки на Show jump path, Show grayed path if jump is not taken, Show jumps to selected command). Эти опции чисто для удобства и не являются обязательными. Просто если вы попадаете, к примеру, на команду типа JNE, JS, JZ и т.п., в зависимости от установленных флагов отладчик подсветит вам направление выполняющегося перехода красным либо не выполняющегося серым цветом.
Трассировка программы выполняется следующими клавишами:
F7 – с заходом в процедуры CALL address,
F8 – без захода в процедуры.
Также возможно выполнение программы (клавиша F9) полностью, либо до установленной точки останова, либо автоматическое выполнение кода между двумя точками останова.
Точки останова (т.н. Breakpoint, или бряки =) ), можно установить следующими способами: ручной режим (выбрать строчку программы, где нам нужен бряк, и нажать F2) либо через CommandBar (естественно при наличии установленного плагина). Установленный бряк подсвечивается в колонке адресации. С первым способом думаю все понятно, на втором остановлюсь подробнее.
Возможны следующие команды для установки бряков (взято из справки):
BP expression [,condition] установить INT3 breakpoint на адрес
BP EAX+10
BP 410010, EAX==WM_CLOSE
BP Kernel32.GetProcAddress
BPX label Установить breakpoint на вызов функции без указания модуля
BPX CreateFileA
BC expression удалить breakpoint по адресу
BC 410010
MR expression1 [,expression2] установить breakpoint на доступ к диапазону памяти
MW expression1 [,expression2] установить breakpoint на запись в данный диапазон памяти
MD удалить установленный на памяти breakpoint
HR expression установить 1-байтовый аппаратный breakpoint на доступ по адресу
HW expression установить 1-байтовый аппаратный breakpoint на запись по адресу
HE expression установить аппаратный breakpoint на выполнение по адресу
HD [expression] удалить аппаратный (ые) breakpoint(s) по адресу

Двойной клик в окне по команде (либо же правый клик на команде – Assemble, либо пробел) вызывает окно редактирования кода, что иногда помогает отключить некоторые вызовы функций, изменить направление ветвления, да и вообще много чего экстремального в процессе отладки. Тут отмечу, что при замене допустим команды CALL program.131432E8 длиной 5 байт командой NOP (нет операции, или иначе Not OPeration), длина которой 1 байт, Олли автоматически заполнит лишние четыре байта таким же NOP-ом, что есть гуд. Следует только учитывать, что после перезагрузки программы в отладчике (Debug - Restart) все изменения сбрасываются.
Перемещение по коду программы легко осуществляется через правый клик мышки (вообще практически всю работу можно свести к правому клику, т.ч. обзову его для краткости ПКМ). Для этого просто надо выполнить ПКМ – Go to – expression, и в появившемся окне ввести адрес, на который мы хотим посмотреть (следует учесть, что это не меняет содержимое регистра EIP, т.е. не является трассировкой). Вернуться на прежнюю позицию кода можно либо нажав ПКМ – Go to – Previous, либо нажав минус на NumPad. Значение EIP также не меняется. Эти команды являются просто инструментом для обзора кода.
Бывает, что мы остановились на некотором вызове типа CALL program.131432E8, но понятия не имеем, надо ли нам его трассировать по F7. В данном случае будет уместна такая функция, как «подсмотреть» код внутри вызываемой процедуры. Сделать это можно либо через ПКМ – Folow, либо через клавишу Enter. Значение EIP как и в предыдущем случае, не изменяется, т.е. мы по прежнему будем висеть на вызове CALL program.131432E8. Вернуться из просмотра можно все той же клавишей « - » на NumPad.
В случае, когда нам нет необходимости выполнять весь код отлаживаемой программы, а только какую то его отдельную функцию, можно воспользоваться такой фичей, как установка адреса выполняемой программы (ПКМ – New origin here*) на нужной нам команде. Это позволяет оттрассировать отдельную процедуру, что является имхо очень удобным в некоторых случаях.
Если мы модифицируем код программы (assemble) и хотим увековечить его в *.exe файле для потомков, тут нам весьма кстати пригодится такая опция, как сохранить изменения (ПКМ – Copy to Executable – Selection или ПКМ – Copy to Executable – All Modifications).
Внешний вид отладчика настраивается уже под свой вкус опцией ПКМ – Appearance. Там много чего есть интересного, думаю разберетесь.


Фрейм дампа памяти (2)


В данном фрейме также возможны установки бряков на чтение-запись-выполнение (через ПКМ), перемещение по адресам и т.п., поэтому заостряться на них не стану. Единственное, что здесь можно отметить, это представление данных. Через контекстное меню можно задавать любой требуемый для выполнения текущей задачи вид дампа памяти. Дамп может быть представлен в виде HEX кодировки, в виде ASCII и UNICODE строк, в виде Short, Long, Float чисел или же может быть показан PE-заголовок (для этого достаточно перейти на адрес базы EXE-файла и выбрать ПКМ – Special – PE headers).
Удобной является так же и опция редактирования дампа (ПКМ – Binary – Edit). Для этого достаточно просто выделить мышкой необходимый фрагмент данных и вперед.
Больше на этом фрейме, думаю, останавливаться не стоит, переходим к следующему.


Фрейм регистров процессора (3)


В данном фрейме нам представлены все регистры процессора. В стандартном виде тут находятся основные регистры (было бы странно, если бы их не было), флаговый регистр, регистры FPU. Через контекстное меню можно переключаться на представление вместо FPU-регистров MMX-, debug- либо 3DNow!-регистров (ПКМ - view MMX registers/view 3DNow! Registers/view debug registers соответственно).
Значения основных регистров (кроме EIP) могут быть изменены на любом этапе отладки. Для этого достаточно просто щелкнуть на нужном регистре правой кнопкой мыши, выбрать опцию Modify и в появившемся окне ввести необходимое значение либо же просто двойной клик на выбранном регистре. Очень полезно при оперативной подмене результатов, возвращаемых, к примеру, API-функциями. Так же через контекстное меню есть просто банальные команды, как, к примеру, Increment (увеличить значение на 1), Decrement (уменьшить значение на 1), Zero (обнулить), Set to 1 (установить в 1). Опции Follow in Dump и Follow in Stack перемещают нас соответственно в фрейме дампа либо в фрейме стека на адрес, содержащийся в конкретном регистре.
Для регистра флагов процессора так же имеется полезная фича, иногда применяемая при отладке. Это т.н. установка (Set) и сброс(Reset) значений отдельных флагов. Ну, здесь думаю ясно, что установка – в единицу, сброс – в ноль. Выполняется либо через контекстное меню, либо двойным кликом на выбранном флаге. Крайне полезная опция, когда очень хочется изменить направление ветвления, а модифицировать команду с JE на JNE крайне влом =)
Так же отмечу, что значения регистров и флагов, которые в ходе выполнения последней машинной команды были модифицированы, подсвечиваются красным цветом.


Фрейм стека (4)


В принципе, в фрейм стека можно увидеть уже знакомые по предыдущим фреймам опции, но есть и несколько новых. Все рассматриваемые опции, как обычно, в контекстном меню.
Так, к примеру, опция Address – Relative to Selections/Relative to EBP/Relative to ESP/Absolute определяет адресацию в фрейме стека (относительно выбранного адреса/относительно EBP/относительно ESP/абсолютная).
Lock Stack – позволяет зафиксировать выбранный адрес в стеке (сделать его неперемещаемым за границы фрейма, т.е. автоскролл при изменении вершины стека не работает). Unlock Stack – обратная операция.
Операции Push DWORD / Pop DWORD позволяют затолкать в стек и соответственно вытолкать из него двойное слово. При вызове первой инструкции появляется окно, где нам предлагают ввести заталкиваемое значение.
Операции Go to ESP / Go to EBP позволяют переместиться нам на вершину стека (которую указывает ESP) и на дно кадра стека (указывает EBP). Тут тоже все должно быть ясно.
Больше вроде в данном фрейме ничего неясного нет.

Конечно же во всех фреймах доступна возможность копирования данных в буфер обмена, и, соответственно, надругательства над содержимым где нибудь в блокноте =) Делается это элементарно: простым «нажми и тяни» выделяем необходимый нам блок данных (кода) и далее просто выбираем Copy – To clipboard. Ничего сложного.

На этом думаю, инструкция по применению отладчика OllyDbg заканчивается. Конечно же, за рамками данной статьи осталось еще немало полезных и интересных опции. Что-то я просто мог забыть. К тому же стоит отметить, что сюда не вошло описание плагинов для Олли, да и вообще тема плагинов мало затронута. Но все-таки базовое описание функций вроде изложено правильно и в достаточной мере, чтобы уже можно было начинать работать с ним вполне комфортно для выполнения различных рядовых и нерядовых задач.
На столь радостной ноте спешу раскланяться. Пишите письма мелким подчерком, ваши замечания и дополнения (последние вполне уместны!) приветствуются.

Всем удачной отладки!

Источник: http://BiT-Team.com
Категория: Крэкинг | Добавил: -=Hellsing=- (17.06.2009) | Автор: Debagger
Просмотров: 11621 | Рейтинг: 3.5/2
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]