Ollydbg на русском языке


Введение в крэкинг с нуля, используя OllyDbg - Глава 1

Введение в крэкинг с нуля, используя OllyDbg - Глава 1 — Архив WASM.RU

Целью данного «Введения в крэкинг с нуля, используя OllyDbg», является дать тем, кто только начал осваивать искусство крэкнинга, базовые знания и, вместе с тем, сделать это так, чтобы эти знания позволили в дальнейшем читать и понимать более продвинутые туториалы – такие, которые можно встретить в «Новом курсе от CracksLatinos», который, разумеется, остаётся открытым для новых добавлений и пополнений.

Идея создания курса родилась из-за того, что многие туториалы в «Новом курсе от CracksLations» оказывались слишком сложными для новичков, и те, не сумев достигнуть нужного уровня, оказывались разочарованными и во многих случаях отказывались продолжать. Поэтому целью данного «Введения...» является не повторение прекрасных туториалов из «Нового курса...», число которых уже перевалило за 500, но заложить основу, чтобы те, кто закончит данный курс, смогли читать более сложные пособия. Это, как и всё в нашем ремесле, требует значительных усилий, и главной задачей является сократить их количество, дав базовые знания и позволив в дальнейшем понимать более сложный материал.

Почему OLLYDBG?

Мы не будем здесь рассуждать о вечном противостоянии Soft-Ice против OllyDbg, думаю, что даже фанатики от Soft-Ice признают, что проще начать с OllyDbg, так как о нём много информации и его проще изучать. Нам нужно войти в мир крэкинга через дверь под названием «OllyDbg», а уже потом тот, кому нужно, сможет перейти на любой другой отладчик, который потребуется, так как меняются лишь их способы использования, но суть остаётся неизменной.

Начнём с начала

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

Поскольку мы начинаем с нуля, то для начала нам нужно распаковать скачанный архив в такую папку на жёстком диске, до которой можно легко добраться. Хорошей идеей будет создать папку на диске C:/. Хотя будет работать и в любом другом месте, я буду исходить из того, что выбран диск C:/.

После того, как файл был распакован, заходим в созданную папку и видим:

В ней находится исполняемый файл OLLYDBG.exe, который нам и нужно запустить и ярлык которого я для удобства сделал на своём рабочем столе.

Ок, всё готово к запуску. Кликаем на OllyDbg:

Перед нами повляется сообщение о том, что DLL, находящаяся в библиотеке, старше, чем такая же системная DLL, и если выберем «Да», то тогда старая DLL будет стёрта из папки, а использоваться будет системная. Хотя я не вижу особых различий между этими двумя, тем не менее, предпочитаю ту, которая идёт с дистрибутивом, и поэтому всегда нажимаю «Нет».

Это чистый OllyDbg, и первой программой, которую мы откроем только для того, чтобы ознакомиться с OllyDbg, станет знаменитый CrackMe CrueHead’а, который приложен к данному туториалу.

Чтобы открыть файл в OllyDbg, идём в File -> Open или нажимаем на иконку:

Откроется окно, с помощью которого можно найти нужный файл, в данном случае это crackme CrueHead’а.

Откроется вышеупомянутый crackme, и на данный момент неважно, что совершенно непонятно, что означает открывшийся нам вид – пока мы только пройдёмся по различным частям и функциям OllyDbg и некоторым настройкам, чтобы когда в последующих туториалах будет написано, скажем, «зайдите в DUMP», вы, по крайней мере, знали, где находится эта опция.

Здесь мы рассмотрим четыре части главного окна OllyDbg:

1) Дизассемблированный код

Также называется листингом. Тут Олли показывает нам дизассемблированный код программы, которую мы собираемся отлаживать; по умолчанию Олли сконфигурирована так, чтобы анализировать программу при её открытии. Это можно изменить в Options -> DEBUGGING OPTIONS.

То есть, если отмечена галочка «AUTO START ANALISIS OF MAIN MODULE», OllyDbg проанализирует программу и покажет о ней дополнительную информацию.

Это начало проанализированного листинга крэкми CrueHead’а, и если мы откроем его без анализа, то сможем увидеть разницу.

В окне анализа содержится множество информации, которая, несмотря на то, что пока нам не очень понятна, выглядит весьма интересной. В то же время приятно знать, что её можно в любой момент убрать, если анализ оказался не слишком точным или в него закралась какая-то ошибка.

Зачастую OllyDbg отображает некоторые части программы некорректно, так как ошибочно интерпретирует исполняемый код как данные, и тогда она отображает примерно следующее:

В этом случае можно вручную убрать анализ, кликнув на листинге правой кнопкой мыши и выбрав «ANALISIS -> REMOVE ANALYSIS FROM MODULE».

И тогда листинг отобразится корректно.

Другой опцией, которой вы можете воспользоваться для облегчения раобты и которая мне лично не очень нравится (но вкусы бывают разные), является подсветка jump (переходов) и call (вызовов) – кликните на листинге правой кнопкой мыши и выберите «APPEARENCE -> HIGHLIGHTING -> JUMPS AND CALLS».

Получится следующее:

Здесь мы видим, что call’ы подсвечены лазурным цветом, а переходы – жёлтым.

Теперь листинг стал более читаемым, но пока у нас нет ни малейшей идеи, что это означает, но хорошо иметь инструмент подготовленным к дальнейшему использованию.

2) Регистры

Второе важное окно – это окно регистров.

Вспомним, что окно регистров находится в самой правой части OllyDbg, и там отображается значительное количество информации.

Есть значительно больше информации, которую мы не видим, но можно устанавливать режим отображения в три состояния («VIEW FPU REGISTERS» – отображать FPU-регистры, «VIEW 3D NOW REGISTERS» – отображать “3D NOW”-регистры и «VIEW DEBUG REGISTERS» – отображать отладочные регистры). По умолчанию отображаются первые.

3) Стек или «куча»

Теперь переходим к «стеку или куче». Здесь не слишком много конфигурационных опций – разве что возможность отобразить информацию, касающуюся регистров ESP и EBP.

По умолчанию стоить режим отображения информации, связанной с ESP (и он же является самым полезным), но его можно сменить на режим отображения информации, связанной с EBP, для чего необходим кликнуть в этом окне правой кнопкой мыши и выбрать пункт «GO TO EBP», а дальнейшее использование пункта «GO TO ESP» вернёт нас в прежний режим.

В дальнейших главах я объясню подробнее функциональность стека, но пока мы рассматриваем только то, что можно изменить с помощью конфигурации.

4) Дамп

У окно дампа есть много режимов отображения, которые можно менять, кликнув правую кнопку мыши в окне дампа и выбрав тот, который нужен. По умолчанию используется используется режим 8-ми байтовый Hex/ASCII.

Режим, используемый по умолчанию, также является и чаще всего используемым, но вместе с тем, у нас есть возможность изменять его на показ дизассемблированного кода (DISASSEMBLE), текста (TEXT) и других форматов (SHORT, LONG, FLOAT).

И, накоец, опция SPECIAL -> PE HEADER, которая, как мы это увидим в ближайших главах, может быть очень полезной.

Теперь мы знаем основные части главного окна OllyDbg, но есть ещё окна, которые недоступны напрямую, но могут быть вызваны как через меню, так и через кнопки на панели управления.

Рассмотрим каждую из них.

Кнопка L или VIEW->LOG показывает нам то, что OllyDbg пишет в окне лога. Его можно сконфигурировать на отображение различного рода информации, а по умолчанию в окне лога сохраняется вся информация о запуске, а также информация, связанная с «BREAKPOINTS CONDICIONAL LOGS» (условными логами точек останова). С последней мы встретимся гораздо позднее, а пока давайте посмотрим информацию о запущенном процессе (в нашем случае это крэкми CrueHead’а) и библиотеках, которые он загружает.

Одна из самых главных опций данного окна – это ведение лога в файле на тот случай, если мы хотим сохранять информацию в текстовом файле. Чтобы активировать эту опцию, нажмите на правую кнопку мыши и выберите «LOG TO FILE».

Кнопка E или VIEW->EXECUTABLES показывает нам список модулей, которые использует программа: exe, dll, ocx и прочие.

Здесь также правая кнопка мыши вызывает множество опций, которые пока мы смотреть не будем, но которые мы уже видели при исследовании главного окна OllyDbg.

Кнопка M или VIEW->MEMORY отображает память, занятую нашей программой. Здесь мы видим секции приложения, библиотеки, использующиеся процессом, стек и различные секции, занятые системой, и зачастую программы в процессе выполнения занимают новые секции памяти.

Кликнув правой кнопкой мыши можем сделать SEARCH в памяти, чтобы найти в ней строки различных родов (текстовые, шестнадцатиричные, юникодовые), также есть возможность подстветить точки останова в секциях, равно как и возможность изменить права доступа к последним (выберите SET ACCESS).

Кнопка T или VIEW->THREADS показывает нам список нитей (потоков) программы.

Хотя сейчас мы не знаем что это такое, а узнаем это лишь в последующих главах, ознакомиться с каждым из окон лишним не будет. Пользоваться ими мы научимся позднее.

Кнопка W или VIEW->WINDOWS отображает нам окна программы, но поскольку она ещё не выполняется, то и список окон остаётся пустым.

Кнопка H или VIEW->HANDLES отображает хэндлы, позже я объясню, для чего они служат.

Кнопка C или VIEW->CPU возвращает нас к главному окно OllyDbg.

Кнопка / или VIEW->PATCHES показывает список наложенных патчей, если программа была изменена. Поскольку пока никаких изменений не вносилось, сейчас окно остаётся пустым.

Кнопка K или VIEW->CALL STACK отображает «call stack», списко вызовов, которые нам встретились до того места, где программа остановилась.

Кнопка B или VIEW->BREAKPOINTS вызывает список обычных точек останова, расположенных в программе. Здесь нет ни точек останова аппаратного обеспечения, ни точек останова памяти, только обычные.

Кнопка R или VIEW->REFERENCES показывает окно ссылок, полученных нами в результате поиска ссылок в Олли.

Кнопка «…» или VIEW->RUN TRACE отображает результат выполнения команды RUN TRACE. Здесь мы также можем выбрать опцию LOG TO FILE), чтобы сохраненить результаты трассировки в текстовом файле.

Мы рассмотрели панель с самыми важными кнопками, чтобы вы были знакомы с возможностями, которые они предоставляют, когда мы начнём их более глубокое изучение в последующих главах.

Как сконфигуровать OllyDbg стала JIT (JUST IN TIME DEBUGGER)

Конечно, мы не будем всё время использовать JIT, а только в специальных случаях, так как если случится ошибка с какой-либо запущенной программой на нашей машине, то нам совсем не нужно, чтобы использовалась Олли (по умолчанию в качестве JIT используется dr.watson).

Чтобы сделать OllyDbg JIT-отладчиком, нужно перейти в OPTIONS->JUST IN TIME DEBUGGING

и нажать последовательно кнопки MAKE OLLYDBG JUST IN TIME DEBUGGER y DONE

Чтобы убрать эту функцию, нужно в том же месте нажать на RESTORE JUST IN TIME DEBUGGER и DONE.

Подключение плагинов в OllyDbg

OllyDbg позволяет подключать плагины, которые могут оказаться полезными для решения той или иной задачи. Пока мы ограничимся подключением плагина COMMAND BAR, чтобы научиться как это делать.

Скачиваем данный плагин отсюда (ссылка, указанная в оригинальной статье, умерла, поэтому я скачал плагин из инета и разместил её на wasm.ru - прим.пер.).

После этого распаковываем плагин и смотрим содержимое папки, где это было сделано:

Прежде всего нужно создать папку для плагинов. Я создам её на C:/ и назову PLUGINS.

Разумеется, плагины могут находиться где угодно, но мне нравится размещать всё на C. Как бы то ни было, теперь мы должны сконфигурировать OllyDbg, чтобы она распознавала эту папку как местонахождение всех плагинов.

Для этого идём в OPTIONS->APPEARANCE.

И в открывшемся окне открываем вкладку DIRECTORIES.

Видим, что в качестве пути к плагинам указана директория, где находится сам OllyDbg.exe, и можно было бы помещать плагины туда, но мне нравится держать их отдельно, и тогда нажимем на PLAGIN PATH->BROWSE, чтобы найти созданную нами папку.

Выбираем папку PLUGINS и сохраняем изменения.

То есть нужно перезапустить Олли, чтобы она признала новую папку с плагинам, но сначала следует скопировать в последнюю скачанный плагин.

Копируем всё содержимое архива в папку PLUGINS.

Теперь все файлы плагина «Command Bar» находятся в папке PLUGINS, в неё же следует помещать и остальные (зачастую можно копировать не все файлы в архиве, а только dll).

Теперь закрываем OllyDbg, если она всё ещё была закрыта, и запускаем по новой. Видим, что в меню PLUGINS появился COMMAND BAR и его опции.

В нижней части OllyDbg видим установленный COMMAND BAR.

Это текстовое поле для ввода команд, которые нам могут пригодиться во многих случаях, и позднее мы увидим их применение, а пока важно научиться подключать плагины.

Чтобы деинсталлировать PLUGIN достаточно просто стереть соответствующую dll из папки PLUGINS и перезапустить OllyDbg, и плагин исчезнет. Вместе с тем, благоразумно всегда держать COMMAND BAR включённым.

Снова открываем крэкми CrueHead’в в OllyDbg.

Наиболее полезные клавиши в OllyDbg следующие:

F7: Выполняет одну строку кода (если находимся на CALL, то переходим внутрь вызванного участка кода)

F8: Выполняет одну строку кода (если находимся на CALL, то просто выполняет вызов без перехода внутрь и переходит на следующую за CALL строку).

Это два вида ручной трассировки очень разные и в каких случаях использовать каждую из них мы рассмотрим позже.

F2: устанавливает обычную точку останова на отмеченной линии. Чтобы убрать эту точку останова, надо ещё раз нажать F2.

Например:

Хотим установить точку установа в позиции 40101A, поэтому отмечаем эту линию с помощью мыши.

С помощью одного клика мыши она помечается и становится серого цвета как на картинке. Затем нажимаем F2.

Видим, что соответствующая позиция в первой колонке становится красной, что говорит о том, что здесь есть точка останова. Нажав F2 ещё раз можно её убрать.

F9: Запускает программу, которая будет выполняться до тех пор, пока не встретить точку останова, не совершиться какое-либо исключение или же просто прекратит работу по каким-либо причинам. Когда программа запущена, в нижнем правом угле OllyDbg отображается слово RUNNING.

Запустив крэкми CrueHead’а, мы увидим следующее:

Чтобы временно прекратить выполнение программы, нужно нажать F12 или DEBUG->PAUSE.

Видим, что OllyDbg отображает слово PAUSED (пауза). Продолжить выполнение программы можно нажав F9 или DEBUG->RUN.

Чтобы закрыть отлаживаемую программу выберите DEBUG->CLOSE.

Это был краткий обзор OllyDbg, более глубокое изучение множества опций и возможностей которой мы продолжим изучать в последующих главах. Главное, чтобы вы скачали программу, сконфигурировали, ещё раз посмотрели всё, о чём было рассказано в этом туториале, так же подключили плагин, позапускали и поостанавливали крэкми CrueHead’а, попробовали поставить точки останова, чтобы в следующей главе все эти вещи не вызывали у вас колебаний и сомнений. © Рикардо Нарваха, пер. Aquila

wasm.in

Использование OllyDbg

Как запустить сеанс отладки

Самый простой путь состоит в том, чтобы запустить OllyDbg, выбрать File -> Open (Файл -> Открыть) и выбрать программу, которую Вы хотите отладить. Если эта программа требует каких-нибудь параметров командной строки, напечатайте их в поле внизу диалогового окна, или выберите одну из строк с параметрами, которые Вы использовали в предыдущих сеансах.

OllyDbg может делать отладку автономных DLL. В этом случае OllyDbg создает и запускает маленькое приложение, которое загружает библиотеку и, по вашему запросу, вызывает экспортируемые функции. Если Вы хотите перезапустить последнюю отлаживаемую программу, просто нажмите Ctrl+F2 (это горячая клавиша для перезапуска программы), и OllyDbg запустит её с теми же самыми параметрами. Альтернативно, выберите меню File, а затем программу из истории. Вы можете также перетащить исполняемый файл или DLL из Проводника Windows и бросить его значок на OllyDbg.

Конечно, Вы можете определить название отлаживаемой программы и ее параметры в командной строке при запуске OllyDbg. Например, Вы можете создать на рабочем столе ярлык, указывающий OllyDbg, выбрать Свойства, перейти к Ярлыку програмы, и добавить название программы в командную строку. Каждый раз, когда Вы дважды щелкаете этот ярлык, OllyDbg автоматически запустит вашу программу. Обратите внимание, что DLL не поддерживают командную строку.

Вы можете присоединить OllyDbg к запущенному процессу. Выберите File -> Attach (Файл -> Присоединить), и выберите процесс из списка. Заметьте, однако, что после того, как Вы закрываете OllyDbg, этот процесс тоже завершится. Никогда не пробуйте присоединяться к системному процессу, это может закончиться сбоем операционной системы. (Честно говоря, в большинстве случаев OS не позволит Вам присоединяться к чувствительному процессу).

OllyDbg может действовать как отладчик JIT « just - in - time » . Это требует регистрации в системном реестре. Выберите Options -> Just-in-time debugging (Опции -> Отладка «just-in-time»), и в появившемся диалоге выберите «Make OllyDbg just-in-time debugger» (Сделать OllyDbg отладчиком «just-in-time»). Теперь, когда какое-нибудь приложение даст сбой, Вас спросят, хотите ли Вы произвести отладку этого приложения. Тогда операционная система запустит OllyDbg, который остановится непосредственно в точке, где произошёл сбой. Или, если Вы выбрали присоединение без подтверждения, OllyDbg запустится без всяких вопросов. Чтобы восстановить предыдущий отладчик «just-in-time», нажмите соответствующую кнопку в упомянутом диалоге и все.

Также существует другая возможность добавлять OllyDbg в контекстное меню, связанное с исполняемыми файлами в Проводнике Windows . (Эта идея принадлежит JochenGerster). В главном меню OllyDbg выберите «Options|Add to Explorer» (Опции -> Добавить в Проводник), затем нажмите «Add OllyDbg to menu in Windows Explorer» (Добавить OllyDbg в контекстное меню Проводника Windows). Впоследствии Вы можете щелкнуть правой кнопкой мыши на исполняемом файле, или DLL и выбрать OllyDbg из меню. Эта опция создает 4 ключа в системном реестре:

HKEY_CLASSES_ROOT\exefile\shell\Open с OllyDbg HKEY_CLASSES_ROOT\exefile\shell\Open с OllyDbg\command HKEY_CLASSES_ROOT\dllfile\shell\Open с OllyDbg HKEY_CLASSES_ROOT\dllfile\shell\Open с OllyDbg\command

OllyDbg может производить отладку консольных приложений (на основе текста).

OllyDbg не может отлаживать .NET приложений. .NET программы состоят из псевдокода, который Windows интерпретирует или собирает «на лету» в родные '86 команды.

Заметьте, что, если Вы используете Windows NT, 2000 или XP, Вам, вероятно, придется иметь права администратора, чтобы отлаживать программы.

Брейкпоинты (контрольные точки)

OllyDbg поддерживает несколько видов брэйкпоинтов:

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

- Условный брейкпоинт (Shift+F2 ) - обычный INT3 брейкпоинт со связанным условием. Когда Отладчик сталкивается с этим брейкпоинтом, он оценивает условие и если результат отличен от нуля, или условие недопустимо, останавливает отлаживаемую программу. Однако, вероятность переполнения, вызванного неправильным условным брейкпоинтом очень высока (главным образом из-за времени ожидания операционной системы). На PII 450 под Windows NT OllyDbg обрабатывает до 2500 ложных условных брейкпоинтов в секунду. Важный случай условного брейкпоинта - остановка на сообщениях Windows (подобно WM_PAINT). Для этой цели Вы можете использовать псевдопеременную MSG вместе с надлежащей интерпретацией параметров. Если окно активно, смотрите брейкпоинт сообщения, описанный ниже.

- Условный Брейкпоинт с записью (Shift+F4 ) - условный брейкпоинт с возможностью регистрации значения некоторого выражения или параметров известной функции каждый раз, когда срабатывает брейкпоинт или когда выполняется установленное условие. Например, Вы можете установить брейкпоинт с записью на некоторую оконную процедуру, чтобы регистрировать все вызовы этой процедуры (CALL), или только идентификаторы полученных WM_COMMAND сообщений, или установить его на вызов CreateFile и записать названия файлов, открытых только для чтения и т.д. Брейкпоинт с записью (logging breakpoint) такой же быстрый как и Брейкпоинт с условием (сonditional breakpoint), и конечно намного легче просмотреть несколько сотен сообщений в окне журнала, чем нажимать F9 несколько сотен раз. Таким образом, Вы можете выбрать более подходящую интерпретацию для вашего условия.

Вы можете устанавливать счетчик проходов - счетчик, который уменьшается каждый раз, когда выполняется условие остановки. Если счетчик прохода перед уменьшением не равен нулю, OllyDbg продолжит выполнение. Рассмотрим цикл (loop), который выполняется 100. (десятичное число) раз. Поставим брейкпоинт в середине и установим значение 99. (Десятичное число). OllyDbg прервётся на последней итерации.

В дополнение, условный брейкпоинт с записью (conditional logging breakpoint) позволяет Вам передать одну или несколько команд плагинам. Например, это может быть запрос к плагину командной строки, чтобы изменить содержимое регистра и продолжить.

- Брейкпоинт сообщения - то же самое, что и брейкпоинт с условием записи, за исключением того, что OllyDbg автоматически генерирует условие, позволяющее прерваться на некотором сообщении (подобно WM_PAINT) на точке входа к процедуре окна. Вы можете установить его в окне Windows.

- Трассировочный брейкпоинт (Trace breakpoint) - критический случай INT3 брейкпоинтов устанавливаемых на каждой указанной команде. Если Вы производите пошаговую трассировку (hit trace, брейкпоинт будет удален, а адрес, будет помечен как пройденный, после того, как будет достигнута команда. Если Вы используете обычную трассировку (run trace), OllyDbg добавит запись в журнал трассировки, а брейкпоинт останется активным.

- Брейкпоинт на Память . OllyDbg позволяет установку только одного брейкпоинта на память. Вы выбираете некоторую часть памяти в панелях Дизассемблер или Дамп в окне CPU и используете контекстное меню, чтобы установить брейкпоинт на память. Предыдущий брейкпоинт на память, если он был, будет автоматически удалён. У вас есть две доступные опции: прерваться на доступе к памяти (чтение, запись, или выполнение в памяти) или только на записи . Чтобы установить этот брейкпоинт, OllyDbg изменяет аттрибуты блоков памяти, содержащих выделение. На 80x86-совместимых процессорах память распределена и защищена в блоках по 4096 байт. Если Вы выбираете даже отдельный байт, OllyDbg должен будет защитить целый блок. Это может привести к возникновению множества ложных тревог с огромным переполнением. Используйте этот вид брейкпоинта с осторожностью. Некоторые системные функции (особенно под Windows 95/98) приводят к зависанию отлаживаемой программы вместо генерации события отладки при доступе к защищенной памяти.

- Аппаратный брейкпоинт (доступен только под Windows МЕ, NT, 2000 или XP). 80x86-совместимые процессоры позволяют Вам установить 4 аппаратных брейкпоинта. В отличие от брейкпоинта на память, аппаратные брэйкпоинты не замедляют скорость выполнения, но охватывают только до 4 байт. OllyDbg может использовать аппаратные брейкпоинты вместо INT3 при выполнении или сканировании кода.

- Однократное прерывание на доступе к памяти (Single-shot break on memory access) (доступно только под Windows NT, 2000 и XP). Вы устанавливаете его в окне Память на целом блоке памяти из контекстного меню или, нажимая F2 . Этот брейкпоинт особенно полезен, если Вы хотите поймать вызов или возвращение к некоторому модулю. После того, как выполняется остановка, брейкпоинт удаляется.

- Остановка обычной трассировки (Run trace pause) (Ctrl+T ) - установка условий, которые проверяются на каждом шаге процесса трассировки (run trace). Вы можете остановить трассировку (run trace), если EIP входит в некоторый диапазон или покидает другой диапазон, или некоторое условие истинно, или когда команда соответствует одному из указанных образцов, или когда команда является подозрительной, или после того, как прослежено указанное число команд. Обратите внимание, что эта опция может значительно (до 20 замедлять скорость трассировки (run trace) .

OllyDbg может также останавливать выполнение программы на некоторых событиях отладки, подобно загрузке или выгрузке DLL, запуску или уничтожению потока, или когда программа посылает отладочную строку (debugstring).

Дамп

Окно Дампа отображает содержимое памяти или файла. Вы можете выбирать один из нескольких определенных форматов: byte, text, integer, float, address, disassembly or PE Header.

Все окна дампа поддерживают резервное копирование, поиск и функции редактирования. Область окна Дампа окна CPU позволяет Вам определять метки, устанавливать брейкпоинты на памяти, находить ссылкик данным в выполняемом коде и открытом изображении выбранной памяти в исполняемом файле (.exe или .dll). Меню Дампаотображает только относительный набор доступных команд.

Если доступно резервное копирование, нажмите Address/Backup в панели, чтобы переключить режим отображения между резервным копированием и нормальным видом. Другие кнопки на панели позволяют Вам изменять режимы дампа.

Подобно окну Дизассемблер, Дамп сохраняет длинную историю посещенных местоположений памяти. Вы можете передвигаться по истории нажимая кнопки ' + ' или ' - '.

Чтобы листать данные, удерживайте клавишу Ctrl , и нажимайте стрелки Up/Down .

Модули

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

Actualize - заново сканирует модули и убирает подсветку из новых модулей. В большинстве случаев, OllyDbg заботится о себе.

View memory (Просмотреть память) - открывает окно Памяти и прокручивает его к первому блоку памяти, принадлежащему отображаемому модулю.

View code in CPU (Просмотр Кода в CPU) - открывает выполняемый код модуля в Дизассемблере.

Follow entry (Перейти ко входу) - следует за точкой входа в модуль в Дизассемблере

Dump data in CPU (Данные Дампа в CPU) - открывает раздел данных модуля в Дампе CPU.

View names (Просмотр названий) (Ctrl+N) - отображает таблицу, содержащую все имена (экспорт, импорт, библиотека, определяемые пользователем) определяемые или используемые в текущем модуле.

Mark as system DLL (Пометить как системный DLL), Mark as non-system DLL (Пометить как не-системный DLL) - отмечает выбранный модуль как системный или несистемный. Отмечая модуль как системный Вы исключаете его из Трассировки, значительно ускоряя его выполнение. По умолчанию, системные модули - модули, которые постоянно находятся в системном каталоге (обычно c:\windows\system на Windows 95/98, c:\winnt\system32 в NT/2000/XP).

Update .udd file now (Обновить .udd файл сейчас) - запишет, все зависимые от данного модуля данные в файл <modulename> .udd. .udd файлы сохраняют брейкпоинты, метки, комментарии, наблюдатели, анализ и так далее в перерывах между сеансами отладки. OllyDbg автоматически создает .udd файл, когда модуль выгружается.

View executable file (Просмотреть исполняемый файл) - отображает дамп исполняемого файла.

View all resources (Просмотреть все ресурсы) - отображает список всех ресурсов, определенных в модуле вместе с краткой информацией. OllyDbg не поддерживает ресурсы как отдельный объект; все, что Вы можете сделать это сдампить ресурс и отредактировать его в бинарном виде.

View resource strings (Просмотреть строковые ресурсы) - отображает список строковых ресурсов и их идентификаторы.

View run trace profile (Просмотреть профиль трассировки) - вычисляет профиль для этого модуля. См. также Run trace (Прямая трассировка).

Analyze all modules (Анализировать все модули) - позволяет анализироватьвсе модули сразу. Анализ извлекает полезную информацию из загруженного кода; отладка обычно проходит быстрее и намного надежнее, когда код проанализирован. Сделав двойной клик на строке, Вы перейдёте к выполняемому в модуле коду в панели Дизассемблера.

Карта памяти

Окно карты Памяти отображает все блоки памяти, используемые отлаживаемой программой. Нет никаких стандартных средств, чтобы выполнить эту задачу, так что может случиться, что OllyDbg объединит несколько частей распределенной памяти в одном большом блоке памяти. Однако в большинстве случаев нет необходимости в точной разрешающей способности. Чтобы получить список блоков памяти, запрашиваемых приложением через вызовы к GlobalAlloc (), LocalAlloc () и т.д., используйте Heap list.

Если блок памяти - секция некоторого выполняемого модуля, OllyDbg сообщит, какой вид данных этот блок содержит: код, данные, ресурсы и т.д.

Есть некоторые различия между Windows 95/98 и Windows NT/2000. Под Windows 95/98, OllyDbg не способен показать названия отображаемых файлов. Также, Windows 95/98 ограничивает разрешённые типы доступа к памяти: на чтение и на запись. Примите во внимание также, что Windows NT/2000 имеют намного более широкую палитру возможностей, включая доступ на выполнение, copy-on-write и флаг защиты. OllyDbg игнорирует атрибут copy-on-write.

Если OllyDbg распознает, что программа распределила новый или перераспределила существующий блок памяти, то OllyDbg выделяет соответствующую запись в окне карты памяти. Чтобы сбросить всю подсветку, выберите Actualize (Обновить) в контекстном меню.

Вы можете вызывать окно Память, нажав Alt+M .

Доступны следующие пункты контекстного меню:

Actualize (Обновить) - обновляет список распределенной памяти и удаляет выделение из новых блоков памяти.

View in Disassembler (Просмотреть в Дизассемблере) - открывает блок памяти в Дизассемблере. Эта опция доступна, только когда блок памяти содержит выполняемый код или самораспаковщик некоторого модуля.

Dump в CPU (Дамп в окне CPU) - отображает содержимое блока памяти в области окна Дампа CPU.

Dump (Дамп) - дамп содержимого блока памяти в отдельном окне. Если тип блока памяти известен, OllyDbg автоматически выбирает формат дампа.

View all resources (Просмотреть все ресурсы) - если блок содержит данные ресурсов, список всех ресурсов и связанные данные. OllyDbg не поддерживает ресурсы как отдельный объект; все, что Вы можете сделать с ресурсами, это сдампить и отредактировать в двоичном формате.

View resource strings (Просмотр ресурсных строк) - если блок содержит данные ресурсов, то Олли перечисляет все строки ресурсов с их идентификаторами.

Search (Поиск) - позволяет Вам просматривать все блоки памяти, начиная с выделенного, до того как будет встречена бинарная строка. Если строка найдена, OllyDbg показывает дамп найденного блока памяти. Карта Памяти и окно дампа совместно используют один и тот же образец поиска, поэтому Вы можете немедленно продолжить поиск до следующего возникновения в появляющемся дампе. Вы можете закрыть окно дампа, нажав Esc.

Search next (Искать далее) (Ctrl+L ) - повторяет последний произведённый поиск.

Set break-on-access (Установить прерывание на доступе) (F2 ; доступно только под Windows NT/2000) - защищает целый блок памяти. После брейкпоинта, OllyDbg останавливает отлаживаемую программу и удаляет брейкпоинт. Этот брейкпоинт особенно полезен, если Вы хотите поймать вызов или возврат к некоторому модулю.

Remove break-on-access (Удалить прерывание на доступе) (F2 ) - удаляет установленное прерывание-на-доступ из блока памяти.

Set memory breakpoint on access (Установить брейкпоинт на доступ к памяти) - устанавливает брейкпоинт на память на целом блоке памяти. Программа будет прерываться каждый раз при обращении отлаживаемой программы к этому блоку памяти. OllyDbg поддерживает только один брейкпоинт на память. Под Windows 95/98, отлаживаемая программа может зависнуть, когда системные подпрограммы обращаются к блокам памяти, содержащим брейкпоинт. Используйте его в крайнем случае.

Set memory breakpoint on write (Установить брейкпоинт на запись в память) - устанавливает брейкпоинт на целом блоке памяти. Программа будет прерываться каждый раз, когда будет записывать в этот блок памяти. Под Windows 95/98, отлаживаемая программа может зависнуть, когда системные подпрограммы обращаются к блокам памяти, содержащим брейкпоинт. Используйте его в крайнем случае.

Remove SFX memory breakpoint (Удалить SFX брейкпоинт на память) - останавливает поиск на реальной точке входа в запакованную программу (SFX). Этот поиск использует брейкпоинт на память специального типа.

Set access (Установить доступ) - устанавливает желаемый атрибут защиты памяти на целый блок памяти. Возможные опции:

No access (нет доступа) Read only (Только чтение) Read / write (Чтение/Запись) Execute (Выполнение) Execute / read (Выполнение/Чтение)

Full access (Полный доступ)

Копировать в буфер обмена

Целую строку - копирует выбранную запись в буфер обмена как многострочный текст с пояснениями. Чтобы исключить какой-либо столбец из копирования, уменьшите его ширину до минимума (оставшаяся часть столбца станет серой).

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

Наблюдатели и инспекторы

Окно Наблюдателя содержит несколько выражений. Оно отображает их значения во втором столбце. OllyDbg сохраняет выражения в .udd файл главного модуля, так что они будут доступны при следующем сеансе отладки.

Инспектор - автономное окно, которое может показывать содержание некоторой переменной, 1- или 2-мерного массива или даже выбранные элементы массива структур. Выражение в основном то же самое, как у Наблюдателя, но может включать два параметра: %A и %B. Когда Вы устанавливаете Инспектор, Вы можете определить пределы для этих параметров. OllyDbg тогда просчитывает все возможные комбинации %A и %B в выражение, начинающееся от 0 и до предела (не включая), и отображает результаты в таблице. Предел для %B (число столбцов) не может превышать 16.

Стек вызовов

Окно "Стек вызовов" (клавиша Alt+K ) делает попытку отследить последовательность вызовов в стеке выбранного потока и отображает его, вместе с известными или предложенными параметрами вызываемых функций. Эта задача проста, когда вызываемые функции создают стандартные фреймы стека (PUSH EBP; MOV EBP,ESP). Современные оптимизирующие компиляторы не беспокоятся о фреймах стека, поэтому OllyDbg использует различные уловки. Например, OllyDbg пробует прослеживать код к следующему возврату и рассчитывает все push, pop или изменения ESP. Если это не помогает, OllyDbg предпринимает более опасный и отнимающий много времени подход: OllyDbg просматривает стек, пытаясь найти все возможные адреса возврата и проверок, в которых функция вызывалась соответствующим оператором, включая проанализированные команды. Есть также другая, довольно сомнительная эвристика. Просмотр стека может быть действительно медленным. OllyDbg производит его, только если окно "Стек вызовов" открыто.

Окно "Стек вызовов" содержит 5 столбцов: Address, Stack, Procedure, Called from, Frame .

Столбец Address содержит адрес в стеке, Stack отображает значение соответствующего адреса возврата или параметра.

Procedure (или Procedure / arguments ) - отображает то место, где окно Стек вызовов располагает в стек адрес вызываемой функции. В некоторых случаях OllyDbg не уверен, является ли этот адрес правильным и добавляет один из следующих маркеров:

? Найденная точка входа - не надежна

Maybe OllyDbg не смог найти надежную точка входа, найденный адрес необходимо проверить, используя эвристику

Includes OllyDbg, не смог найти точку входа и только знает, что эта процедура включает отображаемый адрес

Нажимая кнопку на панели или выбирая «Hide/Show arguments» («Скрыть/показать параметры») в меню, Вы можете включать или выключать параметры функций.

Called from это адрес команды, которая вызывается этой процедурой. Последний столбец, Frame , по умолчанию скрыт и отображает значение указателя фрейма (регистр EBP), если он известен.

Просматривать стек надежнее и значительно быстрее, когда все вызываемые функции проанализированы.

Дерево вызовов

Дерево вызовов (CALL) (клавиша Ctrl+K в Дизассемблере) использует результаты анализа, чтобы подготовить список функций, вызываемых данной процедурой, непосредственно или косвенно, и список всех известных вызовов данной функции. Побочный эффект - распознает, является ли выбранная процедура явно рекурсивной. 'Явно' означает, что она не может прослеживать запросы с неизвестным адресом, подобно CALL EAX. Если процедура совершает неизвестные вызовы, "Дерево вызовов" добавляет маркеры " Unknown destination(s)" (Неизвестный адрес(а)).

Некоторые из вызываемых функций комментируются одним из следующих слов:

Leaf Не вызывает никакие другие функции Pure Не вызывает никаких функций, не имеет никаких побочных эффектов RETN Состоит из единственной команды RETN Sys Функция в системном DLL. По определению, системный DLL - DLL, постоянно находящийся в системном каталоге

Чтобы пройтись по "Дереву вызовов", сделайте двойной щелчок по адресу в "Called from" или столбцу "Calls/Calls directly". Окно "Дерево вызовов" сохраняет историю ваших действий (клавиши ' - ' и ' + ').

Если отлаживаемая программа состоит из нескольких модулей, я рекомендую проанализировать все эти модули. "Дерево вызовов" не пытается обрабатывать системные функции.

Самоизвлекающиеся (SFX) файлы

SFX файл состоит из распаковщика и упакованной оригинальной программы. При исследовании запакованных файлов Вы обычно хотите пропустить упаковщик и остановиться на точке входа в программу ("реальный вход"). OllyDbg содержит несколько функций, которые облегчают эту задачу.

Обычно распаковщик загружается в адреса, которые находятся вне раздела первоначальной программы. В этом случае OllyDbg распознает файл как SFX.

Когда SFX опция требует трассировки реального входа, OllyDbg устанавливает брейкпоинт на память на всей секции кода. Обычно он пуст или содержит сжатые данные. Когда программа пытается выполнить некоторую команду в пределах защищенной области, которая не является ни RET, ни JMP, OllyDbg сообщает о реальном входе. Таким образом и работает побайтное извлечение.

Этот метод очень медленный. Есть другой, более быстрый метод. Каждый раз, когда происходит исключение при чтении данных, OllyDbg производит чтение из этого 4K блока памяти, и отключает предыдущее окно чтения. На каждом исключении записи данных (data write exception) он разрешает запись в этот блок и запрещает запись в предыдущий. Когда программа выполняет команды в незащищенной области, OllyDbg сообщает о реальном входе. Однако, если реальный вход - внутри окна чтения или записи, его местоположение будет сообщено неправильно.

Вы можете исправить адрес входа вручную. Выберите новый адрес входа и в контекстном меню окна Дизассемблер выберите Breakpoint-> Set real SFX entry here(Брэйкпоинт->Установить реальный SFXвход здесь). Если соответствующая опция SFX включена, в следующий раз OllyDbg пропустит распаковщик быстро и надежно.

Вы идёте по отлаживаемой программе, нажимая F7 (шаг с вхождением) или F8 (шаг с обходом). Главное различие между этими методами - то, что, если текущая команда выполняет вызов (CALL) некоторой функции, F7 войдёт в функцию и остановится на ее первой команде, в то время как F8 будет сразу пробовать выполнить функцию. Если Вы обходите некоторую функцию, любой брейкпоинт, или случай отладки находящийся в пределах функции, приостановит выполнение основной программы, но временный брейкпоинт после вызова процедуры останется активным, и Вы дойдете до него рано или поздно.

Если отлаживаемая программа останавливается на исключении, Вы можете передать это исключение в обработчик, установленный с отлаженной программой. Просто нажмите Shift вместе с любой командой продвижения.

Вместо нажатия F7 или F8 несколько сотен раз, Вы можете использовать анимацию (Ctrl+F7 или Ctrl+F8 ). В этом случае, OllyDbg автоматически повторяет F7 или F8 после того, как предыдущий шаг закончен, и все окна модифицированы. Процесс останавливается когда:

  • Вы нажимёте Esc или запустите любую другую команду продвижения, или
  • OllyDbg встретит установленный ранее брейкпоинт, или
  • Отлаживаемая программа произведёт исключение.

Используя Клавиши "+ " и "- " , Вы можете отмотать назад историю выполнения.

Обратите внимание, что OllyDbg прорисовывает большинство окон, каждый раз, когда выполнение приостанавливается. Если анимация, окажется, очень медленной, попробуйте закрыть или, по крайней мере, свернуть все неиспользуемые окна.

Другой, более быстрый путь для обратной трассировки (backtrace) выполнения программы - Run trace. В этом случае OllyDbg создает протокол выполнения и сообщает Вам, когда и сколько раз данная команда была выполнена.

Пошаговая трассировка

Пошаговая трассировка дает Вам возможность отметить, какие части кода были выполнены, а какие нет. Метод, осуществленный в OllyDbg довольно прост. Он устанавливает INT3 брейкпоинт на каждой команде в пределах указанной области. Когда брейкпоинт выполняется, OllyDbg удаляет его и помечает команду как пройденную. Поскольку каждый брейкпоинт трассировки выполняетcя только однажды, этот метод очень быстр.

При использовании пошаговой трассировки, должны быть приняты меры предосторожности, чтобы не установить брейкпоинт на данных, поскольку приложение в этом случае допустит ошибку. По этой причине, Вы должны проанализировать код, чтобы активизировать соответствующие опции меню. Я рекомендую, чтобы Вы выбрали строгое или эвристическое распознавание процедур. Нечеткая опция слишком терпима к ошибкам и часто находит несуществующие процедуры.

Когда Вы устанавливаете брейкпоинт трассировки даже на отдельной команде в пределах модуля, OllyDbg устанавливает буфер трассировки вдвое большего размера по сравнению с разделом кода.

Обратите внимание, что, когда Вы удаляете данные пошаговой трассировки, Вы одновременно удаляете и принудительный запуск трассировки.

Прямая трассировка

Прямая трассировка - способ обратного выполнения программы, который необходим в некоторых случаях. Вы можете также использовать прямую трассировку для простого профилирования. В основном, OllyDbg выполняет отлаживаемую программу пошагово, подобно анимации , но не изменяет окна и - что наиболее важно - сохраняет адреса, содержимое регистров, сообщений и известных операндов в буфере трассировки. Если отлаживаемый код самоизменяющийся, Вы можете сохранить первоначальные команды. Запустите прямую трассировку, нажав Ctrl+F11 (трассировка с входом) или Ctrl+F12 (трассировка с обходом). Остановка трассировки - клавиши F12 или Esc .

Вы можете определить набор условий, которые проверяются на каждом шаге выполнения прямой трассировки (горячая клавиша: Ctrl+T ). Прямая трассировка останавливается, когда встречает какое-либо условие. Условия включают:

  • Остановиться, когда EIP находится в диапазоне адресов;
  • Остановиться, когда EIP вне диапазона адресов;
  • Остановиться, когда истинно какое-либо условие;
  • Остановиться, когда данная команда вызывает подозрение, т. е. потенциально недопустима (согласно набору правил в Анализе 3), доступ к несуществующему участку памяти, устанавливает одношаговый флаг ловушки или обращается к стеку вне фактического ESP. Заметьте, что эта опция может значительно (до 20 замедлить скорость выполнения трассировки;
  • Остановиться после прохода указанного числа команд (более точно, после добавления в буфер трассировки). Обратите внимание, что счетчик не делает автоматического перезапуска. То есть, если Вы устанавливаете счет команд до 10, трассировка будет приостановлена один раз после того, как выполнены 10 команд, а не на каждой 10-ой команде.
  • Остановиться, когда следующая команда соответствует одному из указанных образцов. Вы можете использовать неточные команды и операнды и соответствие 32 битным регистрам RA и RB. Подобно R32, они заменяют любой 32-битный регистр общего назначения, но имеют те же самые значения в пределах команд. RA и RB в этом случае должны быть различны. Например, в программе, которая состоит из XOR EAX, EAX; XOR ESI, EDX, образец XOR R32, R32 соответствует обеим командам; XOR RA, RA соответствует только первому, и образец XOR RA, RB соответствует только XOR ESI, EDX.

Конечно, прямая трассировка требует много памяти, в среднем от 16 до 35 байт на команду в зависимости от режима, и выполняется очень медленно. На процессоре 500 MHz под Windows NT этот процесс может трассировать до 5000 команд в секунду. Под Windows 95 медленнее: только 2200 команд в секунду. Но во многих случаях, например, когда в программе есть переходы к несуществующему адресу, это единственный способ найти решение проблемы. Вы можете исключить квазилинейные последовательности команд (с единственным выходом в конце последовательности) из процесса прямой трассировки. Когда OllyDbg сталкивается с исключенной последовательностью, то OllyDbg устанавливает временный брейкпоинт на команде, которая немедленно следует за исключенным блоком и выполняет его сразу. Конечно, любое возвращение или переход к внешнему коду делают правильное рассмотрение невозможным, поэтому OllyDbg проверяет часть кода, которую Вы хотите исключить, и в трудных случаях спрашивает у Вас подтверждение.

В большинстве случаев Вам нет необходимости трассировать системный API код. Опция "Always trace over system DLLs" позволяет Вам трассировать без вхождения в функциональные API при трассировке и анимации с вхождением. OllyDbg предполагает, что модуль системный, если он постоянно находится в системной папке. В окне Modules (Модули) Вы можете отметить любую библиотеку как системную или несистемную.

Чтобы сделать выполнение быстрее, Вы можете ограничить процедуру прямой трассировки выбранными командами или частями кода, устанавливая брейкпоинты на запуск трассировки и запуская программу. Я называю это «forced run trace» (принудительный запуск трассировки). В основном, брейкпоинты на трассировку - это неудаляемые брейкпоинты пошаговой трассировки. Если Вы удаляете пошаговую трассировку, Вы одновременно удаляете и прямую трассировку.

Команды трассировки, упомянутые в начале этого раздела автоматически открывают буфер трассировки. Вы можете определить его размер (до 64 МБ) в Опциях. Этот буфер круговой и, когда он заполняется, переписываются самые старые записи.

Вы можете открыть или очистить буфер прямой трассировки, выбрав «Debug -> Open or clear run trace» (Отладка -> Открыть или очистить буфер трассировки) из главного меню OllyDbg. После того как буфер трассировки открыт, OllyDbg зарегистрирует все паузы в выполнении, даже те, которые не были вызваны прямой трассировкой. Например, Вы можете идти по программе, нажимая F7 или F8 , а затем обратно проходить код, используя клавиши Плюс и Минус . Заметьте, что эти клавиши просматривают историю, когда буфер трассировки закрыт. Если Вы проходите программу с помощью трассировки, Регистры, и Информационные области окна становятся серыми, подчеркивая, что данные регистров, которые они отображают - не фактические. Буфер трассировки не сохраняет вершину стека или содержимое памяти, используемое регистрами. Регистры, Информация и Стек используют фактическое состояние памяти , чтобы интерпретировать регистры из буфера трассировки.

OllyDbg может посчитать, сколько раз каждая команда появляется в буфере прямой трассировки. В окне Дизассемблер выберите «View -> Profile data» (Просмотр -> Профильные данные). Эта команда заменяет столбец Comments (Комментарий) столбцом Profile (Профиль). Или, если отображена панель, щёлкните её несколько раз, пока она не отобразит Profile information. Заметьте, что отображаемый счетчик - динамический и не подсчитывает старые команды, удалённые из буфера трассировки. Вы можете также рассматривать данные профиля для целого модуля, отсортированных несколькими нажатиями, в отдельном окне Profile

Специальная команда в окне Дизассемблера «Runtrace -> Add entries of all procedures» (Прямая трассировка -> Добавить все процедуры), позволяет проверить, насколько часто вызывается каждая распознанная процедура. Другая команда «Runtrace -> Add branches in procedure» (Прямая трассировка -> Добавить ветки в процедуре) принудительно трассирует все распознанные адресаты переходов в пределах процедуры. В этом случае, профиль позволяет находить наиболее часто выполняемые переходы и оптимизировать их для увеличения скорости.

Опция «Search for -> Last record in run trace» (Найти -> Последнюю запись в буфере трассировки) в контекстном меню окна Дизассемблер находит когда была выполнена, и была ли выполнена вообще, отмеченная команда в последний раз. Окно прямой трассировки отображает содержимое буфера трассировки. Для каждой команды существует определённое содержимое регистров, которые были изменены командой (более точно, изменились между записью в исходнике и обновленной). Если Вы сделаете двойной клик на некоторой команде, всплывающее окно выберет все ссылки на данную команду в буфере трассировки и Вы сможете быстро просмотреть их, нажимая клавиши Плюс или Минус . Если опция «Trace -> Synchronize CPUandRuntrace» (Трассировка -> Синхронизировать окно CPU и окно прямой трассировки) установлена, Дизассемблер перейдёт к окну прямой трассировки.

Заметьте, что, когда Вы удаляете пошаговую трассировку, Вы одновременно удаляете принудительную прямую трассировку.

webhamster.ru

Tapok & DiveSlip presents - ...:::Hack For Joy:::... OllyDbg

Tapok & DiveSlip presents - ...:::Hack For Joy:::... OllyDbg - альтернатива SoftICE

OllyDbg - альтернатива SoftICE

 

Пособие расчитано на новичков, которые сталкиваются с OllyDbg впервые.

Сайт разработчиков OllyDbgФорум для пользователей OllyDbg

Уверен, многие согласятся со мной в том, что SotfICE для нас - это стандарт de facto. Но сегодня я хотел бы познакомить вас с новым шедевром, популярность которого возрастает с каждым днем. За него не просят денег, его не нужно устанавливать. И он действительно хорош, хоть и требует доработки. Хорош настолько, что может заменить SoftICE. Пусть не во всем, но во многом... А имя ему - OllyDbg. Или просто Olly.

 

1. Что такое Olly? Olly - 32-битный отладчик для работы под Win9x, WinMe, WinNT, Win2k и WinXP. Он поддерживает все процессоры серии 80x86, Pentium, MMX, 3DNow!, включая расширения Athlon, SSE инструкции и соответствующие форматы данных. Возможно отображение данных в любом формате: HEX, ASCII, UNICODE, 16- и 32-битные знаковые/беззнаковые/шестнадцатиричные целые числа, 32/64/80-битные вещественные числа, адреса, дизассемблирование на MASM, IDEAL или HLA. OllyDbg может подключаться к уже запущенному процессу или создавать новый. Одна из примечательных особенностей отладчика - анализатор, который распознает процедуры и количество входных аргументов, циклы, таблицы, константы и строки, вызовы API функций и многое другое. Анализатор не является компиляторо-зависимым и одинаково хорошо работает со всеми РЕ-файлами. И это далеко не все...

2. Как работать с Olly? Вообще, отладчик сопровождается хорошим хелпом, в котором можно найти полное описание всех свойств, настроек, режимов работы отладчика и много чего еще. Так что переписывать его, думаю, не стоит. Однако факт написания мануала на английском языке может затруднить его понимание русскоязычным населением. Поэтому кое-какие основные моменты я не могу оставить без внимания.

Пройдемся по панели инструментов...

Первая слева кнопка - открыть исполняемый файл. Горячая клавиша: [ F3 ]. Затем идут "Перезагрузить файл - [Ctrl + F2 ]" (загружает последний открывавшийся файл) и "Закрыть файл - [ Alt + F2 ]".

Следом - пара кнопок "Выполнить - [ F9 ]" и "Пауза - [ F12 ]". С ними все должно быть понятно.

Далее по списку режимы трассировки:

Step in - [ F7 ] - исполняет одну команду за раз. При обработке вызова (call) передает управление (входит) в вызываемую подпрограмму, останавливаясь на первой команде в ней. Step over - [ F8 ] - также исполняет одну команду за раз, но при обработке вызовов старается выполнить подпрограмму за один шаг, не передавая ей управление. Но! Управление все же передается в подпрограмму, если на вызов установлена точка останова, или в ней генерируются исключительные ситуации (прерывания).

Чтобы не нажимать F7 или F8 сотни раз подряд, Olly предусматривает режим "анимации" (Animate) [ Ctrl + F7 ] или [ Ctrl + F8 ]. Это режим автоматического пошагового выполнения, т. е. команды выполняются одна за одной без необходимости тыкать на [ F7 ] или [ F8 ]. Анимация останавливается * при нажатии [ Esc ] * если встречается точка останова или исключение.

Trace into - [ Ctrl + F11 ] - режим похож на анимацию, только окна отладчика при этом не обновляются, и ведутся логи изменения регистров, памяти и т. п. Trace into выполняет процесс со входом в подпрограммы (как при step in) В окне Debugging Options -> Trace [ Alt + O ] можно изменить настройки режима трассировки Trace over - [ Ctrl + F12 ] - то же, что и trace into, но подпрограммы выполняются за один шаг, как при step over.

Execute till RET - [ Ctrl + F9 ] - выполнять программу до инструкции RET. В окне Debugging Options -> Trace [ Alt + O ] можно отметить пункт "After executing till RET, step over RET", чтобы останавливать выполнение программы на следующей за RET команде. Иначе останов будет осуществляться перед RET.

Далее идут кнопки, открывающие окошки с различной инфой (логи, подгружаемые модули, память процесса, ветви процесса, описатели, окна и т. д. и т. п.), с которыми мы будем знакомиться при появлении в этом необходимости. А сейчас перейдем к практической части.

 

Пример 1. Поиск регистрационного кода В качестве примера будем использовать (ry0's Crackme #3

Итак, приступим. Запускаем Olly, нажимаем [ F3 ] - открыть файл и открываем ccm_3.exe. Отладчик тормозит на точке входа в программу (первый стоп можно поставить также на системную точку останова или вход в процедуру окна. Эти параметры можно изменить в Options -> Debugging options -> Events):

00401000 6A 00 push 0 ; pModule = NULL 00401002 E8 3D040000 call <jmp.&kernel32.GetModuleHandleA> ; GetModuleHandleA 00401007 A3 00314000 mov dword ptr [403100], eax 0040100C 6A 00 push 0 ; lParam = NULL 0040100E 68 26104000 push 00401026 ; DlgProc = ccm_3.00401026 00401013 6A 00 push 0 ; hOwner = NULL 00401015 68 E8030000 push 3E8 ; pTemplate = 3E8 0040101A 50 push eax ; hInst 0040101B E8 D0030000 call <jmp.&user32.DialogBoxParamA> ; DialogBoxParamA 00401020 50 push eax ; ExitCode 00401021 E8 18040000 call <jmp.&kernel32.ExitProcess> ; ExitProcess 00401026 55 push ebp

Теперь жмем [ F9 ] - выполнить. Далее как обычно - вводим имя юзера (PowerUser) и серийник (654321), но на "Регистрировать" не давим. Возвращаемся в Olly и зажимаем [ Ctrl + N ]. Нам откроется окно "Names" - список всех импортируемых программой API функций. Ага, есть упоминание о GetDlgItemTextA. Ставим курсор на эту API функцию (клик левой), а затем вызываем popup-меню (клик правой). Устанавливаем точки останова (Set breakpoint on every reference). Точку останова также можно установить из командной строки (если установлен плагин CMDLINE.DLL). Для этого [ Alt + F1 ], а там уж как в SICE'е:

bpx GetDlgItemTextA [ввод]

Теперь в окне приложения (ccm_3.exe) клик по 'register'...

0040113A 6A 20 push 20 ; Count = 20 (32.) 0040113C 57 push edi ; Buffer 0040113D 68 EC030000 push 3EC ; ControlID = 3EC (1004.) 00401142 FF75 08 push [arg.1] ; hWnd 00401145 E8 DA020000 call <jmp.&user32.GetDlgItemTextA> ; GetDlgItemTextA 0040114A 85C0 test eax, eax 0040114C 75 04 jnz short 00401152 0040114E B0 01 mov al, 1 00401150 EB 08 jmp short 0040115A 00401152 FF75 08 push [arg.1] ; Arg1 00401155 E8 96010000 call 004012F0 ; ccm_3.004012F0 0040115A 50 push eax 0040115B FF75 08 push [arg.1] 0040115E E8 61020000 call 004013C4 00401163 EB 06 jmp short 0040116B 00401165 33C0 xor eax, eax 00401167 C9 leave 00401168 C2 1000 retn 10 0040116B B8 01000000 mov eax, 1 00401170 C9 leave 00401171 C2 1000 retn 10

Начинаем трассировку. [ F8 ] - для пошаговой трассировки - по одной команде за раз. Но! При выполнении вызовов (call), в случае если на него установлена точка останова или подпрограмма генерирует исключения, будет осуществляться передача управления в подпрограмму. Чтобы этого избежать, можно попробовать комбинацию [ Shift + F8 ]. Итак, [ Shift + F8 ] для выполнения call GetDlgItemTextA, а затем [ F8 ] для пошагового выполнения.

0040114A 85C0 test eax, eax 0040114C 75 04 jnz short 00401152 0040114E B0 01 mov al, 1 00401150 EB 08 jmp short 0040115A 00401152 FF75 08 push [arg.1] ; Arg1 00401155 E8 96010000 call 004012F0 ; ccm_3.004012F0

Буфер, адресуемый регистром EDI получает введенный юзером рег. код. Обратите внимание, что строка, на которую указывает регистр, отображается справа от его значения в окне регистров. Весьма удобно, согласитесь. Далее идет проверка, ввел ли пользователь этот код. Если ввел - выполняем процедуру ccm_3.004012F0 Посмотрим, что она из себя представляет. Чтобы передать управление в подпрограмму, давим [ F7 ].

004012F0 55 push ebp 004012F1 8BEC mov ebp, esp 004012F3 83C4 DC add esp, -24 004012F6 53 push ebx 004012F7 56 push esi 004012F8 8D5D DF lea ebx, dword ptr [ebp-21] 004012FB 6A 20 push 20 ; Count = 20 (32.) 004012FD 53 push ebx ; Buffer 004012FE 68 EB030000 push 3EB ; ControlID = 3EB (1003.) 00401303 FF75 08 push [arg.1] ; hWnd 00401306 E8 19010000 call <jmp.&user32.GetDlgItemTextA> ; GetDlgItemTextA 0040130B 85C0 test eax, eax 0040130D 75 07 jnz short 00401316 0040130F B8 01000000 mov eax, 1 00401314 EB 47 jmp short 0040135D 00401316 66:813F 5245 cmp word ptr [edi], 4552 0040131B 75 08 jnz short 00401325 0040131D 8A57 02 mov dl, byte ptr [edi+2] 00401320 80F2 2D xor dl, 2D 00401323 74 07 je short 0040132C

Так-так. Читаем имя юзера в буфер, адресуемый регистром EBX, и проверяем, введено ли это имя, или его впомине нет. А вот потом(!) проверяем, чтобы первые 3 символа ключа были не иначе как 'RE-'. Протрассировав до адреса :00401316 не торопитесь. Чтобы не повторять процесс заново, изменим серийник в памяти так, чтобы первыми символами были 'RE-', а не введенные нами. Для этого: 1. В окне регистров выделите значение регистра EDI (левым кликом), т. к. именно он указывает на введенный серийник. Затем правой кнопкой мыши и выберите 'Follow in Dump'. Или в окне кода выделите строку

00401316 66:813F 5245 cmp word ptr [edi], 4552

Потом правой кнопкой и выбирайте 'Follow in Dump -> Memory Address'. В окне данных покажется введенная строка:

0012FB13 36 35 34 33 32 31 00 D5 77 59 00 10 01 35 01 00 654321..wY...5.. 0012FB23 00 D6 0C 01 E1 40 03 01 00 01 00 00 00 5F 3A D4 [email protected]_:.

Выделите 3 первых байта (36h, 35h, 34h) и жмите [Ctrl + E] - откроется окно редактирования данных. Изменяем '654' на 'RE-' и продолжаем трассировку. В некоторых ситуациях можно просто изменить значение флага. Для этого необходимо дважды щелкнуть по цифре справа от нужного флага в окне регистров.

0040132C 33F6 xor esi, esi 0040132E BA 01000000 mov edx, 1 00401333 8BCB mov ecx, ebx 00401335 0FB64C0A FF movzx ecx, byte ptr [edx+ecx-1] 0040133A 8D3431 lea esi, dword ptr [ecx+esi] 0040133D 42 inc edx 0040133E 48 dec eax 0040133F 75 F2 jnz short 00401333 00401341 8BC6 mov eax, esi 00401343 69C0 66060000 imul eax, eax, 666 00401349 35 EFBEADDE xor eax, DEADBEEF 0040134E C1C8 03 ror eax, 3

Это есть генерация серийника.

00401351 53 push ebx 00401352 50 push eax 00401353 E8 0B000000 call 00401363

А теперь переводим DWORD-число из EAX в ASCII-строку.

0040139A 57 push edi 0040139B 56 push esi 0040139C 53 push ebx 0040139D 8BF0 mov esi, eax 0040139F 8BD8 mov ebx, eax 004013A1 46 inc esi 004013A2 8A06 mov al, byte ptr [esi] 004013A4 3C 00 cmp al, 0 004013A6 75 F9 jnz short 004013A1 004013A8 B8 02000000 mov eax, 2 004013AD 8A57 03 mov dl, byte ptr [edi+3] 004013B0 8A4E FF mov cl, byte ptr [esi-1] 004013B3 32D1 xor dl, cl 004013B5 75 09 jnz short 004013C0 004013B7 47 inc edi 004013B8 4E dec esi 004013B9 3BF3 cmp esi, ebx 004013BB 7F F0 jg short 004013AD 004013BD 8D40 01 lea eax, dword ptr [eax+1] 004013C0 5B pop ebx 004013C1 5E pop esi 004013C2 5F pop edi 004013C3 C3 retn

Здесь происходит проверка полученной строки с регистрационным кодом пользователя, начиная с четвертого символа. И проверка производится по диагонали, т. о. последний символ полученной строки будет четвертым символом серийника, предпоследний - пятым и т. д. В итоге мы имеем правильный ключ: Name: PowerUser Code: RE-C0857DBF

Пример 2. Пропатчивание В качестве примера юзаем тот же (ry0's Crackme #3

Будем удалять nag-экран, который появляется при запуске ccm_3.exe. Итак, открываем .EXE-шник в Olly. Затем в окне кода щелкаем правой кнопкой мыши. В появившемся popup-меню выберите Search for -> All referenced text strings Ага, вот они, все строчечки:

00401082 push 0040311F ASCII "Trial Version" 00401087 push 004030F9 ASCII "Register your copy of program, please" 00401192 push 00403000 ASCII "(ry0's Crackme #3" 004011A4 push 00403012 ASCII "Protection: Name - Serial... 00401234 push 004030C8 ASCII "http://www.cydem.org.ua" 00401239 push 004030C3 ASCII "open" 0040125B push 004030E0 ASCII "mailto:[email protected]" 00401260 push 004030C3 ASCII "open" 004013D2 mov edx, 00403067 ASCII "Try to enter Name and Code first" 004013DF mov edx, 00403096 ASCII "Still unregistered." 004013EC mov edx, 004030AA ASCII "At last! Registered now." 004013FA push 00403088 ASCII "Registration."

Теперь двойной щелк по нужной строке - и мы снова в окне кода, но уже на том месте, откуда к этой строке идет обращение:

00401066 68 80000000 push 80 0040106B FF75 08 push [arg.1] 0040106E E8 D5030000 call <jmp.&user32.SendMessageA> 00401073 803D 2D314000 01 cmp byte ptr [40312D], 1 0040107A 0F84 EB000000 je 0040116B 00401080 6A 00 push 0 00401082 68 1F314000 push 0040311F 00401087 68 F9304000 push 004030F9 0040108C FF75 08 push [arg.1] 0040108F E8 AE030000 call <jmp.&user32.MessageBoxA> 00401094 E9 D2000000 jmp 0040116B

Немного выше видим проверку истинности байта по адресу :40312D. Если ИСТИННО - перейти куда-то, если ЛОЖНО - показать MessageBox. Все предельно понятно. Нужно изменить 'je 0040116B' на 'jmp 0040116B'. Для этого - двойной клик по строке

0040107A 0F84 EB000000 je 0040116B

В появившемся окне меняем 'je' на 'jmp' и отмечаем "Fill with NOP's". Давим 'Assemble'. Все. Можно проверить работу, запустив ccm_3 на выполнение [ F9 ]. Работает! (Однако будьте осторожны и при пропатчивании следите за тем, чтобы длина новой команды не превышала длины изменяемой.)

Но мы пропатчили лишь память процесса, а не сам исполняемый файл. И внесенные изменения теперь надо сохранить. Правый клик мышой и выбираем "Copy to executable -> All modifications". Olly еще поспрашивает, действительно ли стоит сохранять все изменения и под каким именем писать новый файл. После этого можно закрыть отладчик и проверить, что мы намутили... Все идеально!!! И очень просто.

Автор: (ry0 12.10.2003 P.S. Большое спасибо (ry0 за отличную статью и разрешение разместить ее на нашем сайте.

Copyright © 2002-2004 hack4joy

 

hack4joy.narod.ru

Введение в крэкинг с нуля, используя OllyDbg - Глава 6

Введение в крэкинг с нуля, используя OllyDbg - Глава 6 — Архив WASM.RU

СРАВНЕНИЯ И УСЛОВНЫЕ ПЕРЕХОДЫ

Как правило, у инструкции сравнения есть два операнда, а результатом этого сравнения является решение, должна или нет программа совершать переход, указанный далее в коде.

Мы узнаем, что когда программа просит у нас серийный номер для регистрации, то в этот момент она должна решить, правилен он или нет, а для этого ей нужно провести одно или более сравнений и совершить соответствующие результаты перехода.

Далее мы рассмотрим подробно, как работают сравнение и переход.

Также мы узнаем, что, согласно изученному нами в предыдущих версиях данного «Введения...», когда в зависимости от результата выполнения инструкции меняются те или иные флаги, наиболее частым случаем является ноль в флаге Z. Также мы рассмотрим другие изменения во флагах, связанных с выполнениями тех или иных инструкций.

CMP

Это наиболее известная инструкция сравнения. Она принимает два операнда и, на самом деле, работает также как и SUB, только не сохраняет результат в первый операнд. В обоих из них остаётся то же значение, что и прежде, а изменяются только флаги согласно результату.

Рассмотрим пример:

Пусть EAX и ECX равны, они будут вычтены друг из друга, значение их не изменится, но результатом операции станет то, что активируется флаг Z. Рассмотрим пример в OllyDbg.

Вводим инструкцию и модифицируем EAX и ECX так, чтобы они были равны.

Нажимаем F7 и видим, что значения EAX и ECX не изменились, но зато стал активным флаг Z, так как результатом вычитания одного операнда от другого был ноль, хотя мы и не можем увидеть его напрямую или сохранить куда-либо.

В реальности нам не важен точный результат вычитания, а только равен ли EAX ECX’у или нет (что чаще).

Хотя мы ещё и не дошли до самих условных переходов, есть две возможности: согласно значению флагов решить, делать переход или не делать. Самый понятный пример, который работает в сочетании с предыдущим – это инструкция JZ, которая совершает переход, если флаг Z активен, т.е. равен ЕДИНИЦЕ, и не совершает, если он не активен, т.е. равен НУЛЮ.

Таким же образом программа может вынести решение относительно двух серийных номеров, один из которых интересует вас на предмет регистрации программы и содержится, скажем, в EAX, а второй находится в EAX и является правильным серийным номером. Программа может определить с помощью CMP, являются ли они равными, и если да (флаг Z будет активным), совершить переход с помощью JZ в ту область, где происходит регистрация. А если введённый вами серийный номер, находящийся в EAX, и правильный в ECX окажутся не равны, то флаг Z будет содержать НОЛЬ, и, соответственно, никакого перехода не произойдёт.

Давайте рассмотрим более конкретные примеры условных переходов.

Точно так же флаг S или флаг знака предоставляет возможность сравнения, является ли первый операнд больше второго или наоборот.

Рассмотрим пример.

Повторим «CMP EAX, ECX», но в этот раз сделаем EAX больше ECX.

Если нажмём F7:

Видим, что флаг Z равен нулю, потому что, как мы уже знаем, значения не равны, а исходя из того, что флаг S тоже равен нулю, можно опеределить, что остаток от EAX-ECX является положительным, то есть EAX больше ECX.

Таким же образом повторим предыдущую операцию, но EAX меньшим чем ECX.

И нажимаем F7.

Здесь видим, что остаток от вычитания ECX от EAX отрицателен, то есть значение в ECX больше, что активизирует флаг S.

Различные результаты сравнения активизируют соответствующие флаги , и, соответственно им, программа может переходить или не переходить при активации одного или больше из этих флагов.

Здесь сравниваем EAX с содержимым 405000, и, как обычно, окошко с пояснениями нам даёт значение каждого из операндов. В моём случае они следующие:

EAX в данном примере меньше чем содержимое ячейки памяти по адресу 405000, которое равно 1000, что приведёт к отрицательному остатку и активирует флаг S.

Существуют похожие формы

Код (Text):

  1.  

  2. CMP AX,WORD PTR DS:[405000]

и

Код (Text):

  1.  

  2. CMP AL,BYTE PTR DS:[405000]

В этих случая сравниваются 2 или 1 байт содержимого памяти соответственно.

TEST (Логическое сравнение)

Эта инструкция работает похожим, до некоторой степени, образом, что и CMP – производится определённая операция над двумя значениями, и результат её не сохраняется, однако могут измениться состояния определённых флагов (в данном случае SF, ZF и PF), в следствии чего программа может определить, следует или нет совершать переход. Отличие от предыдущей инструкции заключается в том, что пресловутой операцией является AND.

Это нам рассказал наш друг CAOS в своё туториале по ассемблеру. Рассмотрим несколько примеров, чтобы уяснить данное определение:

Вы спрашиваете зачем сравнивать с самим собой EAX или любой другой регистр? Для того, чтобы определить равен ли EAX нулю. Как это работает?

Пишем в Олли:

Таблица результатов для операции AND следующая:

Результать равен 1, если оба операнда равны 1, и 0 во всех остальных случаях.

Код (Text):

  1.  

  2.        1 and 1 = 1

  3.        1 and 0 = 0

  4.        0 and 1 = 0

  5.        0 and 0 = 0

Видим, что единственный случай, когда результат равен нулю, это если оба операнда равны нулю (нас не интересуют случаи, когда у операндов разные значения, так как мы сравниваем EAX с самим собой, поэтому они всегда будут равны), соответственно, если у EAX в двоичной форме какой-нибудь из битов равен 1, то результатом операции никак не может быть ноль.

Сделаем EAX равным НУЛЮ:

В OllyDbg это делается очень легко правым кликом мыши на нужном регистре и вводом НУЛЯ.

Теперь нажимаем F7.

Видим, что активен флаг Z, то есть знаем, что результатом операции AND был НОЛЬ, в виду чего он и активировался.

Если повторим эту операцию на EAX со значением, отличающимся от нуля:

Нажимем F7.

И флаг Z не является активным, так как результат отличается от нуля.

Если используем калькулятор, то можем вычислить, что результатом 390 AND 390 будет 390.

В двоичной форме 390 – это 1110010000.

Так как операция AND, если оба операнда равны НУЛЮ в качестве результата также выдаст НОЛЬ, а если они оба равны ЕДИНИЦЕ, то результатом будет НОЛЬ, то видим, что в случае с 390 результат будет 390 и флаг Z не станет активным.

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

ПЕРЕХОДЫ

Все инструкции переходов принимают один операнд, задающий адрес, на который должна перейти программа. Различие между ними мы увидим в следующем списке.

  • JMP – переход
  • JE, JZ – переход, если равно нулю
  • JNE, JNZ – переход, если не равно нулю
  • JS – переход, если знак отрицателен
  • JNS – переход, если знак не отрицателен
  • JP, JPE – переход, если чётно
  • JNP, JOP – переход, если нечётно
  • JO – переход, если произошло переполнение
  • JNO – переход, если переполнения не произошло
  • JB, JNAE – переход, если ниже
  • JNB, JAE – переход, если выше или равно
  • JBE, JNA – переход, если ниже или равно
  • JNBE, JA – переход, если выше
  • JL, JNGE – переход, если меньше
  • JNL, JGE – переход, если больше или равно
  • JLE, JNG – переход, если меньше или равно
  • JNLE, JG – переход, если больше

JMP

Это безусловный переход, то есть никакого решения не делается, и всегда происходит переход по заданном адресу. Например, напишем в Олли:

При выполнении этой инструкции программа перейдёт в 401031 и продолжит выполнение уже оттуда.

В Олли есть пара опций, которые позволяют сделать переходы более наглядными.

Если зайдём в OPTIONS-DEBUGGING OPTIONS:

А там во вкладку CPU:

Ставим следующие три галочки:

Видим, что предоставляемая информация стала гораздо нагляднее.

Видим, что теперь OllyDbg показывает нам красной линией откуда и куда совершается переход, в данном случае в 401031.

Если запустим с помощью F7:

Совершается переход и EIP становится равным 401031.

Он равен этому значению, так как EIP содержит адрес инструкции, которая должна быть выполнена.

JE или JZ

И то и другое являются одним и тем же условным переходом, который можно записать двумя разными образами. JZ «прыгает» тогда, когда активен флаг Z.

Напишем в OllyDbg две инструкции, которые делают сравнение и совершают переход, если сравнение оказалось удачным.

Делаем EAX и ECX одинаковыми.

При выполнении сравнения будет произведено вычитание одного параметра из другого, и так как они оба равны, то результат будет равен нулю, а флаг Z станет активным.

Следующая инструкция – это условный переход:

OllyDbg сообращает нам принятое программой решение и, поскольку флаг Z активен, показывает красной линией, куда будет совершён переход. Если бы она была серого цвета, то это означало бы, что принято решение не совершать переход. Нажимаем F7.

Видим, что был совершён переход и EIP сейчас равен 401031.

Повторим пример с EAX, отличным от ECX.

При нажатии на F7, поскольку результат первой инструкции отличен от нуля, флаг Z остаётся неактивным.

И идём в Олли:

Поскольку перехода не произойдёт, то линия перехода отображается серым цветом. Ещё раз нажимаем F7.

Видим, что действительно перехода не произошло, и выполнение программы продолжается в 401004. Примерно таким образом совершаются сравнения во всех программах.

Если повторим предыдущий пример до шага с переходом, но не будем его совершать:

Мы знаем, что флаг Z равен нулю и перехода не будет. Теперь что случится, если кликнем два раза на флаге Z и изменим его значение на 1?

Видим, что линия стала красного цвета, а переход будет совершён, независимо от результата сравнения. Хотя программа уже приняла решение о переходе, его можно изменить, напрямую манипулируя значением флага.

Рассмотрим коротко другие флаги на наглядных примерах.

JNE или JNZ

Эта инструкция противоположна предыдущей: переход совершается, если флаг Z неактивен, то есть если результат операции отличен от нуля.

Здесь пишем сравнение и JNZ.

Если EAX и ECX равны, то флаг Z будет активным.

И в отличии от инструкции JZ, совершавшей переход, когда флаг Z был активен, эта, напротив, переходит тогда, когда флаг Z равен нулю, то есть неактивен.

Как можно понять, если EAX отличен от ECX, то результат операции также будет отличен от нуля, что сделает флаг Z неактивным и, в свою очередь, приведёт к переходу.

JS

Как видно из таблицы выше, этот переход выполняется, если результат сравнения отрицателен, то есть если в предыдущем примере EAX меньше чем ECX.

Нажимаем F7:

Флаг S равен 1, поэтому происходит переход.

Видим, что красная линия указывает нам, куда произойдёт переход. В случае, если EAX больше ECX, флаг S будет неактивным и переход JS не сработает.

JNS

Этот переход противоположен предыдущему. Переход совершается, когда флаг S равен нулю, то есть, если рассматривать предыдущий пример, когда EAX больше ECX.

JP или JPE

Условный переход JP срабатывает, когда активен флаг P, а это происходит, когда результат сравнения является чётным (понимая её так, как это мы рассматривали раньше).

Имеем 20 в EAX и 18 в ECX. Нажимаем F7:

Разность между EAX и ECX равна 2, что в двоичной системе отображается как 10. В этом числе всего лишь одна единица, то есть нечётное их количество, поэтому флаг P неактивен и перехода JPE не происходит.

Теперь заменим значение в ECX на 17 и снова нажмём F7:

Видим, что результат равен 3, что в двоичной системе выглядит как 11 – в этом числе чётное количество единиц, флаг P активен, поэтому переход JPE срабатывает.

JNP или JNPE

Этот переход противоположен предыдущему и срабатывает, когда флаг P равен нулю, то есть количество единиц в числе нечётно. В рассмотренном только что примере переход произошёл бы, когда результат был равен 2, и не сработал бы, когда он равнялся 3, то есть обратно действию JP.

JO

Срабатывает, когда происходит переполнение, в виду чего активируется флаг O.

Здесь меняем инструкцию сравнения, так как нам необходимо активировать флаг O, для чего нужно, чтобы произошло переполнение, а этого можно добиться с помощью операции суммирования.

Нажимем F7:

И срабатывает переход JO, так как из-за произошедшего переполнения активировался флаг O.

JNO

Противоположен пердыдущему переходу и срабатывает, когда флаг или равен нулю, то есть переполнения не произошло.

JB

Переход происходит, если первый операнд ниже чем второй. Смотрим пример.

Видим, что EAX ниже чем ECX, то есть должен сработать переход. Нажимем F7:

Флаг C активен, так как разность между этими двумя операндами является отрицательным числом, то есть установлен самый значимый бит, на основании чего и делается вывод, что EAX меньше ECX.

JNB

Противоположен предыдущему – срабатывает, если флаг C равено нулю, то есть результат сравнения был положителен. В предыдущем примере это произошло бы, если EAX был бы больше ECX.

JBE

Это переход если ниже или равно, то есть проверяются два флага – активен ли флаг C, и тогда переход срабатывает, а также активен ли флаг Z, и тогда он тоже срабатывает, то есть если EAX равен ECX или меньше.

Сделаем EAX равными друг другу.

Нажимаем F7.

Видим, что флаг Z активен.

Если EAX меньше ECX:

Нажимаем F7.

В данном случае активируется флаг C, так как результат отрицателен (установлен самый значимый бит), то есть EAX меньше ECX.

В последнем примере EAX больше ECX. Нажимаем F7.

Оба флага Z и C равны нулю, поэтому перехода не происходит.

То есть, JBE срабатывает, если в нашем примере EAX ниже или равен ECX.

JNBE

Этот переход противоположен предыдущему и срабатывает, если оба флага Z и C равны нулю. В предыдущем примере переход произошёл бы только в последнем случае.

JL

JL – это переход «если меньше», но в несколько другой форме. Здесь проверяется, отличается ли флаг S от флага O, и в этом случае и совершается переход.

Рассмотрим пример, когда EAX и ECX положительны и EAX больше ECX.

При нажатии на F7 перехода не произойдёт, так как EAX больше ECX и результат положителен, поэтому ни флаг O, ни флаг S не будут активны.

Повторим пример при EAX меньше ECX, но оба по-прежнему положительны:

Нажмём F7:

И так как флаги S и или отличаются друг от друга, то срабатывает переход, то есть он происходит, если первый сравниваемый операнд меньше второго и оба положительны. Рассмотрим другой пример.

В данном случае EAX меньше ECX, так как первый является отрицательным. Смотрим, что произойдёт.

Переход совершается прекрасно, а теперь попробуем эти же два значения с переходом JB.

Нажимаем F7.

Видим, что JB не срабатывает, так как JB сравнивает оба значения как если бы они были положительными, то есть считает их беззнаковыми, поэтому если переход должен учитывать знак, то нужно использовать JL – это и есть основное различие между ними.

Как видно, эти условные переходы делятся на две категории: те, в которых знаки операндов учитываются, и те, в которых нет.

Видим, что JA, JB, JBE И JAE считают оба операнда положительными, в то время как JG, JL, JLE и JGE рассматривают их как числа со знаком. JE и JNE работают в обоих случаях.

Думаю, что тема условных переходов и сравнений достаточно хорошо раскрыта, в дальнейшем увидим, как они используются в программах.

Следующая часть будет также посвящена ассемблеру, в ней будут рассматриваться вызовы (call) и возвраты (ret), а также режимы адресации. Потерпите ещё чуть-чуть, хе-хе. © Рикардо Нарваха, пер. Aquila

wasm.in

[W A S M . R U] СТАТЬИ ⇒ Исследование программ ⇒ Введение в крэкинг с нуля, используя OllyDbg

Целью данного «Введения в крэкинг с нуля, используя OllyDbg», является дать тем, кто только начал осваивать искусство крэкнинга, базовые знания и, вместе с тем, сделать это так, чтобы эти знания позволили в дальнейшем читать и понимать более продвинутые туториалы – такие, которые можно встретить в «Новом курсе от CracksLatinos», который, разумеется, остаётся открытым для новых добавлений и пополнений.

Идея создания курса родилась из-за того, что многие туториалы в «Новом курсе от CracksLations» оказывались слишком сложными для новичков, и те, не сумев достигнуть нужного уровня, оказывались разочарованными и во многих случаях отказывались продолжать. Поэтому целью данного «Введения...» является не повторение прекрасных туториалов из «Нового курса...», число которых уже перевалило за 500, но заложить основу, чтобы те, кто закончит данный курс, смогли читать более сложные пособия. Это, как и всё в нашем ремесле, требует значительных усилий, и главной задачей является сократить их количество, дав базовые знания и позволив в дальнейшем понимать более сложный материал.

Почему OLLYDBG?

Мы не будем здесь рассуждать о вечном противостоянии Soft-Ice против OllyDbg, думаю, что даже фанатики от Soft-Ice признают, что проще начать с OllyDbg, так как о нём много информации и его проще изучать. Нам нужно войти в мир крэкинга через дверь под названием «OllyDbg», а уже потом тот, кому нужно, сможет перейти на любой другой отладчик, который потребуется, так как меняются лишь их способы использования, но суть остаётся неизменной.

Начнём с начала

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

Поскольку мы начинаем с нуля, то для начала нам нужно распаковать скачанный архив в такую папку на жёстком диске, до которой можно легко добраться. Хорошей идеей будет создать папку на диске C:/. Хотя будет работать и в любом другом месте, я буду исходить из того, что выбран диск C:/.

После того, как файл был распакован, заходим в созданную папку и видим:

В ней находится исполняемый файл OLLYDBG.exe, который нам и нужно запустить и ярлык которого я для удобства сделал на своём рабочем столе.

Ок, всё готово к запуску. Кликаем на OllyDbg:

Перед нами повляется сообщение о том, что DLL, находящаяся в библиотеке, старше, чем такая же системная DLL, и если выберем «Да», то тогда старая DLL будет стёрта из папки, а использоваться будет системная. Хотя я не вижу особых различий между этими двумя, тем не менее, предпочитаю ту, которая идёт с дистрибутивом, и поэтому всегда нажимаю «Нет».

Это чистый OllyDbg, и первой программой, которую мы откроем только для того, чтобы ознакомиться с OllyDbg, станет знаменитый CrackMe CrueHead’а, который приложен к данному туториалу.

Чтобы открыть файл в OllyDbg, идём в File -> Open или нажимаем на иконку:

Откроется окно, с помощью которого можно найти нужный файл, в данном случае это crackme CrueHead’а.

Откроется вышеупомянутый crackme, и на данный момент неважно, что совершенно непонятно, что означает открывшийся нам вид – пока мы только пройдёмся по различным частям и функциям OllyDbg и некоторым настройкам, чтобы когда в последующих туториалах будет написано, скажем, «зайдите в DUMP», вы, по крайней мере, знали, где находится эта опция.

Здесь мы рассмотрим четыре части главного окна OllyDbg:

1) Дизассемблированный код

Также называется листингом. Тут Олли показывает нам дизассемблированный код программы, которую мы собираемся отлаживать; по умолчанию Олли сконфигурирована так, чтобы анализировать программу при её открытии. Это можно изменить в Options -> DEBUGGING OPTIONS.

То есть, если отмечена галочка «AUTO START ANALISIS OF MAIN MODULE», OllyDbg проанализирует программу и покажет о ней дополнительную информацию.

Это начало проанализированного листинга крэкми CrueHead’а, и если мы откроем его без анализа, то сможем увидеть разницу.

В окне анализа содержится множество информации, которая, несмотря на то, что пока нам не очень понятна, выглядит весьма интересной. В то же время приятно знать, что её можно в любой момент убрать, если анализ оказался не слишком точным или в него закралась какая-то ошибка.

Зачастую OllyDbg отображает некоторые части программы некорректно, так как ошибочно интерпретирует исполняемый код как данные, и тогда она отображает примерно следующее:

В этом случае можно вручную убрать анализ, кликнув на листинге правой кнопкой мыши и выбрав «ANALISIS -> REMOVE ANALYSIS FROM MODULE».

И тогда листинг отобразится корректно.

Другой опцией, которой вы можете воспользоваться для облегчения раобты и которая мне лично не очень нравится (но вкусы бывают разные), является подсветка jump (переходов) и call (вызовов) – кликните на листинге правой кнопкой мыши и выберите «APPEARENCE -> HIGHLIGHTING -> JUMPS AND CALLS».

Получится следующее:

Здесь мы видим, что call’ы подсвечены лазурным цветом, а переходы – жёлтым.

Теперь листинг стал более читаемым, но пока у нас нет ни малейшей идеи, что это означает, но хорошо иметь инструмент подготовленным к дальнейшему использованию.

2) Регистры

Второе важное окно – это окно регистров.

Вспомним, что окно регистров находится в самой правой части OllyDbg, и там отображается значительное количество информации.

Есть значительно больше информации, которую мы не видим, но можно устанавливать режим отображения в три состояния («VIEW FPU REGISTERS» – отображать FPU-регистры, «VIEW 3D NOW REGISTERS» – отображать “3D NOW”-регистры и «VIEW DEBUG REGISTERS» – отображать отладочные регистры). По умолчанию отображаются первые.

3) Стек или «куча»

Теперь переходим к «стеку или куче». Здесь не слишком много конфигурационных опций – разве что возможность отобразить информацию, касающуюся регистров ESP и EBP.

По умолчанию стоить режим отображения информации, связанной с ESP (и он же является самым полезным), но его можно сменить на режим отображения информации, связанной с EBP, для чего необходим кликнуть в этом окне правой кнопкой мыши и выбрать пункт «GO TO EBP», а дальнейшее использование пункта «GO TO ESP» вернёт нас в прежний режим.

В дальнейших главах я объясню подробнее функциональность стека, но пока мы рассматриваем только то, что можно изменить с помощью конфигурации.

4) Дамп

У окно дампа есть много режимов отображения, которые можно менять, кликнув правую кнопку мыши в окне дампа и выбрав тот, который нужен. По умолчанию используется используется режим 8-ми байтовый Hex/ASCII.

Режим, используемый по умолчанию, также является и чаще всего используемым, но вместе с тем, у нас есть возможность изменять его на показ дизассемблированного кода (DISASSEMBLE), текста (TEXT) и других форматов (SHORT, LONG, FLOAT).

И, накоец, опция SPECIAL -> PE HEADER, которая, как мы это увидим в ближайших главах, может быть очень полезной.

Теперь мы знаем основные части главного окна OllyDbg, но есть ещё окна, которые недоступны напрямую, но могут быть вызваны как через меню, так и через кнопки на панели управления.

Рассмотрим каждую из них.

Кнопка L или VIEW->LOG показывает нам то, что OllyDbg пишет в окне лога. Его можно сконфигурировать на отображение различного рода информации, а по умолчанию в окне лога сохраняется вся информация о запуске, а также информация, связанная с «BREAKPOINTS CONDICIONAL LOGS» (условными логами точек останова). С последней мы встретимся гораздо позднее, а пока давайте посмотрим информацию о запущенном процессе (в нашем случае это крэкми CrueHead’а) и библиотеках, которые он загружает.

Одна из самых главных опций данного окна – это ведение лога в файле на тот случай, если мы хотим сохранять информацию в текстовом файле. Чтобы активировать эту опцию, нажмите на правую кнопку мыши и выберите «LOG TO FILE».

Кнопка E или VIEW->EXECUTABLES показывает нам список модулей, которые использует программа: exe, dll, ocx и прочие.

Здесь также правая кнопка мыши вызывает множество опций, которые пока мы смотреть не будем, но которые мы уже видели при исследовании главного окна OllyDbg.

Кнопка M или VIEW->MEMORY отображает память, занятую нашей программой. Здесь мы видим секции приложения, библиотеки, использующиеся процессом, стек и различные секции, занятые системой, и зачастую программы в процессе выполнения занимают новые секции памяти.

Кликнув правой кнопкой мыши можем сделать SEARCH в памяти, чтобы найти в ней строки различных родов (текстовые, шестнадцатиричные, юникодовые), также есть возможность подстветить точки останова в секциях, равно как и возможность изменить права доступа к последним (выберите SET ACCESS).

Кнопка T или VIEW->THREADS показывает нам список нитей (потоков) программы.

Хотя сейчас мы не знаем что это такое, а узнаем это лишь в последующих главах, ознакомиться с каждым из окон лишним не будет. Пользоваться ими мы научимся позднее.

Кнопка W или VIEW->WINDOWS отображает нам окна программы, но поскольку она ещё не выполняется, то и список окон остаётся пустым.

Кнопка H или VIEW->HANDLES отображает хэндлы, позже я объясню, для чего они служат.

Кнопка C или VIEW->CPU возвращает нас к главному окно OllyDbg.

Кнопка / или VIEW->PATCHES показывает список наложенных патчей, если программа была изменена. Поскольку пока никаких изменений не вносилось, сейчас окно остаётся пустым.

Кнопка K или VIEW->CALL STACK отображает «call stack», списко вызовов, которые нам встретились до того места, где программа остановилась.

Кнопка B или VIEW->BREAKPOINTS вызывает список обычных точек останова, расположенных в программе. Здесь нет ни точек останова аппаратного обеспечения, ни точек останова памяти, только обычные.

Кнопка R или VIEW->REFERENCES показывает окно ссылок, полученных нами в результате поиска ссылок в Олли.

Кнопка «…» или VIEW->RUN TRACE отображает результат выполнения команды RUN TRACE. Здесь мы также можем выбрать опцию LOG TO FILE), чтобы сохраненить результаты трассировки в текстовом файле.

Мы рассмотрели панель с самыми важными кнопками, чтобы вы были знакомы с возможностями, которые они предоставляют, когда мы начнём их более глубокое изучение в последующих главах.

Как сконфигуровать OllyDbg стала JIT (JUST IN TIME DEBUGGER)

Конечно, мы не будем всё время использовать JIT, а только в специальных случаях, так как если случится ошибка с какой-либо запущенной программой на нашей машине, то нам совсем не нужно, чтобы использовалась Олли (по умолчанию в качестве JIT используется dr.watson).

Чтобы сделать OllyDbg JIT-отладчиком, нужно перейти в OPTIONS->JUST IN TIME DEBUGGING

и нажать последовательно кнопки MAKE OLLYDBG JUST IN TIME DEBUGGER y DONE

Чтобы убрать эту функцию, нужно в том же месте нажать на RESTORE JUST IN TIME DEBUGGER и DONE.

Подключение плагинов в OllyDbg

OllyDbg позволяет подключать плагины, которые могут оказаться полезными для решения той или иной задачи. Пока мы ограничимся подключением плагина COMMAND BAR, чтобы научиться как это делать.

Скачиваем данный плагин отсюда (ссылка, указанная в оригинальной статье, умерла, поэтому я скачал плагин из инета и разместил её на wasm.ru - прим.пер.).

После этого распаковываем плагин и смотрим содержимое папки, где это было сделано:

Прежде всего нужно создать папку для плагинов. Я создам её на C:/ и назову PLUGINS.

Разумеется, плагины могут находиться где угодно, но мне нравится размещать всё на C. Как бы то ни было, теперь мы должны сконфигурировать OllyDbg, чтобы она распознавала эту папку как местонахождение всех плагинов.

Для этого идём в OPTIONS->APPEARANCE.

И в открывшемся окне открываем вкладку DIRECTORIES.

Видим, что в качестве пути к плагинам указана директория, где находится сам OllyDbg.exe, и можно было бы помещать плагины туда, но мне нравится держать их отдельно, и тогда нажимем на PLAGIN PATH->BROWSE, чтобы найти созданную нами папку.

Выбираем папку PLUGINS и сохраняем изменения.

То есть нужно перезапустить Олли, чтобы она признала новую папку с плагинам, но сначала следует скопировать в последнюю скачанный плагин.

Копируем всё содержимое архива в папку PLUGINS.

Теперь все файлы плагина «Command Bar» находятся в папке PLUGINS, в неё же следует помещать и остальные (зачастую можно копировать не все файлы в архиве, а только dll).

Теперь закрываем OllyDbg, если она всё ещё была закрыта, и запускаем по новой. Видим, что в меню PLUGINS появился COMMAND BAR и его опции.

В нижней части OllyDbg видим установленный COMMAND BAR.

Это текстовое поле для ввода команд, которые нам могут пригодиться во многих случаях, и позднее мы увидим их применение, а пока важно научиться подключать плагины.

Чтобы деинсталлировать PLUGIN достаточно просто стереть соответствующую dll из папки PLUGINS и перезапустить OllyDbg, и плагин исчезнет. Вместе с тем, благоразумно всегда держать COMMAND BAR включённым.

Снова открываем крэкми CrueHead’в в OllyDbg.

Наиболее полезные клавиши в OllyDbg следующие:

F7: Выполняет одну строку кода (если находимся на CALL, то переходим внутрь вызванного участка кода)

F8: Выполняет одну строку кода (если находимся на CALL, то просто выполняет вызов без перехода внутрь и переходит на следующую за CALL строку).

Это два вида ручной трассировки очень разные и в каких случаях использовать каждую из них мы рассмотрим позже.

F2: устанавливает обычную точку останова на отмеченной линии. Чтобы убрать эту точку останова, надо ещё раз нажать F2.

Например:

Хотим установить точку установа в позиции 40101A, поэтому отмечаем эту линию с помощью мыши.

С помощью одного клика мыши она помечается и становится серого цвета как на картинке. Затем нажимаем F2.

Видим, что соответствующая позиция в первой колонке становится красной, что говорит о том, что здесь есть точка останова. Нажав F2 ещё раз можно её убрать.

F9: Запускает программу, которая будет выполняться до тех пор, пока не встретить точку останова, не совершиться какое-либо исключение или же просто прекратит работу по каким-либо причинам. Когда программа запущена, в нижнем правом угле OllyDbg отображается слово RUNNING.

Запустив крэкми CrueHead’а, мы увидим следующее:

Чтобы временно прекратить выполнение программы, нужно нажать F12 или DEBUG->PAUSE.

Видим, что OllyDbg отображает слово PAUSED (пауза). Продолжить выполнение программы можно нажав F9 или DEBUG->RUN.

Чтобы закрыть отлаживаемую программу выберите DEBUG->CLOSE.

Это был краткий обзор OllyDbg, более глубокое изучение множества опций и возможностей которой мы продолжим изучать в последующих главах. Главное, чтобы вы скачали программу, сконфигурировали, ещё раз посмотрели всё, о чём было рассказано в этом туториале, так же подключили плагин, позапускали и поостанавливали крэкми CrueHead’а, попробовали поставить точки останова, чтобы в следующей главе все эти вещи не вызывали у вас колебаний и сомнений.

  [C] Рикардо Нарваха, пер. Aquila

vxlab.info


Смотрите также