Как настроить смартфоны и ПК. Информационный портал
  • Главная
  • Вконтакте
  • Olly Debugger от А до Я. Подбираем наиболее интересные плагины для OllyDbg Знакомство с главным меню

Olly Debugger от А до Я. Подбираем наиболее интересные плагины для OllyDbg Знакомство с главным меню

В основном я всегда для отладки пользовался отладчиком всех времен и народов OllyDbg. Это шикарный деббагер, который очень удобен и прост одновременно обладающий очень мощным функционалом. Но, в последнее время я все больше сталкиваюсь х64 программами, да и домашний компьютер у меня поднят на х64 операционной системе, а OllyDbg версии 1.10 не корректно работает на такой операционной системе, теряет точку входа и вообще печально все. Попытки использовать более новую версию 2.01а тоже не увенчались успехом, так как она виснет в неожиданный момент и перестает отвечать, можно конечно накатить кучу патчей от китайских друзей и более менее оживить дебагер, но все равно огромное количество багов и похоже прекращение разработки(с августа 2011 года никаких подвижек) заставило меня посмотреть в сторону Interactive Disassembler, сокращенно IDA. Это мощнейший инструмент для отладки и исследования программ который обладает кучей нужных и не очень не нужных свистелок и перделок.
Но он тоже обладает некоторыми минусами, которые меня всегда останавливали для изучения сего мощного инструмента:
1. Мало вменяемой документации, есть конечно книги от уважаемого господина К. Касперски, но они настолько древние, что читать их смысл есть, но в текущих реалиях не шибко большой, в основном для общего развития.
2. Цена сего продукта у X-Rays - стартовая лицензия более 500 австралийских долларов и это без X-Rays Decompiler, который стоит совсем каких то неадекватных денег.
Но разочарование OllyDbg возобладало над жабой и здравым смыслом и я решил заняться всетаки изучением IDA.


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

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

Итак я не буду описывать базовые навыки при работе с ассемблером как в статьях Рикардо Наваха, так как думаю те кто переходят к IDA уже немного понимают что такое стек, регистры, как устроена память и что такое условный и без условный переход, а займемся сразу исследованием программ которые описаны в статьях Рикардо. Я постараюсь пройтись по всем его статьям с разбором crackme которые он упоминает.

Первая статья в которой уже идет разбор crackme, является главой под номером 9 , у меня же она будет первой главой.
Качаем необходимый фаил который будет исследоваться, например с сайта wasm.ru
Запускаем IDA и открываем в нем фаил через File->Open. После чего видим следующую картинку:

Все настройки можно оставить по умолчанию, так как они в принципе в текущий момент ничего мне особа не говорят. Жмем ОК и видим основное окно IDA:


Кружочками с циферками выделены следующие позиции:
1. Информация об базе, точке входа, размере секции кода виртуальной и реальной и прочая полезная информация про секцию.
2. Функции которые обнаружены в программе, розовым обозначены функции которые импортируются из внешних библиотек. start - чаще всего это функция которая идет в точке входа, к стати посмотреть варианты Entery Point можно нажав хоткей CTRL+E.
3. Собственно сам ассемблерный код текущей открытой функции, если не хочется смотреть в графическом режиме то можно переключить в текстовой сплошной простыней по пробелу, обратно в графический переключается пкм на листинге Graph view.
4. Миникарта функций со всеми переходами и прочим, очень полезна для ориентации в коде.

Для того чтобы можно было запускать приложение в отладчике, необходимо выбрать сам отладчик, так как листинг кода это еще не отладка.
Нажимаем F9 или выбираем в верху опцию Debugger - появиться окно под названием Select a debugger в котором выбираем Local Win32 debugger для начала нам хватит этого дебагера, а с остальными будем разбираться позже.

Нажимаем еще раз F9 и программа запускается, не остановишись на Entery Point как в OllyDbg. Это можно исправить, если есть желание постоянно останавливаться в самом начале, идем опять же в закладку Debugger и там выбираем Debugger Options в открывшимся окне можно установить галочку на Stop on process entry point и получим реакцию такуюже как в OllyDbg, при старте отладки останавливаемся на точке входа. Но так же можно сразу установить руками брякпоинт если необходимо посмотрев в ASM листинг и остановиться там.

Теперь рассмотрим окно дебаггера:


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

Что нам здесь еще понадобиться, основные инструменты показаны на следующей картинке:


Disassembly - собственно вызывает окно с дизассемблированной программой.
Hex Dump - открывает окно с дампом.
Pseudocode - эта функция пытается преобразовать ASM код в жалкое подобие C.
Exports - что программа или библиотека экспортирует.
Imports - что программа или библиотека импортирует.
Names - список APIшных имен найденых в данном экзешнике.
Functions - список функций обнаруженных в программе.
Strings - текстовые строки обнаруженные в программе.
Segments - сегменты которые обнаружены в памяти.
Для начала хватит, так как назначение остальных функций пока не очень понятны, а текущее понадобиться для иследования первой программы crackme.

Теперь немного про дебаггер, основные клавиши остались стандартные
F9 - выполнить программу
F8 - трассировать не заходя в функцию
F7 - трассировать заходя в функции
F2 - снять/установить брякпоинт на строке где в текущий момент курсор.

Как в IDA различать где мы сейчас находимся в программе которую отлаживаем или уже шаримся по дллке импорта - можно посмотреть в текстовом виде с лево от номера позиции и увидеть описание, например вот такое:
kernel32.dll :764FD8F3 mov edi, edi
Ну по слову kernel32. сразу становиться понятно, что сейчас мы находимся в кернеле.

Ну теперь всетаки давайте вернемся нашему многострадальному crackme.
Запустим его и попытаемся ввести какое нибуть имя и серийный номер, вывалиться мессадж бокс, который скажет "No luck there, mate!". Значит мы не угадали имя и пользователя. Давайте попробуем отловить это сообщение и посмотрим как нам заставить выдавать правильное сообщение, что имя и серийник правильные. Известно, что вывод сообщения об неудаче использует стандартную API функцию MessageBoxA , вот на нее и необходимо нам поставить брякпоинт.
Идем в View ->Open SubViews ->Functions или нажимам Shift+F3, а вот там видим все функции которые удалось определить IDA.
Выделяем нужную нам функцию MessageBoxA и по низпадающему меню от правой мыши ставим брякпоинт на функцию. Както так:

Ок. Поставили, продолжим выполнение программы и попробуем ввести снова неправильное имя и серийник.(к стати вернутся в окно отладки по умолчанию чаще всего можно кнопкой ESC )
Отладка остановилась на выводе сообщения о неправильном логине и пароле, отлично, смотрим какую полезную информацию мы можем выудить.
Мы находимя на входе в функцию MessageBoxA, сама функция нам не интересна, по этому жмем CTRL+F7 что означает, выполнить код до обнаружения первого ret, тоесть выхода из функции. После всех манипуляций, основное окно дизасемблированного кода выглядит вот так:

Ага! Это процедура которая передает аргументы для MessageBoxA которая выводит сообщение об неправильном серийнике и имени. Так как назначение понятно, то можно переименовать сразу функцию щелкнув ПКМ(правой кнопокй мыши) на sub_401362 и выбрав там пункт Rename или использовав горячую кнопку N. Я назову эту функцию AHTUNG! :)

Посмотрим далее, откуда растут ноги этой процедуры и что же находиться за ней. Нажмем F8 и выйдем на уровень в верх. А там сразу видно некую проверку со стрелочками, одна стрелочка на лево ведет к вредной процедуре AHTUNG , а вот вторая не очень понятно, но там видно CALL и адрес sub_40134D , очень интересно посмотреть, что же там. Варианта 2 в принципе, 1 это щелкнуть 2 раза ЛКМ(левой кнопкой мыши) на sub_40134D и попасть в эту функцию, а второй, это просто навести мышой на туже sub_40134D и подождать пол секунды, что покажет кусок этой функции, както так:

Уже очень интересно, похоже что другой вариант проверки ведет к правильному окошку. Обзовем эту процедурку GOOD .
Снимаем старый брякпоинт на MessageBoxA , он нам не нужен уже идем в Debugger->Breakpoints->Breakpoint List и удаляем старый брякпоинт в открывшемся окне.
Теперь необходимо поставить брякпоинт на проверку jz над этими процедурками AHTUNG и GOOD либо по ПКМ и выбором соответсвующей опции или хоткеем F2. Перезапустим программу и осмотримся.
Получится у нас следующее окно:

К сожалению на статичной картинке не видно, но поверьте мне на слово, в текущий момент мигает срелочка которая ведет в сторону процедурки AHTUNG и это есть не очень хорошо. Нам было бы неплохо чтобы мигала зелененькая стрелочка в сторону процедурки которую мы обозвали GOOD. Для этого необходимо поставить флаг ZF в 1. ПКМ на флаге и выбрать опцию Increment Value или выделить флаг и нажать на кнопочку +(плюс) цифровой клавиатуре. Конечно лучше это смотреть в динамике, в статичных картинках плохо видно, но теперь замигала стрелочка в сторону GOOD процедурки в листинге это выглядит вот так:

Тут более наглядно на статике, когда ZF = 0, то переход не совершается и выглядит в виде пунктиной линии, соответсвенно мы попадаем на процедурку AHTUNG, а когда совершается - то видно жирную зеленую стрелочку и ведет он на процедурку GOOD.
Ну чтож, жмем наконец F9 и наслаждаемся результатом: Great work, mate. Now try the next CrackMe.


Правда если закрыть программу и снова открыть в отладчике, флаг конечно пропадет, надо придумать что нибуть, чтобы пропатчить ее и больше не извращаться с флагами, самый простой вариант, это за место JZ сделать JNZ , чтобы принимался наоборот любой неправильный серийник, кроме правильного.
Hex код JZ - 74 , а код JNZ - 75, значит нада поменять байт, встаем на строку которую хочем поменять, идем в Edit ->Patch programm ->Change Byte.
Повяиться панель с набором байтов:
74 07 E8 18 01 00 00 EB 9A E8 FC 00 00 00 EB 93
необходимо поправить первую цифру на 75 , чтобы получилось
75 07 E8 18 01 00 00 EB 9A E8 FC 00 00 00 EB 93
В дизасемблированном коде можно будет увидеть изменения.
Тем самым теперь будет правильно проходить любой серийник кроме правильного, хотя я считаю что это грязным трюком, лучше или знать серийник или сделать безусловный JMP.

Сохраним результат патча, File ->Produce File , вывалиться куча возможных сохранений, даже в EXE , но оно почемуто не работает, так что сохраним в банальный DIF.
Посмотрим в файлик что получилось:

То что надо.

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

Введение в крэкинг с нуля, используя 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

Многие реверсеры не понаслышке знакомы с OllyDbg - бесплатным 32-битным отладчиком пользовательского режима (ring 3). Основные плюсы данного отладчика: бесплатность, малый размер, интуитивно понятный интерфейс, простота управления и поддержка плагинов, которые существенно расширяют его функциональность. На сегодняшний день насчитывается свыше 500 плагинов, и среди этого разнообразия мы постарались выделить для тебя наиболее интересные.

OllyDumpEx

При решении различных задач, связанных с реверс-инжинирингом, а если точнее - при работе с вредоносным программным обеспечением, которое активно использует различные обфускаторы и упаковщики, довольно часто приходится производить дамп памяти процесса для последующего его анализа. Так как процесс активен, то большинство его упаковщиков и обфускаторов уже отработали и можно видеть почти истинное лицо негодяя. Так что дампер памяти процесса в таких задачах вещь незаменимая. Каждый исследователь отдает предпочтение тому или иному отладчику, например из-за набора плагинов, но порой необходимо их варьировать, а интерфейс и возможности плагинов хотелось бы иметь одинаковые вне зависимости от отладчика. OllyDumpEx Plugin решает данную проблему - он позволяет очень гибко дампить память и поддерживает несколько самых популярных отладчиков: OllyDbg 1/2, Immunity Debugger 1.7/1.8, IDA Pro, WinDbg. Особенности инструмента:

Выбор для дампа EXE-файла, DLL или иного модуля; - поиск MZ/PE-сигнатур в памяти; - поддержка PE32+; - поддержка нативных 64-битных процессов (пока только в IDA Pro); - дамп любого адресного пространства как секции (даже если ее нет в заголовке секций); - добавление пустых секций; - правка RVA в DataDirectory для последующего изменения ImageBase; - автовычисление большого количества параметров (RawSize, RawOffset, VirtualOffset и других).

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

Как устанавливать плагины?

Для начала необходимо создать в директории программы папку с названием Plugins. Это позволит в дальнейшем избежать замусоривания основной директории, а в случае необходимости без труда отыскать неработоспособный/конфликтный плагин. Далее копируем DLL-файл плагина в созданную директорию, после чего запускаем отладчик и указываем путь к этой папке:

  • OllyDBG v1.10: выбираем Options -> Appearance и закладку Directories. В пункте Plugin path указываем путь к папке с плагинами.
  • OllyDBG v2.01h: выбираем Options -> Options и раздел Directories. В пункте Plugin directory указываем путь к папке с плагинами.

Перезапускаем отладчик и ищем появившийся пункт в меню Plugins.

OllyMigrate

  • Для: OllyDbg 1.10/2.01, ImmunityDbg 1.7/1.8, IDA Pro, WinDbg 6

Каждый дебаггер имеет как сильные, так и слабые стороны, и у каждого они свои - идеального инструмента нет. В одном удобно обходить антиотладочные приемы, в другом использовать огромный арсенал уже готовых плагинов, а в третьем писать собственные скрипты. С недавних пор стало возможно работать последовательно сразу в OllyDbg, Immunity Debugger, WinDbg и IDA Pro. Как? Встречай OllyMigrate Plugin - данный плагин позволяет передавать процесс отладки другому отладчику без перезапуска исследуемого приложения. Так что мы можем задействовать только сильные стороны каждого отладчика, используя миграцию от одного к другому. Например, мы можем начать с OllyDbg для обхода антиотладочных приемов и нахождения OEP (Original Entry Point), а затем передать управление Immunity Debugger и, благодаря его поддержке Python-скриптов, править обфусцированную Import Table. Как ты уже понял, плагин поддерживает: OllyDbg 1/2, Immunity Debugger 1.7/1.8, IDA Pro, WinDbg. Особенности:

Многопоточность и возможность приостанавливать потоки; - перенос настроек софтверных точек останова (сохраняя статус включен/выключен).


Настройка графической схемы

Стандартная цветовая схема OllyDbg достаточно скучна и не очень информативна. К ней, конечно, со временем можно привыкнуть, но лучше настроить внешний вид так, чтобы глаз мгновенно ориентировался в ассемблерном листинге. В конце концов от этого зависит продуктивность работы. Настроить цветовую схему можно двумя способами: непосредственно из меню «Опции -> Оформление -> Colours» или через правку файла ollydbg.ini. Ищешь в файле секцию и играешься с настройками цветов по своему желанию. Подробно этот процесс описан на официальном сайте bit.ly/1cGR2zr .

OllySocketTrace

  • Для: OllyDbg v1.10

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

В настоящее время поддерживаются следующие операции с сокетами: WSASocket, WSAAccept, WSAConnect, WSARecv, WSARecvFrom, WSASend, WSASendTo, WSAAsyncSelect, WSAEventSelect, WSACloseEvent, listen, ioctlsocket, connect, bind, accept, socket, closesocket, shutdown, recv, recvfrom, send и sendto.

Просто запусти плагин, когда захочешь отследить операции, проводимые над сокетами. OllySocketTrace автоматически расставит все необходимые брейкпоинты и будет записывать всю необходимую информацию, как только они будут срабатывать. Чтобы посмотреть получившийся результат, надо выбрать пункт меню OllySocketTrace Log.


OllyHeapTrace

  • Для: OllyDbg v1.10

Плагин для трассировки манипуляций с кучей. Предназначен в первую очередь для отладки переполнений кучи, когда необходимо контролировать расположение кучи во время перезаписи определенной структуры, например заголовка блока, структуры критической секции или других прикладных данных. При активации плагин автоматически создает точки останова (RtlAllocateHeap, RtlFreeHeap, RtlCreateHeap, RtlDestroyHeap, RtlReAllocateHeap, RtlSizeHeap, GetProcessHeap and RtlInitializeCriticalSection, RtlDeleteCriticalSection) и записывает необходимую информацию, когда их достигает. Особенности:

  • просмотр трассировки кучи;
  • подсветка разными цветами каждой отдельной трассировки кучи;
  • фильтрация «лишней» информации для конкретной кучи.

Pyllow

  • Для: OllyDbg v2.01

Почему так много реверсеров пользуются Immunity Debugger? Да потому, что он, как и IDA, имеет встроенную поддержку Python. Этот скриптовый язык позволяет здорово упростить задачу исследования бинарного кода, позволяя быстренько накидать небольшой скриптик, автоматизирующий ту или иную рутинную задачу. К сожалению, «голый» OllyDbg поддерживает только свой ассемблероподобный язык для написания автоматизирующих скриптов. К счастью, парень под ником Pablo Escobar решил не мириться с таким положением дел и написал плагин для OllyDbg, интегрирующий в него поддержку Python, - Pyllow. Теперь можно писать скрипты, автоматизирующие рутинную работу реверсера, которые будут запускаться внутри отладчика и иметь доступ к большинству OllyDbg API. Плагин распространяется в исходниках, поэтому скажу пару слов про его сборку. Для его компиляции понадобится Visual Studio 2010, библиотека Boost, скомпилированный Boost.Python и 32-разрядная версия Python 3.x (было протестировано на 3.2). В зависимости от настроек ОС тебе, возможно, придется указать Boost все установленные в твоей системе версии Python, а затем выбрать нужную во время сборки. Это можно сделать, добавив в файл /boost-dir/tools/build/v2/user-config.jam строки вида:

Using python: 3.2: "C:/Program Files (x86)/Python32/python.exe" # path to your Python setup: : : 32 # x86-32 only ;

Главное тут - указать правильный путь до интерпретатора. После чего собрать Boost.Python с помощью команды:

Bjam --toolset=msvc-10.0 --build-type=complete --with-python python=3.2 address-model=32

Если возникнут какие-то трудности, то официальный мануал Boost должен помочь bit.ly/14FU7xP

OllyGraph

  • Для: OllyDbg v2.01

Одна из фич, которая меня особенно привлекает в IDA Pro, - возможно представить функцию в виде графа. Так намного удобнее анализировать код, сразу становится видно, каким образом мы дошли до того или иного участка, какие условия и как сработали. Плюс можно еще посмотреть граф вызовов, чтобы понять, из каких мест программы вызывается исследуемая функция. К счастью, данная возможность есть теперь и в OllyDbg, надо лишь установить плагин OllyGraph. Он позволяет представить программу в виде блок-схем, схожих с теми, что строятся в IDA Pro. Более того, для визуализации используется тулза wingraph32, входящая в состав иды. Для версии 1.10 есть альтернативный плагин OllyFlow bit.ly/14lNtpb - немного улучшенная версия OllyGraph от того же автора.


InjectHookLib

  • Для: OllyDBG v1.10

Довольно любопытное расширение, которое позволяет перехватывать системные вызовы из пользовательского режима. Техника перехвата интересна, поэтому рекомендую ознакомиться с ней в блоге автора (bit.ly/OjxUMj для Windows XP, bit.ly/NZW6Ci для Windows 7). Все, что требуется от пользователя, - установить плагин и написать свою DLL-библиотеку, в которой будут реализованы обработчики перехватываемых функций. Как ее реализовать, можно посмотреть по ссылкам или изучить исходный код примера bit.ly/168kcF2 , который любезно предоставил автор данного расширения. Такой плагин может пригодиться для решения различных задач, например при анализе вредоносных программ и распаковке.


uberstealth

  • Для: OllyDbg v2.01, IDA Pro

На какие только ухищрения не пойдут разработчики программ, чтобы защитить свое детище от исследования! Особенно такими подарками изобилуют различные упаковщики, хотя и среди обычных программ тоже довольно часто встречаются особи, нашпигованные антиотладочными приемами. Вручную обходить все эти защиты просто заморишься - тут уже одной правкой возвращаемого функцией IsDebuggerPresent значения не обойдешься. Вот и приходится использовать спецсредства в виде данного плагина. Поставляется он в исходниках, так что придется собирать вручную. Для этого понадобится библиотека Boost>=1.48.0, WTL (Windows Template Library)>=8.1, Windows Driver Kit >= 7.0, DDKBuild. Да-да, зрение тебе не изменило - WDK & DDK, так как для своего сокрытия отладчик использует драйверы. Ну и конечно же, Visual Studio 2008. Что интересно, плагин работает не только в OllyDbg, но и в IDA Pro.

Плагины первой необходимости

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

  • Command Bar bit.ly/14GHQcr - аналог встроенного плагина Command Line. Добавляет панель с командной строкой для ввода команд управления отладчиком, что позволяет ускорить процесс отладки.
  • PhantOm Plugin bit.ly/qyNqJO - антиотладочный плагин от российского разработчика для скрытия OllyDbg и исправления уязвимостей отладчика, эксплуатируемых протектором. Помогает от большинства распространенных методов обнаружения.
  • Похожим функционалом обладает плагин китайского происхождения StrongODbit.ly/gzazAd . Ходили даже слухи про обнаруженный в нем рипнутый код из PhantOm.
  • Антиотладочные свойства также присутствуют и в Olly Advanced bit.ly/14GI0An . Это своего рода швейцарский армейский нож, который, помимо прочего, расширяет функционал OllyDbg и устраняет некоторые раздражающие вещи и ошибки данного отладчика.
  • Не менее важный плагин - ODBGScript bit.ly/17Is2AM , позволяющий писать и выполнять скрипты для автоматизации необходимого процесса, например распаковки файлов.
  • Замыкает список OllyDump bit.ly/17Is4si - отличный дампер процесса со встроенным реконструктором таблицы импорта.

OllyMSDN

  • Для: OllyDbg v1.10, Immunity Debugger 1.7/1.8

Количество функций WinAPI огромно, и знать их все как свои пять пальцев просто нереально. Поэтому иногда приходится заглядывать в документацию, чтобы уточнить/узнать, что возвращает та или иная функция или какие параметры принимает на вход. К сожалению, стандартный файл помощи не может предоставить всю необходимую информацию, поэтому приходится запускать браузер и идти на MSDN. Так почему бы полностью не заменить этот файл online-документацией? Для этого всего-то надо установить плагин OllyMSDN, убедиться, что в качестве справки у нас стоит файл WIN32.HLP (Помощь -> Выбрать справку по API). Если такого файла нет, то необходимо создать пустой с таким именем и указать его Olly. Теперь, когда ты попытаешься в отладчике получить доступ к файлу справки, плагин перехватит функцию WinHelp() API и вместо старого файла откроет тебе сайт MSDN. А чтобы получить информацию о конкретной функции во время отладки, надо кликнуть правой кнопкой мыши на инструкцию call и выбрать пункт Help on symbolic name или просто нажать .


DetachMe

  • Для: OllyDbg v1.10

Одной из полезных фич, появившихся во второй версии OllyDbg, была функция Detach, которая позволяла «отсоединить» отладчик от исследуемого процесса, чтобы процесс мог дальше самостоятельно работать. К сожалению, в версии 1.10, любимой многими, такой функции нет - можно только присоединиться к исследуемому процессу. Но это можно исправить, поставив плагин DetachMe, который позволяет в любое время отсоединить отлаживаемые программы от OllyDbg и продолжить осуществлять внешний контроль над отладчиком. Кроме того, отключение программных и процессорных точек останова никак не повлияет на соответствующие udd-файлы.

OllyDbg PDK

Плагинов на все случаи жизни не бывает, поэтому рано или поздно может настать момент, когда придется «шить наряд» для Оли самому, чтобы решить очередную амбициозную задачу. В таком случае тебе понадобится PDK - Plugin Development Kit, который можно скачать с официального сайта bit.ly/18oD7t6 .

Ollydbg-backup

  • Для: OllyDbg v1.10 / v2.01

Во время работы над очередным бинарником реверсеру приходится добавлять достаточно много своей информации: писать комментарии к отреверсенным функциям, чтобы на следующий день не изучать заново алгоритм их работы и входные параметры, ставить брейкпоинты и так далее. Вся эта служебная информация автоматически сохраняется отладчиком в UDD-файле. Но случается так, что во время падений дебаггера или его очередной переустановки эти файлы теряются. И надо начинать анализ заново. Чтобы избежать такой печальной ситуации, можно воспользоваться плагином ollydbg-backup, который позволяет сделать бэкап этой информации, сохранив ее в CSV-файл, из которого ее можно легко загрузить обратно в отладчик. CSV-файл имеет следующую структуру:

RVA,label,comment

Заключение

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

Состав дистрибутива

Каталог OllyDbg110 - дистрибутив, скачанный с сайта программы

Каталог OllyDbgHelpRus - переведенная на русский язык официальная справка по отладчику OllyDbg. Взято с сайтаhttp://cracklab.ru/


2. Описание программы (взято из Help -а к программе)

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

Требования. Работает под Windows 95, 98, МЕ, NT или 2000, XP (не проверен на 100 %), на любом компьютере класса Pentium, но для удобной отладки Вам будет нужен по крайней мере процессор 300 мгц. OllyDbg требовательный к памяти. Если Вы собираетесь использовать дополнительные примочки (плагины), я рекомендую 128 или более Мбайт оперативной памяти.

Поддерживаемые процессоры: OllyDbg поддерживает все 80x86, Пентиум, MMX, 3DNow! , включая Athlon, команды SSE и соответствующие форматы данных. Но не поддерживает SSE2.

Настройка. Более чем 100 опцийуправляют работой программы.

Форматы Данных. Окна Дампа отображают данные во всех обычных форматах: HEX, ASCII, UNICODE, 16-и 32 разрядные целые/нецелые/hex числа, 32/64/80-bit с плавающей запятой, адресацию, дизассемблирование (MASM, IDEAL или HLA), PE заголовок или поток блока данных.

Справка . Этот файл содержит основную информацию, необходимую для понимания и использования Ollydbg. Если у вас есть справка по Windows API (win32.hlp, не включена по причинам авторских прав), Вы можете прикрепить её и получать мгновенную справку о системных вызовах.

Запуск приложения. Вы можете выбрать исполняемый файл в командной строке, выбрать в меню, перетащить файл в Ollydbg, перезапустить последнюю отлаживаемую программу или присоединиться к уже запущенному приложению. Ollydbg поддерживает текущую отладку. Инсталляция - не требуется, Вы можете запустить Ollydbg с гибкого диска!

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

Отладка файлов с отладочной информацией. Ollydbg читает информацию об отладке в Форматах MICROSOFT и Borland. Эта информация включает исходный текст и названия функций, меток, глобальных и статических переменных. Поддержка динамических (стек) переменных и структур очень ограничена.

Подсветка Кода. Дизассемблер может подсвечивать различные типы команд (переходы, условные переходы,помещение и извлечение из стека, вызов процедур, возвраты, привилегированные и недопустимые) и различные операнды (общие, FPU/SSE или сегментные/системные регистры, операнды памяти в стеке или в другой памяти, константы). Вы также можете создавать пользовательские схемы подсветки.

Потоки. Ollydbg способен отлаживать многопоточные приложения. Вы можете переключаться из одного потока к другому, приостанавливать, возобновлять и уничтожать потоки или изменять их приоритет. Окно Потоков отображает ошибки для каждого потока (например, возвращают вызов к GetLastError).

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

Сканер объектов. OllyDbg сканирует модули объекта (файлы) или библиотеки (оба в форматах OMF И COFF), извлекает код, сегментирует и определяет их местонахождение его в отлаживаемой программе.

Сканер импортируемых библиотек. Некоторые DLL экспортируют свои символы только ординалами (ordinal), которые не очень удобны для восприятия для человеческого глаза. Если у Вас есть соответствующая библиотека импорта, OllyDbg переводит ординалы назад в символьные имена.

Полная поддержка UNICODE. Почти все операции, доступные для строк ASCII также доступны для строк UNICODE, и наоборот.

Имена. OllyDbg показывает все импортированные и экспортируемые символы и имена из информации об отладке и в форматах Microsoft и Borland. Сканер Объектов позволяет распознавать функции библиотек. Вы можете добавлять ваши собственные значения и комментарии. Если функции в некоторой DLLэкспортируются ординалами, Вы можете прикрепить библиотеку импорта и восстановить первоначальные имена. OllyDbg также знает символьные имена многих констант, подобно окнам сообщений, ошибкам кода или полям разрядов, и декодирует их в вызовы известных функций.

Известные функции. OllyDbg распознает по имени более чем 2300 часто используемых Cи и API функции Windows и декодирует их параметры. Вы можете добавить ваши собственные описания, или назначить определенное декодирование. Вы можете установить брейкпоинт с записью на известной функции и записать параметры в файл.

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

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

SEHцепочки. Стек прослеживает и отображает цепочку SE хэндлов. Полная цепочка доступна в отдельном окне.

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

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

Ресурсы. Если API функция Windows ссылается на строковый ресурс, OllyDbg извлекает и показывает его. Поддержка других типов ограничена списком прикрепленных ресурсов, дампа и бинарного редактирования.

Контрольные точки (брейкпоинты). OllyDbg поддерживает все обычные виды контрольных точек: простые прерывания, условные прерывания, прерывания, которые записывают информацию (например, функциональные параметры) в журнал, контрольные точки на запись и доступ к памяти, аппаратные контрольные точки (только ME/NT/2000). В крайнем случае пошаговой отладки, INT3 контрольная точка может быть установлена на каждой команде в модуле. На процессоре 500 мгц под Windows NT, OllyDbg может обработать до 5000 прерываний в секунду.

Наблюдатели и инспекторы. Наблюдатели - выражения, оцениваемые каждый раз когда программа приостановлена. Вы можете использовать регистры, константы, адресные выражения, булевы и алгебраические операции любой сложности. Вы можете сравнивать ASCII и UNICODE строки. Инспекторы - это наблюдатели, которые содержат до 2 индексов и могут быть представлены как двумерная таблица, позволяющая декодировать массивы и структуры.

Обход динамической памяти. На Win95-основанных системах, OllyDbg составляет списки всех распределенных блоков динамической памяти.

Handles. На NT-основанных системах, OllyDbg составляет списки всех системных Handle, принадлежащих отлаживаемому приложению.

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

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

Прямая трассировка (Run tracе). Трассировка выполняет программу пошагово и записывает её выполнение в большой круговой буфер. Этот протокол содержит все регистры (кроме SSE), флаги и ошибки потока, сообщения и декодированные параметры известных функций. Вы можете сохранить оригинальные команды, которые облегчат отладку самоизменяемого кода. Вы можете определить условие прекращения отладки – введя интервал адресов, выражение или команду. Вы можете сохранить информации отладки в файл и сравнить два независимых выполнения программы. Трассировка позволяет обратно проанализировать хронологию выполнения в подробностях, миллионов команд.

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

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

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

Дополнения к программе. Вы можете добавить примочку к OllyDbg, или написать ваше собственное дополнение к программе. Дополнения к программе обращаются ко всем важным структурам данных, добавляют меню и ярлыки к существующим окнам OllyDbg и используют более чем 100 добавочных API функций. Плагины API хорошо документированы. Стандартный дистрибутив включает два дополнения к программе: Командная строка и Закладки.

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

Настройка. Вы можете определить пользовательские шрифты, цвет и схемы подсветки.

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

3. Сайт программы

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

Самый простой путь состоит в том, чтобы запустить 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 файл сейчас) - запишет, все зависимые от данного модуля данные в файл .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.

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). Прямая трассировка останавливается, когда встречает какое-либо условие. Условия включают:

Конечно, прямая трассировка требует много памяти, в среднем от 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 и окно прямой трассировки) установлена, Дизассемблер перейдёт к окну прямой трассировки.

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

Лучшие статьи по теме