Copyright: -=#  Wenden ©  #=-  2005


Вступление

Вступление

Что такое OllyDbg

Что нового в версии 1.10

 Официальный материал

Юридическая часть

Ваша безопасность и защита

Регистрация

Поддержка (нет)

 Перед запуском программы

Системные требования

Инсталляция

 Компоненты

Общие принципы

Дизассемблер

Ассемблер

Анализатор

Сканер объектов

Сканер импортированных библиотек

Как использовать  OllyDbg

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

Окно центрального процессора (CPU)

Брейкпоинты_(точки останова)

Дамп

Модули

Карта памяти

Windows

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

Потоки

Стек вызовов

Дерево Вызовов (Call Tree)

Опции

Поиск

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

Пошаговое выполнение и анимация

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

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

Сочетания клавиш

Дополнения к программе

Подсказки и советы

 Проблемы и извинения

Известные ошибки и проблемы

Извинения

   _-=<>=-_

О справочнике

OllyDbg © 2000-2004 OlehYuschuk, Все права защищены

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


Что такое OllyDbg

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

Версия 1.10  - заключительный выпуск. Этот проект закрыт, и я больше не буду поддерживать его. Но не бойтесь: Вскоре будет OllyDbg2.00, спроектированный с нуля!

Требования . Работает под 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 удобным и приятным отладчиком.


Что нового в версии 1.10

Версия 1.10 является последней. Этот проект закрыт, и я не буду больше поддерживать его. Но не волнуйтесь: скоро выйдет OllyDbg 2.00, заново разработанный «с нуля»!

• Наиболее важные новые особенности:

- Отладка отдельных библиотек (без исполняемого файла);

- Окно SEH цепочек;

- Подсказки анализа, которые помогают Анализатору расшифровывать неоднозначные куски кода;

- Брейкпоинты с записью и условия трассировки поддерживают счетчики проходов, которые указывают OllyDbg остановить выполнение после срабатывания брейкпоинта N раз или после N команд, добавленных в журнал трассировки;

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

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

- Новая опция Безопасности «Сохранять пользовательскую информацию вне модулей в главный .udd файл» позволяет сохранять брейкпоинты и комментарии, которые не принадлежат ни к одному из модулей;

- Прямая трассировка может отображать и записывать в файл измененные флаги;

- Максимальная длина строки аргументов увеличена с 1024 до 4096 символов;

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

• Новые функции плагинов:

- Функция обратного вызова ODBG _ Paused ( int  reason , t _ reg  * registers )  или её расширенная версия ODBG _ Pausedex ( int  reasonex , int  extmode , reg  * registers , DEBUG _ EVENT  * debugevent ) . Вызывается каждый раз, когда отлаживаемое приложение останавливается;

- Функция обратного вызова ODBG _ Plugincmd ( int  reason , t _ reg  * registers , char  * cmd ) . Вызывается, когда приложение останавливается на условном брейкпоинте и этот брейкпоинт содержит команды, передаваемые плагинам;

- Функция Settracecount ( ulong  count )  устанавливает число команд, которые необходимо выполнить перед остановкой трассировки;

- Функция Settracepauseoncommands ( char  * cmdset )  задает набор команд, на которых необходимо сделать остановку;

- Функции Getbreakpointtypecount ( ulong  addr , ulong  * passcount )  и Setbreakpointext ( ulong  addr , ulong  type , char  cmd , ulong  passcount )  поддерживают счетчик проходов в условных брейкпоинтах;

- Функция Listmemory ()  обновляет список блоков памяти.

• Исправленные ошибки:

- Опция меню Регистров «Копировать все регистры в буфер обмена» («Copy all registers to clipboard») теперь копирует и EAX;

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

- Меню «Перейти в окне Дампа» («Follow in Dump») теперь отображает более интуитивные элементы, если один из операндов - неявный указатель на стек (как в PUSH);

- OllyDbg теперь корректно дизассемблирует VxDCall и VxDJump, используемые драйверами Win95. Однако он ассемблирует их в один и тот же код. В почти невероятном случае, если кто-нибудь будет использовать эту псевдокоманду, пользователь должен правильно установить бит 0x00008000, чтобы различать вызов и переход;

- OllyDbg поддерживал ерунду вроде REP STOS FWORD [EDI] и компилировал её в REP STOS DWORD [EDI];

- Окно «Имена» («Names») иногда теряет свое содержимое после загрузки новых модулей;

- Ассемблер поддерживает упрощенную форму IMUL: IMULreg, const (дизассемблируется как IMULreg, reg,const);

- Дизассемблер использует размер адреса вместо размера операнда для определения размера непосредственного смещения (JMPFARssss:oooooooo);

- Табуляторы в исходном тексте комментариев Дизассемблера и информационной панели отображались маленькими квадратиками. Теперь они расширены до 8 пробелов;

- ARPL расшифровывался с 32-битными операндами (корректная расшифровка - ARPLr/m16,r16);

- Теперь OllyDbg должен корректно работать в режиме нескольких мониторов (но у меня нет возможности убедиться в этом);

- 2-байтовый INT 3 (CD 03) обрабатывался некорректно;

- Столбик «Хэндл» («Handle») удален из окна «Потоки» («Threads»). Этот столбик отображал хэндл, присвоенный потоку в OllyDbg. Такие хэндлы не имеют смысла в отлаживаемом приложении;

- Анализ вызывал ошибку на больших модулях из-за переполнения таблицы трассировки переходов;

- Нестандартные модули (с размером, не выровненным на 4096 байт) теряли всю пользовательскую информацию, такую, как брейкпоинты или комментарии;

- При попытке обхода вызова ExitThread() или ExitProcess(), OllyDbg пытался установить брейкпоинтINT3 на следующей команде, которая в некоторых случаях оказывалась данными;

- Запрос сбросить собранные данные прямой трассировки в файл приводил к записи неверных команд;

- OllyDbg не проверял, что папка . udd , указанная в файле .ini действительно существует;

- После двоичного редактирования, Дизассемблер не обновлял выделение, поэтому некоторая команда могла быть частично выделенной;

- OllyDbg вызывал сбой, когда он получал командную строку в форме «a.exe %.622496x» или аналогичной, похожей на строку формата;

- Окна дампа подчеркивали подстройки (fix-ups) вне области дампа памяти;

- Окно шестнадцатеричного редактирования могло вести себя непредсказуемо, когда пользователь переходил от одного представления к другому, и некоторые символы могли быть незавершенными;

- FSAVE/FRSTOR и FLDENV/FSTENV отображали неверный размер операнда при использовании с префиксом 66;

- Анализатор зависал (навсегда или на несколько минут), если функция с недостаточным числом параметров находилась близко от начала блока памяти;

- Косметическое: Диалог «Сохранить файл» («Save file») вызывается с помощью GetOpenFileName() вместо GetSaveFileName();

- ESP не записывается в файл, открытый в Runtrace, даже если установлена соответствующая опция;

- Данную (неправильную) команду MOVQWORD [1234],0 (как и многие другие между адресом в памяти и константой) Ассемблер смело компилировал в код с 8-байтовой непосредственной константой;

- При попытке открыть приложение с аргументами, заключенными в кавычки (a.exe "ab" "cd") второй раз, OllyDbg удалял внешние кавычки (a.exeab" "cd). Это не моя ошибка, честно, это недостаток GetPrivateProfileString () !

Что нового в версии 1.09 c

• Новые особенности:

- При пошаговом прохождении или анимации окно «Дизассемблер» («Disassembler») старается оставить 1 или 2 полностью видимых строк после текущей команды;

- Журнал трассировки сохраняет 16 старших бит регистра флагов;

- Новая быстрая клавиша Ctrl+P открывает окно «Изменения» («Patches»);

- OllyDbg экспортирует две новых функции: int  Attachtoactiveprocess ( int  newprocessid )  и HWND  Createpatchwindow ( void ) ;

• Исправленные ошибки:

- PEXTRW менял два своих операнда (регистр MMX и регистр общего назначения);

- Некоторые сообщения об ошибках перекрывались главным окном, когда оно устанавливалось «поверх всех»;

- OllyDbg распознавал некоторые абсолютно корректные PE файлы как поврежденные из-за неудачного размещения секций;

- LOCK не поддерживался с reg-reg или при отсутствии записи в память;

- Ассемблер сообщал о неверной мнемонике в команде IN, так как сканер смешивал мнемоники с оператором IN;

- Добавлена поддержка нестандартного короткого дополнительного заголовка PE (PEOptionalHeader);

- При остановке на аппаратномбрейкпоинте, OllyDbg не могу обходить некоторые команды, если были включены автоматические аппаратные брейкпоинты;

- Слишком длинный аргументы программ (длиннее 256 байт) приводили к сбою OllyDbg из-за переполнения буфера;

- Команда LEA с 16-битным адресованием распознавалась как «Superfluousprefix», так как она помечалась как не обращающаяся к памяти;

- Модификаторы NEAR/FAR подсвечивались случайными цветами;

- Проблемы с конвертацией японского текста UNICODE в набор байтов (не проверялось, так как я не знаю японского);

- Команды SETZ, SETO... с неиспользуемым Reg полем байта ModRegRM, не равным 0, не распознавались. Теперь OllyDbg предупреждает, если опция «Нестандартные формы команд» («Non-standardcommandforms») не активна;

- OllyDbg ассемблировал и дизассемблировал некорректную команду MOVCS,R16 без каких-либо предупреждений;

- Если бы вы нажали Alt+F2 (или X на панели инструментов), но затем решили не закрывать отлаживаемый процесс, OllyDbg все же удалил бы все данные процесса, делая отладку невозможной;

- Если размер исполняемого кода был меньше размера секции или размер модуля был меньше 1 блока памяти, анализ исчезал при прокрутке кода.

Что нового в версии 1.09 b

• Новые особенности:

- Менеджер изменений является самой важной новой особенностью. OllyDbg сохраняет все изменения, произведенные над отлаживаемым приложением в предыдущих сеансах отладки. Из окна «Изменения» («Patches») вы может быстро применить исправления или восстановить исходный код;

- С помощью одной команды вы можете скопировать в исполняемый файл все изменения, сделанные в модуле;

- Одно дочернее окно может быть установлено «поверх всех». Внимание, для поддержки этой возможности плагины должны передать WM_WINDOWPOSCHANGED в Tablefunction () ;

- Вы можете указать папки, где OllyDbg должен сохранять файлы .udd и искать плагины;

- Если на выделенную команду ссылается переход, OllyDbg может показать путь «переход с команды»;

- На системах NT, окно «Хэндлы» («Handles») отображает список хэндлов, принадлежащих отлаживаемому приложению;

- Если команда, которую вы набрали в диалоге Ассемблера содержит комментарий, он будет автоматически добавлен к этой команде;

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

• Улучшения анализа

- «Искать все межмодульные вызовы» («Searchforallintermodularcalls») включает теперь предсказанные вызовы;

- Опция трассировки регистров во всей процедуре. Предыдущий анализатор предсказывал регистры только внутри линейных частей кода (без переходов наружу);

- Опция, позволяющая Анализатору считать, что неизвестные функции сохраняют регистры EBX, ESI и EDI. Если это не так, содержимое регистров может быть предсказано некорректно, так что используйте эту опцию с осторожностью.

• Исправленные ошибки:

- В дереве вызовов OllyDbg временно забывал вызовы, предсказанные в предыдущем сеансе отладки с трассировкой регистров;

- Иногда OllyDbg создавал новый файл .udd (xxx_1, xxx_2 и т.д.) после каждого сеанса отладки.

Что нового в версии 1.09

• Новые особенности:

- В дополнение к режимам дизассемблирования MASM и IDEAL, версия 1.09 поддерживает также синтаксис HLA (HighLevelAssembly, разработанный РэнделломХайдом [RandallHyde]). HLA общедоступное программное обеспечение, вы можете скачать его вместе с документацией на http :// webster . cs . ucr . edu ;

- Анализатор знает, что вызовы kernel 32. ExitThread ()  и kernel 32. ExitProcess ()  не имеют возврата и интерпретирует их как конец процедуры;

- Если несколько модулей имеют одинаковое 8-байтовое имя, OllyDbg переименовывает их в xxx_1, xxx_2 и т.д.;

- Чтобы избежать смешивания файлов .udd в случаях, когда основное приложение и библиотека имеют одинаковое имя или если приложение использует библиотеки с одинаковыми именами в разных папках, OllyDbg добавляет _1, _2 и т. д. к именам файлов .udd. Эта возможность активна, если опция «Безопасность -> Игнорировать путь и расширение» («Security -> Ignorepathandextention») не отмечена;

- Опция синхронизации CPU с исходником;

- OllyDbg поддерживает относительные пути к исходным файлам в отладочной информации Borland, созданной BCC5.5;

- Движок отладки теперь может производить шаг с вхождением в неизвестные команды вроде SSE2 (новая опция Безопасности);

- Опция блокировки стека (т.е. окно стека не прокручивается при пошаговом прохождении);

- Панель регистров отображает отладочные регистры DR0..3,6,7. Отладочные регистры не сохраняются в журнале трассировки и вы не можете их менять. Вниманию создателям плагинов: размер структуры t_reg изменен!

- Из дампа исполняемого файла вы можете перейти к его образу в памяти в окне Дизассемблера или в панели дампа CPU;

- OllyDbg распознает «действительную» (недокументированную) инструкцию SAL, но, в соответствии с документацией Intel, ассемблирует её в SHL. Обе инструкции имеют одинаковый эффект;

- Новый недокументированный опкод:ICEBP (INT1);

- Поиск адресов и двоичных строк в стеке - теперь официально;

- Опция сохранения ширины столбцов в .ini файл;

- В дополнение к переходам, информационная панель CPU, список известных переходов и соответствующие меню отображают локальные вызовы текущей инструкции;

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

• Исправленные ошибки:

- Если вы закрываете отлаживаемую программу (Alt+F2), OllyDbg теперь корректно закрывает все открытые еюхэндлы. Открытыехэндлы делали перекомпиляцию исполняемого файла невозможной;

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

- OllyDbg корректно присоединяется к активному процессу из Менеджера задач. Внимание: формат записи JIT в реестре изменен (добавлены кавычки к имени файла), так что новая версия не будет распознавать старое описание JIT;

- Короткие (без операндов) формы INS и OUTS теперь распознаются как команды ввода/вывода;

- Исправлена некорректная расшифровка и ассемблирование SSE инструкций MOVHLPS и MOVLPS. Intel сделал это сложнее: MOVHLPS является формой register-register, а MOVLPS - формой register-memory одной и той же команды, и ведут они себя по-разному...

- Иногда OllyDbg рушится на «Выполнить до возврата» («Executetillreturn»). Здесь я забыл проверку на возможный указатель NULL;

- Даже когда главный модуль находится в системной папке, он считается пользовательским;

- И, наконец, несколько косметических улучшений.

Что нового в версии 1.08

OllyDbg 1.08 следующая «устойчивая» версия после 1.06. Я буду считать нечетные версии экспериментальными и размещать их только на моем сайте. (Тем не менее, вы можете свободно скачивать и распространять их). Зарегистрированные пользователи OllyDbg будут получать сообщения только о выходе четных версий.

Полный список изменений, которые я сделал после версии 1.06, слишком велик, чтобы поместить его здесь. Наиболее значимые изменения:

• Новые особенности:

- Поддержка отладочной информации форматах Microsoft, как это реализовано в dbghelp . dll . Включает форматы CodeView, COFF, PDB и SYM и (я надеюсь) все остальные форматы, которые будут добавлены в будущем;

- Стек вызовов, отслеживающий вложенные вызовы, даже если процедуры используют нестандартные прологи и эпилоги;

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

- Состояние кучи распознает все блоки памяти, распределенных в куче. К сожалению, эта опция не доступна на системах NT (NT, 2000, XP?);

- Подсветка кода. Вы можете подсвечивать различные типы команд, таких как FPU/MMX/SSE, условные и безусловные переходы, PUSH и POP, вызовы, возвраты, привилегированные, ошибочные и заполняющие команды. Опциональная подсветка операндов распознает основные, FPU/SSE и сегментные/системные регистры, операнды памяти в стеке (т.е. с обращением через ESP или EBP) и в обычной памяти. Дополнительно, подсветка различает константы, являющиеся правильными адресами памяти, и все остальные константы. Вы можете создавать свои схемы подсветки;

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

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

• Значительно усовершенствованный анализ:

- Увеличена скорость распознавания процедур;

- Распознавание циклов. По определению, это закрытая непрерывная последовательность команд (где последняя команда - переход на первую) с единственной точкой входа и любым числом выходов. Обратите внимание, что точка входа - не обязательно первая команда цикла;

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

- Анализатор распознает возвраты, которые используются как переходы (но только если нет промежуточных PUSH, POP или CALL), перемещение в стек 4- и 8-байтовых чисел с плавающей точкой, наподобие ADDESP,-4; FSTP [DWORDSS:EBP], и процедуры, которые служат как структурированные обработчики исключений (structuredexceptionhandlers; SEH);

- Информация о переходах хранится в файле .udd между сеансами, обеспечивая поддержку мгновенного вывода списка переходов к данному адресу («Переход от команды» («Jumpsfrom»));

- Анализатор автоматически расширяет функции с переменным числом аргументов (многоточие).

• Безопасность:

- OllyDbg пытается восстановить размер секции кода, когда размер и смещение кода в заголовке PE равны 0.

- Доступ к памяти, содержащей активный INT3 брейкпоинт (чтение или запись) и команда CLI считаются подозрительными при трассировке;

- OllyDbg предупреждает пользователя, если он не имеет прав администратора под NT;

- Если psapi.dll или dbghelp.dll, распространяемые с OllyDbg имеют более старые версии, чем те, что находятся в системной папке, то OllyDbg посоветует удалить локальные.

• Редкие или недокументированные команды и псевдонимы:

- AMD-специфические инструкции SYSCALL и  SYSRET;

- Недокументированная инструкция FFREEPSTn;

- Ассемблер понимает псевдомнемоники JNAE, JAE и SAL.

• Выражения:

- Выражения поддерживают несколько тысяч символических констант, таких как WM_PAINT или O_RDONLY;

- Новая арифметическая операция 'IN' в выражениях позволяет легко указывать диапазоны;

- Новая псевдофункция WINTEXT (псевдоним:GetWindowText) в выражениях возвращает текст ASCII окна с указанным хэндлом. Обратите внимание, что этот текст представляется как строковая константа, так что сравнения идет по всей его длине, но без учета регистра;

- Окно «Наблюдатель» («Watch») подсвечивает синтаксические ошибки и выделяет положение ошибки в выражении.

• Другие улучшения:

- Панель стека распознает блоки структурированных обработчиков исключений;

- Когда адрес имеет как символическое имя, так и ординал, предпочтение отдается символическому имени;

- Путь перехода выделяется серым, если условный переход не выполняется;

- Автоматическое пробуждение потока, которые вызывает WaitMessage();

- Профиль всего модуля или всего приложения, опция группировать смежные команды в профиль или считать каждую команду по отдельности;

- Окно «Дамп» («Dump») поддерживает непосредственное копирование изменений в исполняемый файл;

- Окно модулей отображает версии исполняемых файлов;

- Диалоги двоичного поиска имеют журнал из 10 последних использовавшихся строк;

- Окна, открываемые в нескольких копиях (как отдельные Dump или Names) сохраняют последнее выбранное оформление (шрифт, цвета, полосы прокрутки). Дамп памяти и дамп файла имеют различные оформления;

- Выполнение до пользовательского кода (быстрая клавиша:Alt+F9) позволяет вернуться в отлаживаемое приложение из системного кода.DLL считается системным, если он находится в системной папке;

- Возможности остановить программу на системномбрейкпоинте, точке входа модуля или WinMain();

- Возможность уничтожения потока;

- Возможность анализа всех модулей сразу;

- Поддержка выделения кода/данных с помощью Shift+LeftClick.

• Множество исправленных ошибок, среди них:

- Команды SFENCE/LFENCE/MFENCE расшифровывались некорректно;

- Команды FXSAVE/FXRSTOR вызывали сбой основной защиты (generalprotectionfault; GPF) когда OllyDbg пытался расшифровать 512-байтный операнд памяти;

- Ассемблер сообщал об ошибке при попытке ассемблировать SETcc;

- FSTSWAX компилировалось неправильно (с 16-битным префиксом);

- В окне «Ссылки» («References») иногда было невозможно перейти по адресу в Дизассемблер;

- «Шрифт (всё)» / «Цвета (всё)» («Font (all)» / «Colours (all)») не работали в панели дампа CPU;

- OllyDbg иногда блокировался при попытке завершить процесс, который остановился на исключении;

- После Ctrl+G в окне «Отладка» («Debug»), содержимое окна не обновлялось (но соответствующий элемент меню работал правильно);

- Текстовые константы в выражениях некорректно интерпретировали символы '\\', '\n' и т.д.

- Несколько других, не столь важных, ошибок и недостатков.


Юридическая часть

Информация о торговых марках

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

Лицензионное соглашение

Это Лицензионное соглашение ("Соглашение") сопровождает OllyDbg версии 1.10, средства разработки плагинов для OllyDbg версии 1.10 и связанные файлы ("Программное обеспечение"). Используя это Программное обеспечение, Вы соглашаетесь со всеми терминами и условиями Соглашения.

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

Программное обеспечение принадлежит OlehYuschuk("Автор") и - Copyright ( c ) 2000-2004 Oleh Yuschuk. Чтобы использовать это Программное обеспечение на постоянном основании или для коммерческих целей, Вы должны зарегистрировать его, заполнив регистрационную форму и послав ее Автору. Вы не должны регистрировать Программное обеспечение, если Вы используете его исключительно с высокоуровневым ассемблером Рэндалла Хайда (Randall Hyde). Если Вы - уже зарегистрированный пользователь  OllyDbg, у Вас нет необходимости регистрировать Программное обеспечение снова. Если Программное обеспечение зарегистрировано в компании или организации, любой человек в пределах компании, или организация имеет право использовать его на работе. Вы можете установить зарегистрированное Программное обеспечение на любом количестве запоминающих устройств, подобно жестким дискам, гибким дискам и т.д. и разрешается делать любое количество резервных копий этого Программного обеспечения.

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

a) копия содержит все файлы из оригинального дистрибутива и эти файлы остаются неизменными;

b) если Вы распространяете любые другие файлы (например, дополнения к программе) вместе с Программным обеспечением, они должны быть ясно отмечены как таковые, а также условия их использования не могут быть более ограничительными чем условия этого Соглашения; и

c) Вы не собираете никакой платы (если это не транспортные носители, подобно компакт-диску или дискете), даже если ваше распространение содержит дополнительные файлы.

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

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

b) Вы позволяете свободное распространение ваших дополнений к программе на условиях, подобных этому Программного обеспечения; и

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

Дистрибутивные файлы PSAPI.DLLи DBGHELP.DLL являются Microsoft(R) Redistributable файлы. Эти файлы должны быть установлены только в каталоге, где Программное обеспечение находится постоянно. Вы должны использовать поставляемый PSAPI.DLL только на Windows NT (R) 4.0. Вам не разрешается распространять PSAPI.DLL и/или DBGHELP.DLL отдельно от Программного обеспечения.

Это Соглашение охватывает только фактическую версию 1.10 OllyDbg и версии 1.10 OllyDbg Средства разработки дополнений. Все другие версии описаны в соответствии с отдельными Лицензионными соглашениями.

Справедливое использование

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


Ваша безопасность и защита

Следующие инструкции оотносятся к версиям 1.00 - 1.10 в настоящее время, когда я загружаю соответствующий архив (содержащий OllyDbg.exe и файлы поддержки) в Internet ("оригинал OllyDbg"). Они не обращаются ни к каким сторонним дополнениям к программе.

Я гарантирую  что оригинал OllyDbg:

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

- не читает, не изменяет системный реестр, если явно это не требуется, эти требуемые модификации ограничены следующими 6 ключами:

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

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AeDebug\Debugger  HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AeDebug\Auto

- не создает, не перезаписывает и не изменяет файлы в системных каталогах;

- не изменяет, если явно не требуется, никакой исполняемый файла или DLL на любом компьютере, включая OllyDbg непосредственно;

- регистрирует ваши действия отладки только при вашем явном запросе (кроме Хронологии Файлов, сохраняемой в ollydbg.ini и *.udd файлах с информацией отладки). Даже больше, я гарантирую, что без вашего разрешения OllyDbg создаёт или изменяет файлы только в каталоге, где он постоянно находится;

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

Если Вы нуждаетесь в подобной безопасности и защите относительно плагинов к OllyDbg, пожалуйста, войдите в контакт с авторами соответствующего плагина. Я не принимаю никакой ответственности за любые сторонние плагины. Поскольку исходный текст bookmark.dll свободно доступен, я также не принимаю никакой ответственности за эти плагины если они не загружены непосредственно с моего сайта в Internet.

Остерегайтесь вирусов. Хотя я проверил первоначальный архив несколькими вирусными сканерами, пожалуйста не предполагайте, что ваша версия OllyDbg свободна от вирусов или Троянских коней. Я не принимаю никакой ответственности за убытки любого вида, причиненные вашему компьютеру(ам) любыми вирусами или Троянскими конями, приложенными к любому из файлов, включенных в архив, или за убытки, причиной которых является изменение OllyDbg третьими лицами.


Регистрация

OllyDbg 1.10 - Copyright ( C ) 2000-2004 OlehYuschuk. Это не свободно распространяемое программное обеспечение. Чтобы использовать эту программу постоянно или для коммерческих целей, Вы должны зарегистрировать ее. Регистрация бесплатна и не принимает никаких финансовых или других обязательств с вашей стороны – достаточно быть справедливым и сообщить мне понравилось ли вам это программное обеспечение. Любые личные данные в форме регистрации являются дополнительными (используйте ваше прозвище или псевдоним, если Вы хотите).

Если Вы используете OllyDbg вместе с HLA Рэндалла Хайда (Трансляция Высокого уровня), Вы не должны (но все еще разрешено) регистрироваться.

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

Если Вы - уже зарегистрированный пользователь OllyDbg, Вы не должны регистрировать заново эту версию. Если Вы новый, пожалуйста прочтите лицензионное соглашение, заполните форму registration (register.txt) или скопируйте и заполните следующую секцию из справки и пошлите по электронной почте по адресу Ollydbg@t-online.de. Я сохраню вашу информацию конфиденциально и не буду давать ее третьим лицам, если в этом не будет необходимости в соответствии с законом.

Registration form for OllyDbg v1.10

To use OllyDbg, you must agree with  all  of  the  terms  and

conditions of the accompanying License  Agreement. All  other

answers are optional.

Name      ___________________________________________________

Title     ___________________________________________________

Company   ___________________________________________________

City,state___________________________________________________

Country   ___________________________________________________

Where did you find OllyDbg __________________________________

          ___________________________________________________

Are you going to write your own plugins

          (____) Yes    (____) No    (____) Don't know

I agree with all the terms and condition of the  accompanying

License Agreement (Very important! Please mark!)

          (____) Yes    (____) No

Date of registration ________________________________________

If you want to  receive  notifications when  OllyDbg 2.00 and

subsequent versions will be  ready, please  enter your  email

address here:

_____________________________________________________________

Thank you. If you have ideas how to improve OllyDbg and  make

it easier in use, or want to have some  new  features, please

let me know. Your opinion helps me a lot!

Your first idea: ____________________________________________

_____________________________________________________________

Your second idea: ___________________________________________

_____________________________________________________________

Your third idea: ____________________________________________

_____________________________________________________________


Поддержка (нет)

Доступная поддержка ограничена страницей в Internet http://home.t-online.de/home/Ollydbg. Отсюда Вы можете загрузить обнаруженные ошибки и новые версии. Чтобы получать уведомления о доступных обновлениях, пожалуйста, зарегистрируйтесь. Если у вас есть проблемы, пошлите электронную почту Ollydbg@t-online.de. Обычно я отвечаю в течение недели. Я оставляю за собой право разместить выборки из ваших электронных писем на моем сайте Internet, Если Вы явно не отвергаете это.

Я сделал исходные тексты Дизассемблера (версия без анализа и поддержки SSI) и Ассемблера (без поддержки SSI) доступными бесплатно согласно лицензии GPL. Вы можете загрузить их на моей странице.

Полный исходный текст доступен, но будет стоить немного денег. Смотрите, я потратил больше  года, чтобы написать эти 3.2  Мбайт плотного хорошо-документированного кода и данных и хочу кое-что взамен. Это - исполнение "clean-room", которое не содержит никакого стороннего кода. Вы можете заказать или целый исходный текст или его части подобно Дизассемблеру, Ассемблеру или Анализатору. Чтобы получить подробную информацию, пошлите мне письмо.

Описание .udd формата файла свободно и доступно при запросе.


Системные требования

Чтобы запустить и работать с OllyDbg, Вам необходимо по крайней мере:

- 586 процессор (166 МГЦ или выше рекомендуется)

- Microsoft Windows 95 (OSR2), Windows 98, Windows ME, Windows NT 4.0 (Service Pack 2+), Windows 2000 или Windows XP. (Названия используются только для целей идентификации, добавьте столько ® символов, сколько хотите)

- Физическая память на 64 МБАЙТА (128 + МВ, рекомендуется)

- По крайней мере 1 МБ свободного пространства на диске

- Разрешение монитора 800x600 (1024x768 или выше настоятельно рекомендуется)

- Мышь или иное совместимое устройство

Чтобы отлаживать программы на Windows NT, 2000 или XP, Вам, необходимо иметь права администратора.

OllyDbg не способен отлаживать .NET приложения.

Win32s (32-битные расширения для Windows 3.1) не поддерживает все важные функции отладки. OllyDbg не будет работать под Win32s.

См. также: Проблемы с локализованными версиями операционных систем


Инсталляция

OllyDbg не требует никакой инсталляции. Просто создайте новую папку, и распакуйте архив Odbg110.zip  в эту папку. В случае необходимости, перетащите ollydbg.exe на рабочий стол, чтобы создать ярлык.

Чтобы запускать OllyDbg на WindowsNT 4.0, Вам необходим файл psapi.dll. Чтобы читать символическую информацию об отладке в форматах Microsoft (CodeView, COFF, PDBи SYM), Вам необходим dbghelp.dll. Это - Распространяемые Microsoft файлы и они включены в архив. Некоторые дистрибутивы Windows уже содержат эти библиотеки. Если OllyDbg обнаружит, что существующая библиотека имеет более высокую версию или если psapi.dll не требуется, то OllyDbg попросит вас удалить ненужные файлы из каталога OllyDbg.

Некоторые старые версии Windows 95 не включают функции API VirtualQueryEx и VirtualProtectEx. Эти функции очень важны для отладки. Если OllyDbg сообщает, что функции отсутствуют, нормальная отладка вряд ли будет возможна. Пожалуйста, обновите вашу OS.

См. также: Ваша безопасность и защита


Общие принципы

Я надеюсь, что Вы знакомы с внутренней организацией 80x86-совместимых процессоров и имеете опыт создания программ на Ассемблере. Я также надеюсь, что Вы знакомы с Microsoft Windows.

OllyDbg - однопроцессный, многопоточный отладчик анализирующий на уровне кода 32-битные программы и библиотеки динамической связи (DLL), выполняющиеся под Windows 95, Windows 98, Windows МЕ, Windows NT и Windows 2000. Он позволяет Вам производить отладку и исправлять исполняемые файлы в PE (Портативный Выполнимый) формате. "Уровень кода" здесь означает, что в большинстве случаев Вы работаете с битами низкого уровня, байтами и командами процессора. OllyDbg использует только зарегистрированные Win32 API вызовы, поэтому позволяет Вам использовать этот отладчик на следующих производных 32-битных операционных системах Windows. OllyDbg работает под Windows XP, но я не проводил никаких исчерпывающих испытаний, поэтому не могу гарантировать полные функциональные возможности.

Обратите внимание, что  OllyDbg  не может отлаживать  . NET  приложения.

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

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

Иногда случается неожиданное крушение приложения, когда оно выполняется без отладчика. Вы можете установить OllyDbg как текущий отладчик (just-in-time), присоединять его к программе и указывать место, где  произошла ошибка.

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

OllyDbg постоянно ориентируется на модуль.Модуль - главный исполняемый файл (обычно с расширением .EXE) или динамически загружаемая при запуске или по динамическому вызову библиотека (обычно .DLL). В течение сеанса отладки Вы устанавливаете брэйкпоинты, определяете новые метки и коментарии для команд ассемблера. Когда некоторый модуль выгружается из памяти, Отладчик сохраняет всю информацию в файл с тем же самым названием, что и отлаживаемый модуль с расширением .UDD (stays for User-Defined Data). В следующий раз, когда OllyDbg загружает этот модуль, он автоматически, восстанавливает всю информацию об отладке, независимо от той программы, которая использует этот модуль. Предположим, что Вы производите отладку Myprog1 , которая использует Mydll и устанавливаете несколько брэйкпоинтов в Mydll . Когда Вы начинаете отладку Myprog2 , которая также использует Mydll - все брэйкпоинты в Mydll сохраняются, даже если Mydll загружается из различных местоположений!

Некоторые отладчики обрабатывают память об отлаживаемом процессе как отдельную (и главным образом пустую) область размером 2**32 байт. OllyDbg применяет другой подход. Здесь, память состоит из нескольких независимых блоков. Любая операция в содержимом памяти ограничена блоком. В большинстве случаев, это прекрасно работает и облегчает отладку. Но если, например, модуль содержит несколько выполняемых секций, Вы не сможете увидеть весь код сразу. Однако такие случаи, являются исключением.

OllyDbg- "голодный" до памяти. OllyDbg выделяет до 3 МБАЙТ памяти непосредственно на запуск, а остальные мегабайт или два, когда Вы первый раз загружаете программу для отладки. Каждый анализ, резервное сохранение, трассировка или дамп файла используют ещё память, так что пожалуйста не паникуйте, когда производите отладку большого проекта, и Диспечер Задач показывает 40 или 60 занятых мегабайт.

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

Прежде всего, OllyDbg содержит встроенный анализатор кода. Анализатор просматривает код, отделяет команды от данных, распознает различные типы данных, процедуры, расшифровывает параметры стандартных функций API (около 1900 наиболее часто используемых) и пытается предположить число параметров неизвестных функций. Вы можете добавлять ваши собственные описания функций. Он может отмечать точки входа и адреса переходов, распознавать управляемые таблицей переключатели (switches) и указатели на строки (strings), добавлять комментарии и даже показывать направления переходов (jumps). Основываясь на результатах анализа, Дерево вызовов (call tree) показывает, какие функции выполняют вызовы процедур (прямо или косвенно) и распознает рекурсивные, системные и leaf процедуры. В случае необходимости, Вы можете установить подсказки расшифровки (decoding hints) которые помогают анализатору расшифровывать неоднозначные части кода или данных.

OllyDbg также включает в себя Сканер Объектов. Если Вы имеете библиотеки или файлы, Сканер расположит функции библиотеки в отлаживаемом приложении. Вызовы (CALL) стандартных функций занимают существенную часть всех вызовов функций (до 70 %, согласно моим оценкам). Если Вы знаете, какая функция будет вызвана, это не будет отвлекать ваше внимание, и Вы можете просто перейти через вызов (step over the call). Анализатор знает по имени больше 400 стандартных C-функций, такие как fopen или memcpy. Однако Я должен  признать, что OllyDbg в данной версии не способен располагать короткие (состоящие не более чем из возврата (retn)) или подобные функции (которые различаются только по перемещениям).

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

Объектно-ориентированные языки, подобно C++, используют методику искожающую имена (name mangling), которая добавляет информацию относительно типов и параметров к символу. OllyDbg может "расшифровывать" (demangle) такие имена, делая программу более читаемой.

OllyDbg полностью поддерживает UNICODE. Почти все, что Вы можете делать со строкой ASCII, возможно с UNICODE.

Все команды Ассемблера очень похожи. И часто случается, что Вы не знаете, трассировали Вы уже этот сегмент кода или нет. В OllyDbg Вы можете добавлять собственные метки и писать комментарии. Это очень облегчает отладку. Заметьте, что, как только Вы добавили комментарий в какой-либо DLL файл, комментарии и метки будут доступны каждый раз, когда загружается этот DLL - даже если Вы делаете отладку различных приложений.

OllyDbg отслеживает (трассирует) стандартные фреймы стека (созданные путём PUSH EBP; MOV EBP,ESP). Современные компиляторы имеют опцию, которая отключает генерирование фреймов стека, в этом случае просмотр стека - невозможен. При выполнении программы когда встречается вызов (call) какой-либо известной функции, окно стека расшифровывает его параметры. Окно "Стек вызовов" (Call stack) отображает последовательность вызовов, ведущих к фактической точке выполнения.

Современные OO приложения интенсивно используют структурированные обработчики исключений (SEH). SEH окно отображает цепочку обработчиков исключения.

Много различных параметров поиска позволяют Вам находить бинарный код или данные, команду или последовательность команд, константы или строки, символические названия или записи в буфере трассировки (run trace buffer).

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

OllyDbg поддерживает все стандартные виды брейкпоинты  - без условия и с условием, на чтение и доступ к памяти, аппаратные брэйкпоинты или на доступ к целому блоку памяти (последние два работают только под Windows МЕ, NT, 2000 или XP). Условные выражения могут быть комплексными („прерваться, когда установлен 2-ой бит в [ESP+8], и слово по адресу 123456 - меньше чем 10, или EAX указывает на строку UNICODE, которая начинается с 'ABC', но пропустить первые 10 прерываний"). Вы можете определить одну или несколько команд, которые OllyDbg использует в плагинах когда приложение делает паузы. Вместо приостановки, Вы можете запрашивать запись значения другого выражения (с кратким объяснением) или запись параметров функций, известных OllyDbg. На Athlon2600 + под Windows 2000, OllyDbg может обрабатывать до 25000 условных прерываний в секунду.

Другая полезная особенность. OllyDbg поддерживает два вида трассировки: пошаговая  (hit) и обычная (run). В первом случае, OllyDbg устанавливает брэйкпоинт на каждой команде в указанном диапазоне (например, в целом выполняемом коде). После того, как команда достигнута, OllyDbg удаляет брэйкпоинт и помечает команду как пройденную. Это позволяет сразу же проверить был ли какой-либо переход кода выполнен или нет. Пошаговая трассировка - наиболее быстрая, когда запускается небольшое приложение она достигает почти полной скорости. Так как INT3 брэйкпоинт может привести к плохим последствиям, когда он установлен на данных, я рекомендую, не использовать нечеткое распознавание процедур. Пошаговая трассировка вообще не доступна, когда код не проанализирован.

Запуск обычной трассировки (Run trace)выполняет программу шаг за шагом и делает запись точной истории выполнения вместе с содержанием всех регистров, известных параметров и произвольных команд (это помогает, когда код самоизменяется). Конечно, это требует много памяти (в зависимости от режима, от 15 до 50 байт на команду) но позволяет осуществлять точную обратную трассировкуи анализ. Вы можете выполнять трассировку только выбранной части кода, или даже отдельных команд, или можете пропускать квазилинейные части, которые не имеют никакого интереса. Для каждого адреса, OllyDbg вычисляет сколько раз этот адрес встречается в протоколе трассировки, осуществление медленного, но всестороннего профилировании. Например, специальная команда позволяет Вам установить брэйкпоинт на трассировку на каждом входе в распознанную процедуру, тогда профилирование даст Вам представление, как часто вызывается каждая подпрограмма. Трассировка может автоматически делать паузу на команде, диапазоне адресов или счетчике.

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

Вы можете сделать мгновенный снимок (называемый резервной копией (backup) блока памяти. OllyDbg выделит все изменения. Вы можете сохранить резервную копию файла и прочитать её снова, вычисляя различия между двумя файлами. Вы можете просматривать резервные копии, искать  измененную часть, или отменять все или выбранные изменения. Менеджер Изменений (Patch manager)  помнит все изменения, применённые к отлаживаемому приложению в предыдущих сеансах и может применить их снова.

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

Вы не можете использовать OllyDbg под 16-битными Windows с Win32. Это 32-битное расширение не осуществляет все необходимые функции отладки.

Вы не можете отлаживать ни DOS, ни 16-битных NE (Новый Выполнимый) файлов, и у меня нет  никаких планов поддерживать это в будущем.

R.I.P., старое доброе приглашение к вводу команды!


Дизассемблер

Disassembling syntax:  (Синтаксис дизассемблера)

    MASM (Microsoft)

   IDEAL (Borland)

   HLA (Randall Hyde)

Borland's TASM поддерживает режим IDEAL, который (по моему скромному мнению, конечно) намного лучше, чем MASM. К сожалению, инструментальные средства Microsoft не поддерживают его, поэтому, по причине совместимости, программисты обычно используют изворотливый MASM синтаксис. В отличие от остальных, синтаксис IDEAL требует, чтобы все, что входит в операнд памяти, было взято в квадратные скобки.

Ассемблер Высокого уровня, созданный Randall Hyde делает простым для новичков процесс написания больших структурированных программ на языке Ассемблера, используя все же другой, функциональный синтаксис, где первый операнд - источник. HLA - публичное программное обеспечение, Вы можете загрузить его вместе с документацией и исходниками с http://webster.cs.ucr.edu . Сравните:

  MASM:                   MOV EAX,DWORD PTR SS:[EAX+EBP+20]

  IDEAL:                   MOV EAX,[DWORD SS:EAX+EBP+20]

  HLA:                      mov ( [type dword ss:eax+ebp+20], eax );

Ассемблер воспринимает команды HLA только в режиме HLA. По умолчанию, OllyDbg использует MASM синтаксис.

Disassemble in lowercase  (Дизассемблировать в нижнем регистре)

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

Tab between mnemonics and arguments  (Отступ между мнемоникой и параметрами)

Когда опция включена, OllyDbg выравнивает параметры команды так, чтобы они начинались в 8-ом столбце.

Extra space between arguments  (Дополнительное пространство между параметрами)

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

Show default segments  (Показать заданные по умолчанию сегменты)

80x86 команды всегда используют несколько сегментных (selector) регистров при доступе к памяти. Когда сегментный регистр отличается от значения по умолчанию для данной команды, ему должна предшествовать команда с приставкой, изменяющей сегмент. Если опция «Отображать сегментные значения по умолчанию» включена, адрес в дизассемблере всегда включает название сегментного регистра. Если опция выключена, сегментный регистр отображается только, когда он отличается от значения по умолчанию. Заметьте, что под Win32 все заданные по умолчанию сегменты имеют основание 0 и указывают на одну и ту же область памяти.

Always show size of memory operands  (Всегда показывать размер операндов памяти)

Когда эта опция включена, адрес памяти в дизассемблере всегда включает модификатор размера данных (BYTE, WORD, DWORD и т.д.) Когда опция отключена, модификатор размера данных отображается только когда не является тривиальным или не очевиден для данной команды. Например, размер операнда памяти в команде MOV [ESI],EAX - 4 байта, потому что регистр EAX- имеет длину 4 байта, но в MOV [ESI],1 адресуемая память может быть длиной 1, 2 или 4 байта .

Show  NEAR jump modifiers  (Отображать модификаторы переходов NEAR)

Когда опция включена, OllyDbg будет добавлять модификатор адреса NEAR ко всем внутрисегментным косвенным переходам или вызовам. Дальние переходы и вызовы редко используются в модели Win32.

Show loca lmodule name  (Отображать локальное название модуля)

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

Show symbolicaddresses  (Отображать символьные адреса)

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


Ассемблер

Встроенный в OllyDbg Ассемблер преобразовывает текстовые команды в машинный код. Многие из 80x86 команд имеют несколько возможных кодировок. В этом случае, Ассемблер пробует выбрать самую короткую форму. Ассемблер и Дизассемблер  совместно используют одну и ту же таблицу расшифровки, так если некоторая команда может быть дизассемблирована, она также может быть ассемблирована, с одним исключением: не поддерживаются 16-битные способы адресации. Ассемблер также понимает, упрощенную и дополнительную мнемонику, подобно MOVSB (Дизассемблер расшифровывает это как MOVS BYTE PTR ES: [EDI], BYTE PTR DS: [ESI]) или JNE(расшифровывается как JNZ). В зависимости от установленных опций, Вы можете печатать команды на языке ассемблера, используя синтаксис Microsoft's MASM или  Borland's IDEAL:

  MOV EAX, DWORD PTR SS: [EBX*2] [EDI+10]. Является эквивалентом

  MOV EAX, [DWORD SS:EBX*2+EDI+10.]

Ассемблер интерпретирует все константы как hexadecimal, если они явно не заканчиваются десятичной точкой. Не забудьте поставить перед константой 0, если первый символ - буква!

Ассемблер обрабатывает точку с запятой (;) и все символы после неё как комментарий. Если Вы правите код, этот комментарий будет добавлен к команде.

Ассемблер автоматически решает, какой регистр использовать как index, а какой как base и поддерживает даже такие сверхъестественные случаи как:

MOV EAX, [ESI*9] (эквивалент MOV EAX, [ESI+ESI*8])

Или

MOV EAX, [ESI+EDI+ESI] (эквивалент MOV EAX, [EDI+ESI*2])

Ассемблер также воспринимает символические имена. Есть некоторые правила, которым Вы должны следовать:

  - OllyDbg не проверяет уникальность метки, а берет первое найденное упоминание. Чтобы ограничивать         поиск в некотором модуле, указывайте метку с именем модуля JMP Myprog. Firstroutine.

  - Определяемые пользователем метки могут содержать пробелы и специальные символы. Ассемблер не     воспринимает эти метки.

  - Чтобы использовать таблицы импорта, Вы должны определить модули адресата и резидента: JMP      Myprog. <*KERNEL32. VirtualFree>.

80x86 набор команд содержит только команды XCHG mem,reg и TST mem,reg но Ассемблер поддерживает также XCHG reg,mem иTST reg,mem.

Вы будете предупреждены, если установите LOCK префикс с командой, которая не воспринимает его.

Неточные команды

При поиске команды, Вы можете определить неточную команду Assembler'a. Используя следующие ключевые слова:

Ключевое слово               Сравнение

R8                                    Любой 8-битный регистр (AL,BL, CL, DL, AH, BH, CH, DH)

R16                                  Любой 16-битный регистр (AX, BX, CX, DX, SP, BP, SI, DI)

R32                                  Любой 32-битный регистр (EAX, EBX, ECX, EDX, ESP, EBP, ESI, EDI)

FPU                                 Любой FPU регистр (ST0.. ST7)

MMX                                Любой MMX регистр(MM0.. MM7)

CRX                                 Любой контрольный регистр (CR0.. CR7)

DRX                                 Любой регистр отладки (DR0.. DR7)

CONST                            Любая константа

OFFSET                          Аналогично CONST

И неточные команды:

Команда                             Сравнение

JCC                                    Любой условный переход (JE, JC, JNGE...)

SETCC                               Любой условный набор байтов (SETE, SETC, SETNGE...)

CMOVCC                           Любое условное смещение (CMOVE, CMOVC, CMOVNGE...)

Смотри также: Поиск последовательности комманд.


Анализатор

OllyDbg включает в себя быстрый и мощный анализатор кода. Чтобы запустить его, используйте контекстное меню, нажмите Ctrl+A  в панели Дизассемблер окна CPU, или выберите «Analyze all modules » («Анализировать все модули») в окне «Executable  modules » («Модули»).

Анализатор высокоэвристичен. Он отличает код от данных, отмечает точки входа и адреса переходов, распознает таблицы переключателей (switch tables), строки ASCII и UNICODE, располагает процедуры, циклы, переключатели высокого уровня и расшифровывает параметры стандартных функций API (см. пример). Другие составные части OllyDbg интенсивно используют данные анализа.

Как это возможно? Я открою Вам часть этого (Чуда). При первом проходе приложения OllyDbg расшифровывает каждый возможный адрес в пределах секции кода и считает все найденные вызовы (CALL) к каждому адресу. Конечно, многие из этих вызовов - подделки, но маловероятно, что два неправильных вызова укажут на ту же самую команду, и почти невозможно, что три. Итак, если есть три или более вызовов к тому же самому адресу, я уверен, что этот адрес - точка входа некоторой часто используемой функции. Начиная с расположенных входов, я прослеживаю все переходы и вызовы, и так далее. Таким образом я располагаю команды, в которых уверен на 99.9 %. Однако некоторые байты не находятся в этой цепочке. Я исследую их с помощью 20 высокоэффективных эвристических методов (самый простой напоминает: «Прямой доступ к первым 64K памяти, как, например, в MOV [0], EAX, не разрешён»). Иногда анализ не в состоянии правильно распознать существующий код. Есть два выхода в этой ситуации: удалить анализ из выбранного фрагмента (клавиша BkSpc ) и OllyDbg будет использовать расшифровку по умолчанию (disassembly). Или, установить подсказки расшифровки (decoding hints) и повторить анализ. Обратите внимание, что в некоторых редких случаях, когда Анализатор уверен, что ваша подсказка не применяется или вступает в противоречие, он может проигнорировать ваше предположение.

Обнаружение процедур осуществляется также довольно просто. Процедура, с точки зрения Анализатора, является непрерывной частью кода, где начиная с точки входа можно достичь (по крайней мере, теоретически) все другие команды (исключая NOP'ы или подобные «пробелы», которые заполняют промежутки выравнивания). Вы можете определить один из трех уровней распознавания. Строгая процедура имеет только одну точку входа и по крайней мере одно возвращение. На эвристическом уровне Анализатор пробует воспринимать точки входа отдельно. И если Вы выбираете нечеткий режим, более или менее цельная часть кода будет рассматриваться как отдельная процедура. Современные компиляторы делают глобальную оптимизацию кода, которая разбивает процедуру на несколько частей. В таком случае нечеткий режим особенно полезен. Однако вероятность неверного истолкования в этом случае является довольно высокой.

Аналогично цикл (loop) - это закрытая непрерывная последовательность команд, где последняя команда - переход на первую с единственной точкой входа и любым числом выходов. Циклы соответствуют операторам высокого уровня, таким как do , while  и for . OllyDbg распознает вложенные циклы любой сложности. Они отмечены длинной жирной круглой скобкой в окне Дизассемблер. Если вход - не первая команда в цикле, OllyDbg отмечает её маленьким треугольником .

Чтобы реализовать переключатель, многие компиляторы загружают переменную переключателя (switch variable) в регистр, а затем вычитают его части, как в следующей последовательности:

    MOV EDX,<занесение в регистр переменной переключателя (switch variable)>

     SUB EDX,100

     JB DEFAULTCASE

     JE CASE100        ; Случай 100

     DEC EDX

     JNE DEFAULTCASE

     ...               ; Случай 101

Эта последовательность может также включать одно- и двух- уровневые таблицы переключателей, прямые сравнения, оптимизацию и т. д. Если Вы забрались достаточно глубоко в дерево сравнений и переходов, то бывает очень трудно определить, какой случай является искомым. OllyDbg сделает это за Вас. OllyDbg отмечает все случаи, включая значения по умолчанию, и даже пытается предполагать значения случаев, подобно ''А", WM_PAINT или EXCEPTION_ACCESS_VIOLATION. Если последовательность команд не изменяет регистр (то есть состоит только из сравнений), то это - вероятно не переключатель (switch), а каскадный оператор if :

     if (i==0) {...}

     else if (i==5) {...}

     else if (i==10) {...}

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

OllyDbg содержит, внутренний откомпилированный ресурс, c описанием более 1900 часто используемых функций API. Этот список включает KERNEL32, GDI32, USER32, ADVAPI32, COMDLG32, SHELL32, VERSION, SHLWAPI, COMCTL32, WINSOCK, WS2_32 и MSVCRT. Вы можете добавлять ваши собственные описания. Если Анализатор сталкивается с вызовом к функции с известным названием (или вызов делает переход к такой функции), он пробует расшифровать команды PUSH, которые обязательно предшествуют этому вызову. Следовательно, Вы можете определять значения вызовов на глаз. OllyDbg имеет также описания приблизительно 400 стандартных С-функций. Если Вы расшифровываете оригинальные библиотеки, я рекомендую, чтобы Вы просканировали объектные файлы перед анализом. В этом случае, OllyDbg также расшифрует параметры известных С-функций.

Если опция «Guess number of arguments of unknown functions» («Предполагать число параметров неизвестных функций») установлена, Анализатор пробует определять число двойных слов, которые вызывающая процедура, кладёт в стек, и отмечает их как параметры Arg1, Arg2  и так далее. Заметьте, что регистровые параметры, если таковые вообще имеются, остаются нераспознанными и не включены в эту графу. Анализатор идет безопасным путём. Например, он не распознает процедуры без параметров или в случаях, когда POP может восстанавливать регистры перед возвратом (return) вместо сброса параметров. Однако число распознанных функций обычно очень высокое, что довольно сильно улучшает удобочитаемость кода.

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

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

К сожалению, не существует общих правил, чтобы произвести на 100 % точный анализ. В некоторых случаях, например, когда модуль содержит, p -код или большое количество данных, внедренных в раздел кода, анализатор может интерпретировать части этих данных как код. Если статистический анализ показывает, что код, вероятно, упакован или зашифрован, Анализатор предупредит Вас. Если Вы хотите использовать hit  trace, я рекомендую, не использовать нечеткий анализ, иначе высока вероятность, что брэйкпоинт будет установлен на неправильных данных.

Самоизвлекаемые файлы обычно имеют распаковщик вне «официального» раздела кода. Если Вы выбираете опцию SFX «Extend code section to include self-extractor» («Расширять раздел кода чтобы включить в него распаковщик»), OllyDbg будет удлинять раздел кода, формально позволяя анализировать его и применять hit trace или выборочно run trace.

См. также: сканер Объектов, опции Анализа - 1 часть, опции Анализа - 2 часть, опции Анализа - 3 часть, Дерево вызовов .


Сканер объектов

Сканер объектов берет указанные файлы объекта или библиотеки (в форматах OMFи COFF), извлекает сегменты кода и затем пробует располагать эти сегменты в секции кода текущего модуля. Если сегмент размещён, Сканер добавляет названия из файла объекта в информацию об отладке (так называемые метки библиотек). Это очень улучшает понимаемость кода и данных.

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

См. также: Анализатор, Implib сканер.


Сканер импортированных библиотек

Некоторые DLL экспортирует свои символы только ординалами. Такие символы появляются как отдельные числа (например MFC42. #1003) обычно не очень значащие для людей. К счастью, разработчики программ обычно добавляют библиотеки импорта (implibs-import libraries), которые связывают ординалы с символическими названиями. OllyDbg может использовать эти символы.

Чтобы использовать implib сканер, выберите "Debug -> Select import libraries" (Отладчик -> Выбрать импортируемые библиотеки) из главного меню программы и введите названия требуемых библиотек импорта. Когда Вы загружаете приложение, OllyDbg читает эти библиотеки и извлекает названия во внутреннюю таблицу. Каждый раз когда OllyDbg сталкивается со ссылкой к ординалу из зарегистрированной IMPLIB, она заменяет этот символ -  символическим названием.

См. также: Анализатор, сканер Объектов


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

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

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

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

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

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

OllyDbg может действовать как отладчик « 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, Вам, вероятно, придется иметь права администратора, чтобы отлаживать программы.


Окно центрального процессора

Для Вас как для пользователя, окно CPU наиболее важно в OllyDbg. Здесь Вы будете проводить большую часть времени, делая отладку ваших приложений. Это окно состоит из пяти окон с регулируемыми размерами:

  Окно дизассемблера

  Информация

  Дамп

  Регистры

  Стек

Нажимайте TAB , чтобы по очереди активизировать эти области окна CPU (по часовой стрелке).

Нажимайте Shift+TAB , чтобы по очереди активизировать эти области окна CPU (против часовой стрелки).

См. также: Контекстно-зависимая справка API.


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

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» - «Карта памяти»), вторая строка - заголовки столбцов, все последующие строки - записи данных памяти. Копия сохраняет ширину столбцов. Чтобы исключить какой-либо столбец из копируемого, уменьшите его ширину до минимума (оставшаяся часть столбца станет серой).

Appearance (Оформление) - смотрите здесь.


Окна

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

 NT системы скрывают адрес процедуры окна (функция, которая обрабатывает все сообщения в окне). Это эффективно отключает подклассификацию окон, принадлежащих различным процессам, но создает проблемы для отладчика. OllyDbg может читать адрес процедуры окна, выполняя GetWindowLong  в контексте отлаживаемого приложения, используя вставки в код. Этот метод занимает много времени и иногда (особенно для приложений с большим количеством потоков) опасен. Я использую его только, когда отлаживаемое приложение делает паузу, и вставка допускается опцией «Allow code injection to get address of WinProc»(Разрешить вставку кода для получения адреса WinProc).

Из-за недостатка места, много столбцов в этом окне содержат дополнительную информацию, которая обычно скрывается в столбцах. Например, столбец WinProc отмечает подклассовые окна (процедура окна - не то же самое что процедура класса), столбец ID отображает идентификатор элемента управления в десятичной форме, а Стиль расшифровывает стиль окна как набор флажков WM_xxx. Чтобы просмотреть дополнительную информацию, измените ширину соответствующего столбца.

Вы можете устанавливать брэйкпоинт на сообщении окна, например WM_PAINT, или на группе сообщений, подобно сообщениям мыши.

Чтобы устанавливать брейкпоинт на сообщении, OllyDbg создает, специально подготовленный условный брейкпоинт с записью (conditional logging breakpoint) с пояснением "<WinProc>". Чтобы понять, как это работает, представьте, что мы имеем кнопку с Хэндлом 00001234 и устанавливаем паузу на всех сообщениях клавиатуры. После того, как брэйкпоинт установлен, откройте его как условный брэйкпоинт с записью. Вы увидите следующий набор опций:

  Condition  (Условие):                                                [ESP+4] == 00001234 ** [ESP+8] IN (0F0 .. 0F7,135)

  Explanation (Описание):                                           <WinProc>

  Pauseprogram (Остановить программу):                    OnCondition (На условии)

При входе в процедуру окна, стек содержит:

  [ESP+00]      Адрес возврата

  [ESP+04]      Хэндл окна

  [ESP+08]      Сообщение

  [ESP+0C]      wParam

  [ESP+10]      lParam

Теперь ясно, что первая часть условия означает: «Хэндл окна должен быть 00001234», а вторая часть: «Одно из следующих сообщений - (BM_GETCHECK ...BM_SETIMAGE, WM_CTLCOLORBTN)».

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

Группы Сообщений

Группа                                                                                    Сообщение в группе

Любое сообщение                                                                                      Любое сообщение

Создание и уничтожение окон                                                    WM _ CREATE ,  WM _ DESTROY ,  WM _ CLOSE ,  WM _ QUERYENDSESSION ,  WM _ QUIT ,  WM _ ENDSESSION ,  WM _ NCCREATE ,  WM _ NCDESTROY ,  WM _ INITDIALOG

Активация окна                                                                      WM_ACTIVATE, WM_SETFOCUS, WM_KILLFOCUS, WM_ENABLE, WM_SHOWWINDOW, WM_CHILDACTIVATE, WM_QUERYNEWPALETTE

Позиционирование и размер окна                                               WM_MOVE, WM_SIZE, WM_QUERYOPEN, WM_SHOWWINDOW, WM_GETMINMAXINFO,WM_WINDOWPOSCHANGING, WM_WINDOWPOSCHANGED, WM_NCCALCSIZE, WM_SIZING, WM_MOVING, WM_ENTERSIZEMOVE,WM_EXITSIZEMOVE

Команды и уведомления                                                                            WM_MEASUREITEM, WM_COMMNOTIFY, WM_NOTIFY,WM_NOTIFYFORMAT, WM_STYLECHANGING,WM_STYLECHANGED, WM_COMMAND, WM_SYSCOMMAND, WM_ENTERIDLE, WM_PARENTNOTIFY, WM_MDIRESTORE

Системные                                                                               WM_SYSCOLORCHANGE, WM_WININICHANGE, WM_DEVMODECHANGE, WM_ACTIVATEAPP,WM_FONTCHANGE, WM_TIMECHANGE, WM_COMPACTING, WM_POWER, WM_USERCHANGED, WM_DISPLAYCHANGE, WM_NCACTIVATE,WM_POWERBROADCAST, WM_DEVICECHANGE, WM_PALETTEISCHANGING, WM_PALETTECHANGED

Прорисовка                                                                             WM_SETREDRAW, WM_PAINT, WM_ERASEBKGND, WM_PAINTICON, WM_ICONERASEBKGND,WM_DRAWITEM, WM_NCPAINT, WM_QUERYNEWPALETTE, WM_PRINT, WM_PRINTCLIENT

Прокрутка                                                                               WM_HSCROLL, WM_VSCROLL, WM_CTLCOLORSCROLLBAR

Иконки (значки)                                                                       WM_QUERYOPEN, WM_QUERYDRAGICON, WM_GETICON, WM_SETICON

MDI                                                                                        WM_MDICREATE, WM_MDIDESTROY, WM_MDIACTIVATE, WM_MDIRESTORE, WM_MDINEXT,WM_MDIMAXIMIZE, WM_MDITILE, WM_MDICASCADE, WM_MDIICONARRANGE, WM_MDIGETACTIVE, WM_MDISETMENU

Диалоговые окна                                                                      WM_CANCELMODE, WM_NEXTDLGCTL, WM_MEASUREITEM, WM_DELETEITEM, WM_GETDLGCODE,WM_CTLCOLORMSGBOX, WM_CTLCOLORDLG

Меню                                                                                      WM_MEASUREITEM, WM_HELP, WM_CONTEXTMENU, WM_INITMENU, WM_INITMENUPOPUP,WM_MENUSELECT, WM_MENUCHAR, WM_ENTERMENULOOP, WM_EXITMENULOOP, WM_NEXTMENUWM_MDIREFRESHMENU

Текст                                                                                                           WM_SETTEXT, WM_GETTEXT, WM_GETTEXTLENGTH, WM_SETFONT, WM_GETFONT

Мышь                                                                                      WM_SETCURSOR, WM_MOUSEACTIVATE, WM_NCHITTEST, WM_NCMOUSEMOVE, WM_NCLBUTTONDOWN,WM_NCLBUTTONUP, WM_NCLBUTTONDBLCLK, WM_NCRBUTTONDOWN, WM_NCRBUTTONUP, WM_NCRBUTTONDBLCLK,WM_NCMBUTTONDOWN, WM_NCMBUTTONUP, WM_NCMBUTTONDBLCLK, WM_MOUSEMOVE, WM_LBUTTONDOWN, WM_LBUTTONUP,WM_LBUTTONDBLCLK, WM_RBUTTONDOWN, WM_RBUTTONUP, WM_RBUTTONDBLCLK, WM_MBUTTONDOWN, WM_MBUTTONUP,WM_MBUTTONDBLCLK, WM_MOUSEWHEEL, WM_XBUTTONDOWN, WM_XBUTTONUP, WM_XBUTTONDBLCLK, WM_CAPTURECHANGED

Клавиатура                                                                              WM_VKEYTOITEM, WM_CHARTOITEM, WM_SETHOTKEY, WM_GETHOTKEY, WM_KEYDOWN, WM_KEYUP,WM_CHAR,  WM_DEADCHAR, WM_SYSKEYDOWN, WM_SYSKEYUP, WM_SYSCHAR, WM_SYSDEADCHAR, WM_HOTKEY

Буфер обмена                                                                          WM _ CUT ,  WM _ COPY ,  WM _ PASTE ,  WM _ CLEAR ,  WM _ UNDO ,  WM _ RENDERFORMAT , WM _ RENDERALLFORMATS ,  WM _ DESTROYCLIPBOARD ,  WM _ DRAWCLIPBOARD ,  WM _ PAINTCLIPBOARD ,  WM _ VSCROLLCLIPBOARD , WM _ SIZECLIPBOARD ,  WM _ ASKCBFORMATNAME ,  WM _ CHANGECBCHAIN ,  WM _ HSCROLLCLIPBOARD

Поле для редактирования (Editcontrol)                                       Все EM _ xxx  сообщения

Статическое поле (Staticcontrol)                                               Все STM _ xxx  сообщения

Кнопки                                                                                    Все BM _ xxx  сообщения, WM _ CTLCOLORBTN

Combo box                                                                               ВсеCB_xxx  сообщения, WM_COMPAREITEM

Списки                                                                                    ВсеLB_xxx  сообщения, WM_COMPAREITEM , WM_CTLCOLORLISTBOX

IME                                                                                         Все  WM _ IME _ xxx  сообщения

Определяемые пользователем                                                    Все сообщения, большие или равные WM _ USER


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

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

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


Потоки

Особенность OllyDbg в том, что он позволяет просто и эффективно управлять потоками. Если Вы проходите по программе, трассируете её, выполняете till return (до возврата) или till selection (до выбранного), эти действия останавливают все потоки кроме основного, и возобновляют этот поток, даже если он был приостановлен. В этом случае, если Вы приостанавливаете или возобновляете потоки вручную, действия откладываются. Если Вы запускаете отлаживаемое приложение, OllyDbg восстанавливает первоначальные состояния потоков. (Заметьте, что с точки зрения Отладчика, hit trace (пошаговая трассировка), эквивалентна свободному выполнению).

В соответствии с этой схемой, окно Threads (Потоки) включает 5 возможных состояний потоков:

  Active                   - поток выполняется или приостановлен на событии отладки

  Suspended              - поток приостановлен

  Traced                  - поток приостановлен, но OllyDbg проходит через него ("steps through it")

  Paused                   - поток активен, но OllyDbg временно приостановил его, чтобы перешагнуть через другой поток

  Finished                 - процесс закончен

Окно потоков также отображает последнюю ошибку потока (как возвращенние к функции GetLastError) и время которое этот поток, провел в пользовательском и в системном режимах (только для NT/2000/XP).  А также подсвечивает идентификатор главного потока.

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

Actualize  - помечает все потоки как старые.

Suspend  - приостанавливает поток.

Resume  - возобновляет предварительно приостановленный поток.

Set priority  - корректирует приоритет потока в пределах процесса. Доступны следующие опции:

  Idle              - самый низкий возможный приоритет потока в пределах процесса

  Lowest

  Low

  Normal

  High

  Highest

  Time critical   - самый высокий возможный приоритет

Open in CPU  (двойной клик) - отображает текущее состояние выбранного потока в окне CPU.

Copy to clipboard (Копировать в буфер обмена)

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

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

Appearance (Оформление)  - смотри здесь.


Стек вызовов

Окно "Стек вызовов" (клавиша 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".  Окно "Дерево вызовов" сохраняет историю ваших действий (клавиши ' - '  и ' +  ').

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

См. также: Анализ, Стек вызовов .


Опции

Основные

Значения по умолчанию

Диалоги

Каталоги

Шрифты

Цвета

Подсветка кода

Опции отладки (Alt+O)

Защита

Отладка

События

Исключения

Trace

SFX

Строки

Адреса

Команды

Дезассемблер

Центральный процессор

Регистры

Стек

Анализ 1

Анализ 2

Анализ 3

Текущая отладка

Добавить в Проводник


Поиск

Олли позволяет Вам искать:

символическое имя (метка)

двоичная строка}

константа

команда

последовательность команд

внутримодульный вызов

изменяемая команда или данные

определяемая пользователем метка

определяемый пользователем комментарий

текстовая строка

запись в отладке

ссылка на команды


Самоизвлекающиеся (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 пропустит распаковщик быстро и надежно.

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


Пошаговое выполнение

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

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

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

- Вы нажимёте Esc  или запустите любую другую команду продвижения, или

- OllyDbg встретит установленный ранее брейкпоинт, или

- Отлаживаемая программа произведёт исключение.

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

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

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

См. также: Hit trace, Execute till return .


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

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

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

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

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

См. также: меню Disassembler, Run trace, опции Трассировки


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

Прямая трассировка - способ обратного выполнения программы, который необходим в некоторых случаях. Вы можете также использовать прямую трассировку для простого профилирования. В основном, 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 и окно прямой трассировки) установлена, Дизассемблер перейдёт к окну прямой трассировки.

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

См. также: Меню дизассемблера, Пошаговая трассировка, Опции трассировки


Сочетания клавиш

Глобальные сочетания клавиш

Сочетания клавиш в окне Дизассемблер


Дополнения к программе

Плагины - это DLL файлы, которые постоянно находятся в каталоге OllyDbg и увеличивают функциональные возможности OllyDbg. Вы можете загрузить бесплатный набор средств для разработки плагинов plug110.zip  с домашней страницы OllyDbg (http://home.t-online.de/home/Ollydbg).

Плагины могут устанавливать брейкпоинты, добавлять метки и комментарии, изменять регистры и память. Они могут добавлять значки в главное меню и другие окна, например Дизассемблер, или Память, прерывая глобальные и зависимые от окон горячие клавиши. Они также могут создавать собственные MDI окна. Плагины могут писать специфические данные в .udd файлы с модуль-зависимой информацией и ollydbg.ini  и обращаться к различным структурам данных, которые описывают отлаживаемое приложение. API плагинов включает более 170 функций.

Также довольно много сторонних плагинов доступны в сети Internet, например, на форуме OllyDbg, http://ollydbg.win32asmcommunity.net , созданном и модерируемым TBD.

Чтобы установить плагин, скопируйте DLL (и, в случае необходимости, связанные с ним файлы) в каталог с плагинами, и перезапустите OllyDbg. По умолчанию, это каталог, где находится главный файл OllyDbg - ollydbg.exe.

Этот дистрибутив включает два "родных" плагина: Закладки и Командная строка. Их исходники доступны в plug110.zip . Эти плагины - свободно распространяемое программное обеспечение, Вы можете свободно изменять и распространять их.


Подсказки и советы

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

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

·Просканируйте файлы перед началом анализа. В этом случае OllyDbg расшифрует аргументы известных функций "C".

·Некоторые таблицы содержат скрытые данные. Попробуйте увеличить ширину столбцов.

·Все окна дампа (включая Дизассемблер) могут отображать относительные адреса, для этого просто дважды щелкните на адресе.

·Вы можете листать все окна дампа по одному байту. Используйте «Ctrl+Стрелка вверх» или «Ctrl+Стрелка вниз».


Известные ошибки и проблемы

1. Если OllyDbg установлен как отладчик «just-in-time» и присоединяется к приложению под Windows 95, которое выполнило DebugBreak  (),  это приложение запустится после присоединения. На системах NT приложение останавливается на DebugBreak  ()  как и необходимо.

2. Команда SMSW (StoreMachineStatusWord) воспринимает только AX как параметр, но компилирует его в EAX.


Извинения

"We apologize for inconveniences"

D. A.

 P.S. От переводчиков

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

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

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

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


О справочнике

Идея и материал       >>>     HyPeR                 Рецензия    >>>    deNULL

Редакция                   >>>    name                    Дизайн и сборка этого варианта:   Wenden

Поддержка    http://www.cracklab.ru


Основные опции

Scroll work area  (Прокручивать рабочую зону)(стартовая опция)

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

Snow-free  (slower) drawing  (Прорисовка без визуальных помех (медленнее))

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

Append argumentst ofile names in history  (Добавлять параметры в конец имени файла в списке истории)

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

Restore window positions and appearance  (Восстановить позицию окон и оформление)

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

Restore width of columns (Восстановить ширину столбцов)

Если данная опция включена, OllyDbg восстанавливает ширину столбцов по умолчанию.

Highlight sorted column  (Подсвечивать отсортированные столбцы)

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

Show toolbar  (Отобразить панель)

Показывает или скрывает панель инструментов. В текущей версии, панель инструментов - не имеет возможностей пользовательской настройки.

Show status in toolbar  (Отображать состояние в панели инструментов)

Когда эта опция отключена, OllyDbg отображает состояние отлаживаемого приложения (Paused / Running / Terminated и т.д.) в правом углу в основании главного окна. Иногда Вам может понадобится видеть столько окон приложения сколько возможно и перемещать OllyDbg так, чтобы они были частично невидимы. Чтобы сделать состояние видимым, отметьте эту опцию. Состояние будет отображено как первый элемент панели инструментов.

Startup size of log buffer  (Размер буфера регистрации при запуске)

Эта опция, при запуске OllyDbg определяет объем памяти, который OllyDbg распределяет для данных, отображаемых в окне Log.


История Команд

OllyDbg сохраняет последовательность до 1000 последних выполненных команд, отображаемых в окне Дизассемблера. Каждый раз, когда отлаживаемая программа останавливается на брейкпоинте или исключении, или Вы переходите к следующей команде, или следуете по адресу перехода или вызова, или просто нажимаете Return (возврат), OllyDbg добавляет текущий адрес вместе с идентификатором потока в историю команд. Если run trace (трассировка) выключена, Вы можете передвигаться по истории с помощью кнопок '+ ' и '- '.

Существует также история данных в Дампе CPU.


Окно информации

Информационная панель в окне CPU расшифровывает параметры первой выбранной команды в окне Дизассемблер. Информация отображает также неявные параметры, подобно AL и ECX в REPE SCASB или верх стека в RETN. Для проанализированного кода отображается список команд, которые переходят к текущему местоположению. Если информация об отладке доступна, также отображается исходная строка, соответствующая выбранному фрагменту. Отсюда Вы можете следовать по адресам в Дамп или Дизассемблер и изменять параметры, или открыть файл с исходным кодом.

Все регистры используются программами очень интенсивно, их содержимое непрерывно изменяется. По умолчанию, OllyDbg предполагает, что регистры верны только для команды выполняемой в настоящее время. Если Вы хотите расшифровать параметры для всех команд, пожалуйста активизируйте опцию «Decode registers for any IP» («Расшифровывать регистры для любых IP»).

Если Вы анализируете файл журнала (log) прямой трассировки, Информационная область окна становится серой, подчеркивая, что отображаемое содержимое регистров - не фактическое, а взятое из данных отладки. Заметьте, что прямая отладка не сохраняет содержимое памяти, все отображаемое содержание памяти фактическое.

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

  Copy pane to clipboard (Копировать область окна в буфер обмена)  - копирует все непустые строки в буфер обмена.

  Modify register (Изменить регистр)  - позволяет Вам изменять содержимое выбранного регистра.

  Follow address in Disassembler (Перейти по адресу в Дизассемблер)  - переходит по выбранному адресу в окно Дизассемблера.

  Follow value in Disassembler (Перейти по значению в Дизассемблер)  - переходит по содержимому памяти двойного слова, указанного выбранным адресом в окне Дизассемблер.

  Follow address in Dump (Перейти по адресу в Дампе)  - переходит по выбранному адресу в область окна Дампа окна CPU.

  Follow value in Dump (Перейти по значению в Дампе)  - переходит по содержимому памяти двойного слова, указанного выбранным адресом в окне Дамп окна CPU.

  Go to CALL from xxxx ( Перейти  к CALL  из  xxxx) ,

  Go to JMP from xxxx ( Перейти  к  JMP  из  xxxx) ,

  Go to JNZ from xxxx ( Перейти  к  JNZ  из  xxxx) ,

  Go to JMP [ ]  from  xxxx  (Перейти к  JMP  [ ] из  xxxx )  и т.д. - переходит к команде, которая переходит или вызывает (CALL) текущее местоположение. Это может быть прямой или косвенный местный (intramodular) вызов, прямой       безоговорочный переход, условный переход или переключатель таблицы. Заметьте, что вызовы из различных модулей не перечисляются, даже если они присутствуют в Дереве Вызовов.

  Show all jumps and local calls (Показать все переходы и местные вызовы ( CALL ))  - если число переходов к текущему местоположению превышает 16, этот пункт меню открывает диалоговое окно, которое перечисляет все найденные переходы.

  Show source (Показать исходный код)  - открывает файл с исходным кодом, соответствующим выбранной команде. Альтернатива, двойной клик по исходной строке в окне Information.

  Appearance (Оформление)  - см. детальное описание здесь.


Плагин Закладки

Этот плагин позволяет устанавливать до 10 закладок в коде, используя быстрые клавиши или всплывающее меню в Дизассемблере и затем быстро возвращаться к одной из закладок, используя быстрые клавиши, всплывающее меню или окно Bookmark. Закладки зависят от программы. Они сохраняются между сеансами в .udd файле.

Чтобы открыть окно, которое перечисляет все закладки, выберите Plugin -> Bookmarks -> Bookmarks (Плагин -> Закладки -> Закладки) в главном меню.

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

Bookmarks  (Закладки):

Insert  bookmark  0  (Вставить закладку 0) (Alt + Shift +0 ),

...

Insert bookmark 9  (Вставить закладку 9) (Alt+Shift+9 ) - установить закладку на первой выбранной строке;

Delete bookmark 0  (Удалить закладку 0),

...

Delete bookmark 9  (Удалить закладку 9) - удалить закладку;

Go to bookmark 0  (Перейти к закладке 0) (Alt+0 ),

...

Go tobookmark 9  (Перейти к закладке 9) (Alt+9 ) - перейти к закладке.


Пользовательские Комментарии

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

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

Чтобы увидеть все ваши комментарии в пределах в настоящее время выбранного модуля сразу, выберите Search for->User-defined comment in Disassembler (Определяемые пользователем комментарии в Дизассемблере). Все команды, содержащие ваши комментарии появятся в окне Reference (Ссылки),и Вы можете просмотреть весь список, нажимая Alt+F7  и Alt+F8.


Ссылки

Ссылка - это использование константы в выполнимом коде некоторого модуля. OllyDbg позволяет Вам искать ссылки на адрес, на диапазон адресов, на константу в выбранной в настоящее время команде или на некоторую произвольную константу.

Например, если Вы определяете адрес или константу 0x401234, то следующие команды будут распознаны как ссылки:

  MOV EAX, 401234

  MOV EAX, DWORD PTR [00401234]

  MOV BYTE PTR [EBX*4+EDI+00401234], АL

  JNE 00401234

  CALL 00401234

  DD 00401234

Анализ не только ускоряет поиск и делает распознавание ссылок более надежным, но также позволяет находить ссылки в таблицах.

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

Если Вы ищете все межмодульные вызовы (CALL), все команды или последовательности команд, переключатели или упомянутые текстовые строки, OllyDbg также отображает результаты поиска в окне Ссылки.

В окне Дизассемблера Вы можете просматривать список ссылок, нажимая Alt+F7  (предыдущая ссылка) и Alt+F8  (следующая ссылка).

См. также: Ссылки в Дизассемблере,Ссылки в Дампе, Пользовательские комментарии.


Список динамической памяти

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

Чтобы перейти к куче, OllyDbg использует функции Heap32ListFirstAPI, Heap32First и т.д. определенные в kernel32.dll. Эти API не включёны в Windows NT и приводят к зависанию OllyDbg под Windows 2000. Я не смог найти объяснение такому поведению, так что список кучи в настоящее время поддерживается только на Win95-основанных системах.


Справка API

Вы можете прикрепить справочный файл с описаниями функций по API к OllyDbg и получать мгновенную контекстно-зависимую справку (клавиша:Ctrl+F1 ) в Дизассемблере, Названиях и Межмодульных окнах Вызовов.

Для прикрепления, выберите Help -> Select API helpfile в главном меню OllyDbg. Справочный файл (win32.hlp ) не включен в дистрибутив odbg110.zip  по причине авторских прав.


Стек

Trace stack frames  (Отслеживать (трассировать) фреймы стека)

Если эта опция включена, OllyDbg пытается отслеживать (трассировать) фрэймы стека, созданные с помощью операндов PUSH EBP; MOV EBP,ESP или ENTER xx,0. Каждый найденный фрэйм отмечается скобкой, слева от данных в окне стека. Может произойти так, что OllyDbg распознает ложные фреймы, например, остатки от предыдущих вызовов. Современные компиляторы оптимизации могут генерировать код, который не производит стандартные фреймы стека.

Use stack frame scopes in procedures  (Использовать фрэймы стека в возможных процедурах)

Если опция включена и EBP указывает на допустимый фрейм стека, Стек расшифрует параметры известных функций.

Highlight RETURNs  (Подсвечивать Возвраты)

Когда опция включена, OllyDbg подсвечивает адреса в стеке, которые расшифрованы как возвраты. Как и с фреймами стека, адреса возврата часто являются остатками от предыдущих вызовов, окончательное принятие решения, насчёт того, является ли адрес допустимым или нет, принадлежит Вам. Также, OllyDbg не распознает синтетические вызовы (PUSH retaddr, JMP entrypoint).

Show arguments of known functions  (Показывать параметры известных функций)

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

Show names of local variables  (Отображать имена локальных переменных)

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


Трассировка регистров

Это пример того, как Анализатор может трассировать содержимое регистров. Целая процедура, являющаяся линейной частью кода.

004116E1  - . C8 000000      ENTER 0,0

004116E5  ¦ . BB 22154500    MOV EBX,<JMP.&KERNEL32.GetPrivateProfile>

004116EA  ¦ . BE 1B174100    MOV ESI,OT.0041171B         ;  ASCII "inifile.ini"

004116EF  ¦ . BF 27174100    MOV EDI,OT.00411727         ;  ASCII "Key1"

004116F4  ¦ . B9 31174100    MOV ECX,OT.00411731         ;  ASCII "SectionName"

004116F9  ¦ . 33C0           XOR EAX,EAX

004116FB  ¦ . 51             PUSH ECX

004116FC  ¦ . 56             PUSH ESI                    ; - IniFileName => "inifile.ini"

004116FD  ¦ . 50             PUSH EAX                    ; ¦ Default => 0

004116FE  ¦ . 57             PUSH EDI                    ; ¦ Key => "Key1"

004116FF  ¦ . 51             PUSH ECX                    ; ¦ Section => "SectionName"

00411700  ¦ . FFD3           CALL EBX                    ; L GetPrivateProfileIntA

00411702  ¦ . 8B4D 08        MOV ECX,[ARG.1]

00411705  ¦ . 8901           MOV [DWORD DS:ECX],EAX

00411707  ¦ . 59             POP ECX

00411708  ¦ . 83C7 05        ADD EDI,5

0041170B  ¦ . 83C8 FF        OR EAX,FFFFFFFF

0041170E  ¦ . 56             PUSH ESI                    ; - IniFileName => "inifile.ini"

0041170F  ¦ . 50             PUSH EAX                    ; ¦ Default => FFFFFFFF (-1.)

00411710  ¦ . 57             PUSH EDI                    ; ¦ Key => "Key2"

00411711  ¦ . 51             PUSH ECX                    ; ¦ Section => "SectionName"

00411712  ¦ . FFD3           CALL EBX                    ; L GetPrivateProfileIntA

00411714  ¦ . 8B4D 0C        MOV ECX,[ARG.2]

00411717  ¦ . 8901           MOV [DWORD DS:ECX],EAX

00411719  ¦ . C9             LEAVE

0041171A  L . C3             RETN

0041171B   . 69 6E 69 66 69>ASCII "inifile.ini",0

00411727   . 4B 65 79 31 00>ASCII "Key1",0

0041172C   . 4B 65 79 32 00>ASCII "Key2",0

00411731   . 53 65 63 74 69>ASCII "SectionName",0

Функция GetPrivateProfileIntA  описывается как STDFUNC в основании данных, и Анализатор предполагает, что она восстанавливает стек и регистры EBX, EBP, ESI, EDI. Содержимое ECX сохранено в стек, поэтому оно остается определенным. Команда ADD EDI,5 дополняет EDI, к строке «Key2». Выполнение OREAX с FFFFFFFF устанавливает все биты к значению 1, таким образом делая его полностью определённым.


Строки

Decode Pascal-style string constants  (Расшифровывать строковые константы в стиле Паскаля)

Строка на Паскале включает в себя байт, содержащий длину строки (от 0 до 255 байтов), обязательно сопровождаемый телом строки. Однако она не обязательно заканчивается пустым указателем. Некоторые языки высокого уровня, подобно Delphi, используют константы в стиле Паскаля. Включение этой опции увеличивает вероятность неверной расшифровки кода.

Dump non-printable ASCII chars as dots  (Дампить непечатные ASCII символы как точки)

Когда эта опция включена, дамп ASCII заменяет все непечатные символы точками. Список символов зависит от того, разрешены ли диакритические символы или нет. Когда использование диакритических символов не разрешено, печатные символы включают TAB, CR, LF, пробел и все коды в диапазоне 0x21 .. 0x7E. Когда использование диакритических символов разрешено, установки печатных символов, включают также символы с диакритическими метками (например В, Г, Б), значки валют и другие специальные символы.

Allow diacritical symbols in strings  (Разрешить диакритические символы в строках)

Когда OllyDbg пытается расшифровать ASCII строку, и эта опция отключена, строка будет содержать только стандартные символы ASCII (0x20 .. 0x7E и дополнительно TAB, CR, LF). В то же время много европейских языков содержат специальные символы или символы с диакритическими метками (например В, Г, Б). Если отлаживаемое приложение поддерживает не только английский, но и другие языки, включите эту опцию. Однако при этом увеличивается число неверно расшифрованных строк. По умолчанию данный параметр выключен.

Mode of string decoding:  (Режим расшифровки строк)

Plain  (Простой)

Assembler  (Ассемблер)

C

Влияет, как на ASCII, так и на UNICODE строки, отображаемые в комментариях. В простом режиме не производится никаких интерпретаций вводимых символов, все символы отображаются на экране «как есть». В режиме Ассемблер, OllyDbg расшифровывает непечатные символы как шестнадцатеричные числа или специальные коды CR, LF или TAB. В режиме C, OllyDbg использует C-конструкции, такие как: '\n', '\r', '\x01'.


Функции Резервного сохранения

Дизассемблер, Дамп CPU и все окна Дампа могут создавать резервную копию отображаемого блока памяти.

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

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

Если резервная копия доступна, OllyDbg выделяет различия между резервной копией и оригинальными данными. Чтобы скопировать часть данных из резервной копии в оригинал ("отмена"), выберите эту часть, и выберите "Undo selection" в контекстном меню, или нажмите Alt+BkSpc .

Можно также записать резервную копию в файл и загружать его снова. Это позволяет вычислять различия между различными запусками отлаживаемой программы. Выбрав «Search for -> Modified command» («Искать -> Изменённые команды») или «Search for -> Modified data» («Искать -> Изменённые данные»), Вы можете быстро найти все различия между резервной копией и оригиналом.

Доступны следующие функции резервного копирования:

View backup  (Просмотреть резервную копию) - просматривает резервную копию вместо оригинальных данных. Если окно отображает резервную копию, все его функциональные возможности будут заблокированы. Если панель отображена, Вы можете нажимать кнопки "Address" вместо этого.

View actual data  (Просмотреть фактические данные) - просматривает оригинальные данные вместо резервной копии. Если панель отображена, Вы можете нажимать кнопку «Backup» вместо этого.

Create backup  (Создать резервную копию)

Update backup  (Обновить резервную копию) - создает новую или обновляет существующую резервную копию.

Delete backup  (Удалить резервную копию) - уничтожает резервную копию.

Load backup from file  (Загрузить резервную копию из файла) - загружает резервную копию из файла. OllyDbg предупредит Вас, если размер загружаемой резервной копии отличается от размера дампа.

Save backup to file  (Сохранить резервную копию в файл) - сохраняет резервную копию в файл. Заданное по умолчанию имя для резервной копии памяти имеет форму MODULE_XXXXXXXX.mem, где МОДУЛЬ - короткое имя модуля (или пусто, если блок памяти не принадлежит никакому модулю), а XXXXXXXX - шестнадцатеричная основа памяти. Для резервной копии файла, заданное по умолчанию имя это имя оригинального файла.

Save data to file  (Сохранить данные в файл) - сохраняет оригинальные данные в файл.


Искать межмодульные Вызовы

Этот тип поиска ищет все запросы (CALL) к внешним модулям (DLL) и устанавливает брейкпоинты на функциях API. Поиск включает все прямые и косвенные вызовы, вызовы к прямым или косвенным переходам, вызовы к Win95 thunks и их комбинациям. Во многих случаях этот процесс успешно располагает вызовы к функциям, загружаемым через GetProcAddress  (но, конечно, только после того, как вызывался GetProcAddress).

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


SFX

When main module is self-extractable:  (Когда главный модуль самоизвлекаемый)

   Extend code section to include extractor:  (Продлить секцию кода, чтобы включить распаковщик)

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

   Stop at entry of self-extractor  (Остановиться при входе в распаковщик)

Это - стандартное поведение. При этом OllyDbg не пытается отследить реальную точку входа в программу.

   Trace real entry blockwise (inaccurate)  (Отслеживать (трассировать) реальную точку входа по блокам (неточно))

OllyDbg использует 4-K блоки, чтобы проходить по упакованному коду. Применение этого метода может привести к обнаружению ложного реального входа. Для детального объяснения, см. здесь

  Trace real entry bytewise (very slow)  (Отслеживать (трассировать) по байтам реальную точку входа (очень медленно))

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

Use real entry from previous run  (Использовать реальную точку входа от предыдущего запуска)

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

Pass exceptions to SFX extractor  (Передавать исключения в SFX распаковщик)

Эта опция указывает OllyDbg передавать некоторые виды программных исключений, которые происходят при трассировке реального входа в SFX код (нарушение доступа к памяти, INT3 брейкпоинт, деление на 0, привилегированная или недопустимая команда) непосредственно в распаковщик.


Центральный процессор

Synchronize source with CPU (Синхронизировать источник с CPU)

Если опция включена, окно с исходником автоматически следует за выделением в панели Дизассемблер в окне CPU.

Under line fixups  (Подчеркивать адресные привязки)

Почти все DLL и некоторые программы содержат адресные привязки, которые позволяют загружать модули с различными базовыми адресами в память. Когда опция "Подчеркивать адресные привязки" включена, панели CPU, Дизассемблер и Дамп CPU подчеркивают байты соответствующие адресным привязкам.

Show direction of jumps (Показывать направление переходов)

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

Show jump path (Показывать путь перехода)

Show grayed path if jump is not taken  (Показывать серым, если переход не выполнен)

Show jump sto selected command (Показывать переходы к выбранным командам)

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

Center  'Follow'-ed command  (Центр 'Следовать' за командой)

Когда эта опция включена, при переходе по адресу из любого другого окна в окно CPU, панель Дисассемблер покажет команду грубо в середине окна Дизассемблер. Иначе, данная команда будет отображена первой в окне Дизассемблера.

Number of visible lines after stepped command  (Число видимых строк после пройденной команды)

Default  (По умолчанию)

   1 line

   ...

   10 lines

Если Вы идёте по коду, эта опция определяет, сколько строк остаются видимыми в панели Дизассемблера после текущей команды.

Letter key in Disassembler starts:  (Клавиша с буквой в Дизассемблере начинает)

   New label       (Новую метку)

   Assembler (Команду на Ассемблере)

   New comment (Новый комментарий)

   Object of last selected type (Объект последнего определённого типа)

Если Вы напечатаете какой либо текст в окне Дизассемблера, эта опция создаст новую метку, команду ассемблера или комментарий в зависимости от выбранной установки.


События

Make firstpauseat:  (Делать первую остановку на)

System breakpoint (Системном брейкпоинте)

Entry point of main module  (Точке входа в главный модуль программы)

Win Main  (если известно местоположение)

Когда отладчик запускает Win32 приложение, OС загружает его в память и устанавливает аппаратный INT3 брейкпоинт. Затем отладчик инициализирует все DLL и вызывает загрузочную процедуру. Загрузочная процедура выполняет различные инициализации, которые зависят от языка программирования, и вызывает WinMain. Эта опция позволяет Вам выбрать, где отладчик должен остановить выполнение программы при первом её запуске. Заметьте, что, если WinMain не известен, OllyDbg сделает остановку в точке входа в модуль.

Break on new module (DLL)  (Прерваться на новом модуле (DLL))

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

Break on module (DLL) un loading  (Прерваться на выгрузке модуля (DLL))

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

Break on new thread  (Прерваться при создании нового потока)

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

Break on threadend  (Прерваться на окончании потока)

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

Break on debugstring  (Прерваться на отладочной строке)

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


Регистры

Decode registers for any IP  (Расшифровывать регистры для любого IP)

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

Automatical FPU/MMX/3DNow! registers  (Автоматические FPU/MMX/3DNow! регистры)

Когда эта опция выключена, Вы должны установить режим расшифровки регистров FPU (FPU, MMX или 3DNow!) вручную. Когда опция включена и программа остановилась на одной из перечисленных в списке команд, OllyDbg автоматически устанавливает режим расшифровки FPU по типу команды.

Decode SSE registers ( Расшифровывать SSE регистры)

Если опция включена, OllyDbg отображает 128-битные SSE регистры фактического потока в панели Регистров, в окне CPU и расшифровывает значения регистров в Информационной панели. Заметьте, что эта операция очень медленная и требует внедрения небольших программ в отлаживаемое приложение. Не используйте эту опцию если в этом нет крайней необходимости!

Show last error  (Показать последнюю ошибку)

Включите эту опцию, если Вы хотите отобразить последнюю ошибку, обнаруженную потоком (как возврат к  GetLastError ) в панели Регистров и сохранить её, в журнал Процесса трассировки. Эта опция замедляет скорость трассировки до 20%.


Профиль

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

Окно профилирования поддерживает следующие действия:

Actualize  (Обновить) - повторно производит процесс профилирования для выбранного модуля;

Follow in Disassembler  (Перейти в Дизассемблер) (Enter ) - переходит по команде или последовательности команд с одинаковым счетом в Дизассемблер;

Find in Run trace  (Найти в трассировке) - находит самое последнее упоминание команды в Прямой трассировке. Если опция «Synchronize CPU and Run trace («Синхронизировать CPU и Прямую трассировку») активна, окно CPU будет отображать команды с оригинальными значениями регистров.


Пользовательские описания функций

Введение

OllyDbg содержит (как вшитый ресурс) имена и типы аргументов более 1900 стандартных функций API и более 400 стандартных C функций. Анализатор использует эти описания чтобы сделать код отлаживаемой программы более понимаемым. Сравните, например, вызов CreateFont до анализа:

        PUSHOT.00469F2A               ; ASCII "TimesNewRoman"

        PUSH 12

        PUSH 2

        PUSH 0

        PUSH 0

        PUSH 0

        PUSH 0

        PUSH 0

        MOV EAX,DWORD PTR [49FA70]

        PUSH EAX

        PUSH 190

        PUSH 0

        PUSH 0

        PUSH 0

        PUSH 10

        CALL <JMP.&GDI32.CreateFontA>

и после:

        MOV EAX,DWORD PTR [49FA70]

        PUSH OT.00469F2A               ;  FaceName = "Times New Roman"

        PUSH 12                        ;  PitchAndFamily = VARIABLE_PITCH|FF_ROMAN

        PUSH 2                         ;  Quality = PROOF_QUALITY

        PUSH 0                         ;  ClipPrecision = CLIP_DEFAULT_PRECIS

        PUSH 0                         ;  OutputPrecision = OUT_DEFAULT_PRECIS

        PUSH 0                         ;  CharSet = ANSI_CHARSET

        PUSH 0                         ;  StrikeOut = FALSE

        PUSH 0                         ;  Underline = FALSE

        PUSH EAX                       ;  Italic => TRUE

        PUSH 190                       ;  Weight = FW_NORMAL

        PUSH 0                         ;  Orientation = 0

        PUSH 0                         ;  Escapement = 0

        PUSH 0                         ;  Width = 0

        PUSH 10                        ;  Height = 10 (16.)

        CALL <JMP.&GDI32.CreateFontA>  ;  CreateFontA

Разумеется, второй вариант гораздо проще понять. Функция APICreateFont имеет 14 параметров. Анализатор помечает все эти параметры их именами и расшифровывает их известные значения. Трассировка регистров была включена, поэтому Анализатор также расшифровал значение Italic как текущее значение двойного слова по адресу 49FA70. Расшифровка использует текущие значения, так что если содержимое [49FA70] изменится, Italic также соответственно изменится. OllyDbg также расшифровывает аргументы известных функций в окне стека когда EIP указывает на вызов или переход к этой функции или её точке входа.

OllyDbg расшифровывает аргументы функций, аналогичных printf() с переменным числом параметров:

        PUSH EAX                       ;  <%.*s>

        PUSH E8                        ;  <*> = E8 (232.)

        PUSH EBX                       ;  <%08X>

        PUSH Mymodule.004801D2         ;  format = "Size %08X (%.*s) bytes"

        PUSH ESI                       ;  s

        CALL Mymodule.sprintf          ;  sprintf

Вы можете определять свои собственные функции. Каждый раз, когда вы открываете какое-нибудь приложение, OllyDbg сбрасывает таблицу аргументов функции и заполняет её встроенными описаниями. Затем он пытается открыть файлы "<папка OllyDbg>\common.arg" и "<папка OllyDbg>\<Приложение>.arg", где <Приложение> это 8-байтовое (DOS) имя отлаживаемой программы (без пути и расширения).

Простейший файл .arg может выглядеть подобно этому:

        INFO Simple .ARG file that decodes CreateHatchBrush

        TYPE HS_X

          IF 0 "HS_HORIZONTAL"

          IF 1 "HS_VERTICAL"

          IF 2 "HS_FDIAGONAL"

          IF 3 "HS_BDIAGONAL"

          IF 4 "HS_CROSS"

          IF 5 "HS_DIAGCROSS"

          ELSEINT

        END

        TYPE COLORREF

          IF 0 "<BLACK>"

          IF 00FFFFFF "<WHITE>"

          OTHERWISE

          TEXT "RGB("

          FIELD 000000FF

          UINT

          TEXT ","

          FIELD 0000FF00

          UINT

          TEXT ","

          FIELD 00FF0000

          UINT

          TEXT ")"

        END

        STDFUNC CreateHatchBrush

          "style" HS_X

          "colorref" COLORREF

        END

Стандартная Windows API функция CreateHatchBrush (int style,int colorref) имеет два параметра. Первый должен определять стиль штриховки, а второй состоит из красного, зеленого и синего компонентов цвета, упакованных в 3 младших байта 32-битного целого. Чтобы расшифровать такие аргументы, файл определяет два новых типа аргументов: HS_X и COLORREF.

Стиль штриховки это простое перечисление, где 0 соответствует HS_HORIZONTAL, 1 – HS_VERTICAL и т.д. Оператор IF сравнивает аргумент с первым операндом (заметьте: всегда в шестнадцатеричной форме!) и, если они равны, выводит текст второго операнда. Но что если совпадений нет? Оператор ELSEINT указывает OllyDbg расшифровать аргумент как целое.

COLOR REF более сложный. Сначала он пытается распознать два широко используемых цвета: черный (все компоненты равны 0) и белый (все компоненты равны 0xFF). Если совпадений нет, то COLORREFпытается расшифровать цвет как структуру, содержащую интенсивности красного, зеленого и синего. FIELD производит логическое AND аргумента со вторым операндом. Затем он одновременно сдвигает полученное целое и маску до тех пор, пока наименее значащий бит маски не станет равен 1. После этого целое отображается как десятичное беззнаковое число. Я делаю это три раза, отдельно для каждой компоненты цвета. TEXT просто выводит свой операнд. Если аргумент равен 00030201, то COLORREFрасшифрует его как RGB (1.,2.,3.)

Большинство  API функций удаляют параметры из стека и сохраняют содержимое регистров EBX, EBP, ESI и EDI. Объявление такой функции как STDFUNC говорит об этом факте Анализатору. В противном случае, описывайте её как FUNCTION.

А что если аргумент это комбинация нескольких полей и битовых значений, как fdwPitchAndFamily выше? Взгляните на это:

        TYPE FF_PITCH

          MASK 03

          IF 00 "DEFAULT_PITCH"

          IF 01 "FIXED_PITCH"

          IF 02 "VARIABLE_PITCH"

          ELSEHEX

          TEXT "|"

          MASK 0C

          BIT 04 "4|"

          BIT 08 "8|"

          MASK FFFFFFF0

          IF 00 "FF_DONTCARE"

          IF 10 "FF_ROMAN"

          IF 20 "FF_SWISS"

          IF 30 "FF_MODERN"

          IF 40 "FF_SCRIPT"

          IF 50 "FF_DECORATIVE"

          ELSEHEX

        END

Первые два бита содержат тип штриховки и должны расшифровываться вместе. Я извлекаю эти биты, используя MASK 03 и расшифровываю их с помощью последовательности IF. Я добавляю символ конкатенации, извлекаю 2 и 3 биты и расшифровываю их по отдельности. Затем я извлекаю остаток и расшифровываю известные комбинации.

OllyDbg удаляет конкатенации ('|'), пробелы, запятые, точки с запятой и знаки равенства из конца образованной строки.

Текущая версия анализатора может расшифровывать только 32-битные аргументы. Например, вы не можете расшифровать дробные числа (double или longdouble) как параметры функций.

Формальное описание

Пользовательская информация для расшифровки содержит дескрипторы функций и типов. Дескриптор функции имеет следующий формат:

FUNCTION |STDFUNC  [имя модуля.]имя функции

  <Имя первого аргумента> <Тип первого аргумента>

  ...

  <Имя последнего аргумента><Тип последнего аргумента>

END

Используйте ключевое слово STDFUNC если функция удаляет параметры из стека и сохраняет содержимое регистров EBX, EBP, ESI и EDI. Большинство функций API следует этим правилам. Объявляйте функцию как FUNCTION во всех остальных случаях. Имя модуля (EXE или DLL) опционально. Если оно отсутствует, OllyDbg ищет функцию с данным именем во всех модулях. Имя модуля не зависит от регистра.

Имя функции всегда зависит от регистра. Функции с поддержкой UNICODE должны  содержать суффикс A или W, как в SetWindowTextA .

Порядок аргументов соответствует соглашению передачи параметров в C стиле. Как и 16-битные Windows, так и 32-битные API функции используют это соглашение. Если имя аргумента содержит несколько или включает специальные символы, возьмите их в двойные кавычки ("). Многоточие (...) это специальная запись указывающее на переменное число аргументов, как в языке C. Многоточие должно находится в конце описания функции. OllyDbg не пытается расшифровать такие аргументы. Функция с пустым списком аргументов принимается как имя функции (void).

OllyDbg поддерживает только 32-битные аргументы. Некоторые типы аргументов определены следующим образом:

INT

значение   отображается как шестнадцатеричное, так и целое со знаком

UINT

значение   отображается как шестнадцатеричное, так и целое без знаком

HEX

значение   отображается в шестнадцатеричном формате

BOOL

TRUE или FALSE

CHAR

символ   ASCII

WCHAR

символ   UNICODE

FLOAT

32-битное   число с плавающей точкой

ERRCODE

код   системной ошибки (как возвращенный GetLastError())

ADDR,   PTR

адрес (специальный случай: NULL)

ASCII

указатель   на строку ASCII

UNICODE

указатель   на строку UNICODE

FORMAT

ASCII строка форматирования,   используемая в функциях, подобных printf() – не   используйте для scanf()!

WFORMAT

UNICODE строка форматирования,   используемая в функциях, подобных wsprintfW() – не   используйте для wscanfW()!

RECT

указатель   на структуру RECT (прямоугольник)

MESSAGE

указатель   на структуру MSG (ASCIIсообщение   Windows)

WMESSAGE

указатель   на структуру MSG(UNICODEсообщение Windows)

HANDLE

хэндл (специальные случаи: NULL, ERROR_INVALID_HANDLE)

HWND

хэндл   окна

HMODULE

хэндл   модуля

RSRC_STRING

ресурсная   строка с указанным индексом

NULL,   DUMMY

аргумент   присутствует, но исключается из расшифровки

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

TYPE имя типа

  [TEXT  "любой текст"]

  [<селектор поля>]

  <расшифровка поля>

  <расшифровка поля>

  [TEXT  "любой текст"]

  [PURGE ]

  ...

  <селектор поля>

  <расшифровка поля>

  <расшифровка поля>

  [TEXT  "любой текст"]

END

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

MASK маска  – поле равно аргумент AND hex маска ;

FIELD маска  – поле устанавливается равным аргумент AND hex маска , затем OllyDbgсдвигает одновременно поле и маску вправо так, чтобы наименее значащий бит "1" в маске оказался на нулевой позиции. Например, если аргумент равен 0xC250, то FIELDF0 извлечет 5.

SIGFIELD маска  – поле равно аргумент AND hex маска . OllyDbg сдвигает одновременно поле и маску вправо так, чтобы наименее значащий бит "1" в маске оказался на нулевой позиции и сохраняет знак поля. Например, если аргумент равен 0xC250, то SIGFIELDFF00 извлечет 0xFFFFFFC2.

Простые расшифровщики полей просто выводят содержимое поля:

HEX  – выводит содержимое поля в шестнадцатеричной форме;

INT  – выводит содержимое поля как десятичное число со знаком (с десятичной точкой);

UINT  – выводит содержимое поля как десятичное число без знака (с десятичной точкой).

CHAR  – выводит содержимое поля как символ ASCII.

Если поле – перечислитель, используйте последовательность операторов IF с операторами TRYxxx и/или ELSExxx, если необходимо:

IF значение  "текст " – если поле равно значение , то добавляет текст  в результирующую строку;

TRYASCII – если поле выглядит как указатель на строку ASCII, вывести эту строку;

TRYUNICODE  – если поле выглядит как указатель на строку UNICODE, вывести эту строку;

TRYORDINAL – если поле выглядит как ординал (16 наиболее значащих битов равны 0), вывести этот ординал (целое число с символом '#' в начале);

OTHERWISE – если один из предыдущих оператор IF успешно сработал, прекращает расшифровку; иначе, расшифровка продолжается;

ELSEINT – если все предыдущие операторы IF и TRYxxx не выполнились, выводит поле как десятичное число со знаком (с десятичной точкой);

ELSEHEX  – если все предыдущие операторы IF и TRYxxx не выполнились, выводит поле в шестнадцатеричной форме;

ELSECHAR  – если все предыдущие операторы IF и TRYxxx не выполнились, выводит поле как символ ASCII;

ELSEWCHAR  – если все предыдущие операторы IF и TRYxxx не выполнились, выводит поле как расширенный (UNICODE) символ.

Если поле – набор битов, используйте последовательность операторов BIT с операторами BITZ и BITHEX, если необходимо:

BIT маска  "текст " – если значение AND hex маска  не равно 0, то добавляет текст  в результирующую строку;

BITZ маска  "текст " – если значение AND hex маска  равно 0, то добавляет текст  в результирующую строку;

BITHEX маска  – если значение AND hex маска  не равно 0, выводит значение AND hex маска  в шестнадцатеричной форме.

Специальный оператор PURGE удаляет следующие символы из конца результирующей строки:

Пробел         ' '

Запятая        ','

OR                '|'

Двоеточие    ':'

Равно           '='

Это удобно в некоторых случаях расшифровки. Оператор END отмечает конец описания и автоматически вызывает PURGE.

Предустановленные типы

OllyDbg содержит, как вшитый ресурс, описания более 150 типов. Некоторые из них перечислены ниже. Вы можете использовать эти типы в ваших пользовательских файлах:

LANG _ X – идентификатор языка Windows (0 – нейтральный, 9 – Английский, C- Французский и т.д.)

GENERIC_X  – тип доступа (GENERIC_READ, GENERIC_WRITE...)

FILE_SHARE_X  – тип разделения доступа к файлу (FILE_SHARE_READ, FILE_SHARE_WRITE)

CREATEFILE_X  – режим создания файла (CREATE_NEW, OPEN_EXISTING...)

FILE_ATTRIBUTE_X  – атрибуты файла (READONLY, SYSTEM, DELETE_ON_CLOSE...)

RT_AXX  – тип ресурса (RT_CURSOR, RT_GROUP_ICON, строкаASCII...)

RT_WXX  – тип ресурса (RT_CURSOR, RT_GROUP_ICON, строкаUNICODE...)

COORD  – структура COORD ("X=xxx,Y=yyy")

STD_IO_X  – стандартные хэндлы (STD_INPUT_HANDLE, STD_ERROR_HANDLE...)

GMEM_X  – тип глобальной памяти (GMEM_FIXED, GPTR...)

LMEM_X  – тип локальной памяти (LMEM_FIXED, LPTR...)

FSEEK_X  – тип смещения в файле (FILE_BEGIN, FILE_CURRENT...)

OF_X  – режим файла (OF_READ, OF_SHARE_COMPAT, OF_VERIFY...)

O_X  – режим создания файла (O_RDONLY, O_BINARY, SH_COMPAT...)

SEMAPHORE_X  – тип семафора (SEMAPHORE_ALL_ACCESS, SYNCHRONIZE...)

SLEEP _ TIMEOUT – счетчик времени (INFINITE или время)

ROP  – несколько стандартных кодов ROP (SRCCOPY, MERGEPAINT...)

COLORREF – значения RGB цветов ("<WHITE>", "RGB(rr.,gg.,bb.)"...)

WS_X  – стиль окна (WS_OVERLAPPED, WS_POPUP...)

WS_EX_X  – расширенный стиль окна (WS_EX_DLGMODALFRAME, WS_EX_TOPMOST...)

MF_X  – флаги меню (MF_BYPOSITION, MF_ENABLED...)

WM_X  – тип сообщения Windows в формате ASCII (WM_CREATE, WM_KILLFOCUS, CB_SETCURSEL...)

WM_W  – тип сообщения Windows в формате UNICODE (WM_CREATE, WM_KILLFOCUS, CB_SETCURSEL...)

VK_X  – виртуальные коды клавиш (VK_LBUTTON, VK_TAB, VK_F10...)

MB _ X – стиль окна сообщения (MB_OK, MB_ICONHAND...)

HKEY _ X – предопределенные хэндлы реестра (HKEY_CLASSES_ROOT, HKEY_LOCAL_MACHINE...)

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


Поиск бинарных строк

OllyDbg может искать бинарные строки длиной до 256 байтов. В большинстве окон, эта функция имеет горячую клавишу Ctrl+B .

Вы можете ввести образец поиска в ASCII, UNICODE или шестнадцатеричном форматах. Для вашего удобства, средства управления правкой синхронизированы. Любые изменения в одной области управления немедленно отображаются в двух других. Нажимая Ctrl+Стрелка  вверх  или Ctrl+Стрелка  вниз , Вы можете быстро переходить к расположениям байтов в различных областях управления. Кнопки со стрелками влево и вправо выбирают один из 10 последних введенных образцов поиска.

Поле для ввода строки в шестнадцатеричном виде позволяет Вам исключать отдельные участки кода или байты из сравниваемого участка. Введите знак (? ) вопроса в HEX окне, чтобы отметить участки кода по маске. Если Вы вставляете образец поиска в окно HEX управления, OllyDbg просматривает текст в буфере обмена и извлекает шестнадцатеричные цифры (0 .. 9, A.. F, a .. f) и знаки (?) вопроса, игнорируя все другие символы. Дополнительно, Вы можете производить поиск слов без учета регистра.

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


Трассировка

Size of run trace buffer  (Размер буфера трассировки)

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

Log commands  (Записывать команды)

Указывает Прямой трассировкезаписывать оригинальные команды в буфер трассировки. Полезно, когда Вы делаете отладку самоизменяющегося кода. Уменьшает число команд, записываемых в буфер трассировки на 20-30%.

Show ESP  (Показать ESP)

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

Show flags  (Показать флаги)

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

Always trace over system DLLs  (Всегда трассировать через системные DLL)

Когда эта опция активна, OllyDbg не входит в системные DLL в процессе анимации или трассировки программы. DLL определяются как системные, если они постоянно находятся в системном каталоге (обычно c:\windows\system  под Windows 95, c:\winnt\system32  под NT). Главный (.exe) файл или автономный .dll определяются как пользовательские, даже если они постоянно находятся в системном каталоге. Вы можете переключать системный статус в окне Modules(Модули).

Always trace over string commands  (Всегда трассировать через строковые команды)

Когда опция выбрана, и OllyDbg выполняет процесс анимации или трассирует программу, то отладчик выполняет строковые команды с приставкой REP один раз. По умолчанию каждая итерация выполняется отдельно. Эта опция никак не влияет на команду Step into.

Synchronize CPU and Run trace  (Синхронизировать CPU и прямую трассировку)

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

After Executing till RET, step over RET  (После выполнения до RET, переходитьчерез RET)

Когда опция не активна, и Вы выбираете Execute till return (Выполнить до возврата) (Ctrl+F9 ), OllyDbg остановится на команде возврата. Если опция активирована, OllyDbg будет останавливаться после выполнения возврата, в большинстве случаев на следующей команде после вызова (CALL).

Group adjacent commands in profile  (Группировать смежные команды в профиль)

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


Искать бинарные строки

OllyDbg может искать бинарные строки длиной до 256 байтов. В большинстве окон, эта функция имеет горячую клавишу Ctrl+B .

Вы можете ввести образец поиска в ASCII, UNICODEили  hexadecimal форматах. Для вашего удобства, средства управления правкой - синхронизированы. Любые изменения в одной области управления немедленно отображаются в двух других. Нажимая Ctrl+ArrowUp  или Ctrl+ArrowDn , Вы можете быстро переходить к расположениям байтов в различных областях управления. Кнопки со стрелками влево и вправо выбирают один из 10 последних введенных образцов поиска.

HEX control (управление) позволяет, Вам исключать отдельные участки кода или байты из сравниваемого участка. Введите знак (? ) вопроса в HEX управлении, чтобы отметить, участки кода по маске. Если Вы вставляете образец поиска в окно HEX управления, OllyDbg просматривает текст в буфере обмена и извлекает hexadecimal цифры (0 .. 9, A.. F, a .. f) и знаки (?) вопроса, игнорируя все другие символы. Дополнительно, Вы можете производить поиск слов без учета регистра.

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


Поиск последовательности команд

Компиляторы обычно используют схожие последовательности команд, чтобы выполнять похожие задачи. Например, многие процедуры создают фрейм стека, выполняя последовательность, PUSH EBP; MOV EBP,ESP. Чтобы определить точки входа в программу, можно попытаться найти бинарный код 55, 8B, EC . Однако, есть две проблемы: команда MOV EBP, ESP имеет различные кодировки 89, E5,  и компиляторы, которые для  оптимизации процессоров, класса Pentium, могут вставлять промежуточные команды, которые не влияют на EBP и ESP.

Другой пример: чтобы обращаться к массивам структур, длиной в 100 байтов, компилятор, может генерировать следующий код:

  LEA EAX,[4*EAX+EAX]                                    ; Умножить EAX на 5

  LEA EAX,[4*EAX+EAX]                                    ; Умножить EAX на 5

  MOV EBX,[4*EAX+основание_массива]      ; Умножить EAX на 4

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

  LEA ECX,[4*EAX+EAX]

  LEA ECX,[4*ECX+ECX]

  MOV EBX,[4*ECX+основание_массива]

или другой из сотен возможных.

Чтобы помочь Вам в этих и схожих случаях, OllyDbg производит мощный поиск последовательности команд (клавиша Ctrl+S  в окне Дизассемблера). Вы можете вводить последовательность до 8 команд в ассемблере. Для каждой перечисленной команды, OllyDbg генерирует все возможные кодировки, а в процессе поиска - для каждой возможной комбинации этих команд. Вы можете использовать неточные операнды и команды. Однако, команда LEA R32,[4*R32+R32] несоответствует в точности LEA ESI,[EAX*4+EBX] - как бы Вам не хотелось. OllyDbg позволяет Вам определять соответствие псевдорегистрам RA и RB. Подобно R32, они - заменяют любой регистр на 32-битный регистр общего назначения, но не всегда тот же самый в пределах целой последовательности. RA и RB также могут совпадать. Таким образом, LEA RA,[4*RA+RA] будет соответствовать LEA EAX,[4*EAX+EAX] и LEA ESI,[4*ESI+ESI], но не LEA ESI,[EAX*4+EBX].

Чтобы пропускать n  неоднозначных команд, используйте опцию ANY n.Если Вы ожидаете до 2 промежуточных команд в заголовке процедуры, используйте образец:

  PUSH EBP

  ANY 2

  MOV EBP,ESP,

возможный образец поиска во втором случае, например:

  LEA RB,[4*RA+RA]

  ANY

  LEA R32,[4*RB+RB]

Что касается продолжения поиска, нажмите Ctrl+L , чтобы искать другие последовательности. Вы можете также найти все последовательности сразу, а затем переходить по этому списку, используя сочетания клавиш Alt+F7  и Alt+F8 .


Подсказки расшифровки

В некоторых случаях Анализатор не может различить код и данные. Давайте взглянем на следующий пример:

  const  char s[11] = "0123456789";

  ...

  for (i=0x30; i<0x3a; i++) t[i-0x30]=s[i-0x30];

Хороший компилятор при оптимизации удалит вычитание и заменит его чем-нибудь похожим

   for  (i=0x30; i<0x3a; i++) (t-0x30)[i]=(s-0x30)[i];

где t-0x30  и s-0x30 , конечно, константы, и скомпилирует значения в:

  MOV AL,[BYTE s_minus_30+EBX]

  MOV [BYTE t_minus_30+EBX],AL

Компилятор может также включать строковую константу "0123456789" в выполняемый код. В версии 1.10, я не пытался определять диапазон значений регистра. Когда Анализатор сталкивается с командой выше, он предполагает, что адрес s_minus_30  содержит данные байта. Но в действительности, это выражение может содержать код!

Что, если такая ошибка появилась в коде, отладку которого Вы собираетесь делать? Есть две возможности. Быстро и грязно : Вы можете удалить анализ из искаженного кода (клавиша:BkSpc ) и OllyDbg будет использовать значения по умолчанию, расшифровывающие дизассемблированный код.

Более грамотная опция- использование подсказок расшифровки . Вы указываете OllyDbg каким образом следует интерпретировать содержимое выбранной области памяти и запускаете процесс анализа снова (Ctrl+A ).

Чтобы установить подсказки, выделите часть кода, или данные в Дизассемблере и в контекстном меню выберите Analysis -> During next analysis, treat selection as (Анализ->Во время следующего анализа, обрабатывать выбранное как) и затем одну из доступных опций:

   Command (Команда)  - первый выбранный байт начинает допустимую команду. Это -команда в которой он уверен, то есть все последующие местоположения, переходов или возвращений, и все местоположения, достижимые переходами или вызовами из этой последовательности - также команды;

   Byte  (Байт)

    Word  (Слово)

    Doubleword  (Двойное слово) - обрабатывает сначала 1, 2 или 4 выбранных байта как данные соответствующего размера;

   Command s  (Команды)  - все выделенное (до первой недопустимой команды) и все достижимые адреса состоят из допустимых команд;

    Bytes  (Байты)

    Words  (Слова)

    Doublewords  (Двойные слова) - выделенное состоит из 1-, 2- или 4-байтовых элементов;

   ASCII text (Текст в ASCII)

   UNICODE text ( Текст в UNICODE) - все выделенное - текст в ASCII или UNICODE форматах;

   Default (remove hints)  (По умолчанию (удалить подсказки)) - удаляет все подсказки из   выделенного фрагмента;

   Remove all hints (Удалить все подсказки) - удаляет подсказки расшифровки из всего модуля.

OllyDbg сохраняет подсказки в udd.файл.


Поиск изменённых команд и данных

Окно Дампа поддерживает резервное копирование данных. OllyDbg создает резервную копию автоматически, каждый раз, когда Вы изменяете код в окне Дизассемблера или данные в Дампе CPU. Всякий раз, когда есть различие между фактическим кодом или данными, и резервной копией, OllyDbg выделяет их. Вы можете искать различия, выбирая Search for- > Modified code  (Искать->Изменённый код) или Search for- > Modified data  (Искать->Изменённые данные) в контекстном меню окна. Что касается продолжения поиска, нажмите Ctrl+L , чтобы найти другие изменения.


Поддержка SSE

SSE (Streaming SIMD Extentions) команды были сначала представлены Intel для процессоров Pentium III . Они учитывают одновременную обработку до 4 операндов единственной точности с плавающей запятой. OllyDbg 1.06 расшифровывает и компилирует команды SSE и может отображать и изменять содержимое 128-битных SSE регистров. Эта задача не столь тривиальна, как выглядит на первый взгляд. Главная проблема - отсутствие поддержки отладки во всех фактических версиях Windows, то есть Отладчик не может получить эти регистры из OS. Чтобы преодолеть это ограничение, OllyDbg вводит и выполняет маленькую часть кода, который читает или изменяет регистры SSE в пределах отлаживаемого потока. Эта операция медленна и опасна, и я рекомендую отключить расшифровку регистров SSE если нет в этом крайней необходимости. Run trace не сохраняет SSE регистры в файл журнала.

Заметьте, что SSE2 (дополнения для Pentium 4) не поддерживаются.


Плагин Командная строка

Плагин «Командная строка» - простой интерфейс командной строки в OllyDbg. Чтобы открыть окно командной строки, нажмите Alt+F1 или выберите Plugins|Command line|Command line (Плагины -> Командная строка -> Командная строка) в главном меню.

Плагин «Командная строка» поддерживает следующие команды:

Команда                       Описание                                         Пример                       Выражения

CALC выражение                Вычисляет значение выражения CALC EAX/2+1          ? выражение

                                            Так же выражение (первый символ - не буква)Так же                 2*2

WATCH выражение         Добавляет наблюдатель          WATCH +[460030+ESI]

W выражение                Так же

 Присваивания

SET рег=выражение       Записывает значение выражения в 8-, 16- или 32-битный основной регистр                           SETAL=0 SETESI=[DWORDEDI-10]

рег=выражение             Так же                                  AX=0FFFF

 Дизассемблер

AT выражение               Переход по адресу в Дизассемблер                                           AT 410000

FOLLOW выражение       Так же                                  FOLLOWEAX

ORIG                            Переход на EIP

*                                 Так же

 Дамп и стек

D выражение                 Переход по адресу в дамп       D 460000

DUMP выражение           Так же

DA [выражение]            Дамп в формате ассемблера

DB [выражение]             Дамп в формате HEX (по одному байту)

DC [выражение]            Дамп в формате ASCII-текста  DCEAX

DD [выражение]            Дамп как адреса (формат стека)

DU [выражение]            Дамп в формате UNICODE-текста

DW [выражение]                                                       Дамп в формате HEX (по два байта)

STK выражение             Переход по адресу в стек

 Ассемблирование

A выражение [,команда]Ассемблирование по адресу    A 410000, XOREAX,EAX

 Метки и комментарии

L выражение, метка       Присваивает символическую метку адресу                                LEAX, loopstart

C выражение, комментарий                                        Устанавливает комментарий на адрес   CEAX, Hereloopstarts

 Брейкпоинты

BP выражение [,условие]                                           Устанавливает INT3 брейкпоинт по адресу                                   BPEAX+10 BP 410010, EAX==WM_CLOSEBPKernel32.GetProcAddress

BPX метка                     Устанавливает брейкпоинт на каждом вызове внешней 'метки' в текущем модуле                         BPXCreateFileA

BC выражение               Удаляет брейкпоинт по адресуBC 410010

MR выражение1 [,выражение2]                                   Устанавливает брейкпоинт на доступ к блоку памяти

MW выражение1 [,выражение2]                                  Устанавливает брейкпоинт на запись в блок памяти

MD                               Удаляет брейкпоинт на память

HR выражение               Устанавливает 1-байтовый аппаратный брейкпоинт на доступ

HW выражение              Устанавливает 1-байтовый аппаратный брейкпоинт на запись

HE выражение               Устанавливает аппаратный брейкпоинт на выполнение

HD [выражение]            Удаляет аппаратный брейкпоинт

 Трассировка

STOP                           Остановить выполнение

PAUSE                          Так же

RUN                             Запустить программу

G [выражение]              Запустить до адреса

GE [выражение]             Передать исключение обработчику и запустить до адреса

S                                 Шаг со входом

SI                                Так же

SO                               Шаг с обходом

T [выражение]              Трассировка со входом до адреса

TI [выражение]             Так же

TO [выражение]            Трассировка с обходом до адреса

TCусловие                   Условие трассировки со входом

TOCусловие                 Условие трассировки с обходом

TR                               Выполнить до возврата

TU                               Выполнить до пользовательского кода

 Окна  OllyDbg

LOG                             Окно Log (Журнал)

MOD                             Окно Executable modules (Модули)

MEM                             Окно Memory (Память)

CPU                             Окно CPU

CS                               Окно Call Stack (Стеквызовов)

BRK                              Окно Breakpoints (Брейкпоинты)

OPT                             Опции

 Разное

EXIT                            ЗакрытьOllyDbg

QUIT                            Так же

OPEN [файл]                 Открыть исполняемый файл для отладки

CLOSE                          Закрыть отлаживаемую программу

RST                             Перезапустить текущую программу

HELP                            Открыть эту справку

HELP OllyDbg                 Открыть справку OllyDbg

HELP API function            Открыть справку по API-функции                                              HELPCreateFile

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

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

.EAX=0

. RUN

Детальное описание примеров:

·   CALC  EAX/2+1  - вычисляет значение выражения и отображает результат в шестнадцатеричном формате. Регистр принадлежит потоку, выбранному в окне CPU;

·  2*2  - вычисляет значение выражения (4) и отображает результат в шестнадцатеричном формате;

·  WATCH +[460030+ESI]  - добавляет наблюдатель, который отображает содержимое памяти двойного слова по адресу 0x460030+ESI в шестнадцатеричном и десятичном форматах;

·  SET AL=0  - изменяет значение регистра AL в выбранном потоке к 0;

·  SET ESI=[DWORD EDI-10]  - получает содержание памяти двойного слова в EDI-10 и пишет его ESI. И ESI и EDI принадлежат потоку, выбранному в окне CPU;

·  SET [410000]=80000001  - изменяет содержимое двойного слова памяти по адресу 0x410000 на 0x80000001. Обратите внимание, что, в отличие от Дизассемблера или Дампа CPU, плагин командной строки не создает резервную копию измененного блока памяти!

·  A 410000, XOR EAX,EAX  - изменяет команду в 0x410000 на XOREAX, EAX;

·  L EAX, loopstart  - задает название «loopstart» адресу EAX;

·   BP  EAX+10  - устанавливает безусловный брейкпоинт на адрес EAX+10;

·  BP 410010, EAX==WM_CLOSE  - устанавливает условный брейкпоинт по адресу 0x410010. Программа останавливается, если регистр EAX равен символической константе WM_CLOSE;

·  BP Kernel32.GetProcAddress  - устанавливает безусловный брейкпоинт на функцию GetProcAddress в модуле KERNEL32;

·  BPX CreateFileA  - устанавливает брейкпоинт на каждом вызове внешней функции CreateFileA из модуля, который в настоящее время выбран в окне Дизассемблер.


Окно дизассемблера

Панель Дизассемблера в окне CPU (я назову его, окно Дизассемблера для краткости) отображает код отлаживаемой программы. Он имеет четыре столбца: адрес, hex дамп, дизассемблированные команды и комментарии. Последний столбец может также отображать связанный исходный код или профиль выполнения (run profile). Если отображена панель этого окна, расположенная сверху, нажмите на нее, чтобы переключаться между режимами отображения.

Двойной Клик в одном из столбцов выполняет одно из часто используемых действий:

   Адрес  - отображает относительные адреса по отношению к нажатому. Двойной Клик, чтобы возвратиться к стандартному режиму отображения адресов;

    HEX  Дамп  - устанавливает обычный брейкпоинт без условия (unconditional);

   Дизассемблирование  - запускает Ассемблер;

   Комментарий  - позволяет Вам добавлять или редактировать комментарий, связанный с командой.

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

Когда программа делает паузу в выполнении, Дизассемблер переходит к команде, указанной как EIP в текущем потоке.

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

Чтобы выбрать несколько строк с помощью клавиатуры, удерживайте Клавишу SHIFT  и используйте клавиши Up/Down  или PgUp/PgDn .

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

Чтобы получить большее количество информации о Дизассемблере, выберите один из следующих разделов:

Меню Дизассемблер

Клавиши окна Дизассемблер

Опции Дизассемблер

Анализ

Брейкпоинты

См. также: окно Информации, Дамп


LOADDLL

Это полный исходник loaddll.exe . Он может быть скомпилирован, с использованием Borland's TASM32 со следующими командами:

  tasm32-mx-zi-m5  loaddll.asm ,  loaddll.lst

   tlink32-v--c-S:40000-B:400000-Tpe-aa-m  loaddll , import32.lib

    brc32  loaddll . rc -feloaddll.exe

Выполнение начинается со START .  loaddll получает командную строку, пропускает имя выполняемых модулей (должно быть взято в двойные кавычки!), переходит к DLL и передает их в LoadLibrary . При ошибке, размещает указатель на сообщении об ошибке на установленном местоположении и выходит с кодом 0x1001. При успешном выполнении создает простое главное окно и останавливается на Firstbp  (первый брейкпоинт) . Этот брэйкпоинт устанавливается OllyDbg при запуске.

Вся связь с OllyDbg сделана через 128-байтовую область связи. Эта область должна начинаться по адресу 0x420020 сразу же после keyphrase (ключевой фразы). Несколько слов сначала содержат адреса в loaddll.exe  используемыми OllyDbg, чтобы устанавливать брейкпоинты и параметры, сопровождаемые адресом функции вызова, содержимое регистров, число параметров и собственно параметры. Число параметров ограничено 10. Если параметр - указатель на память, Вы можете использовать 10 буферов данных, Каждый 1 килобайт, называется, как Arg1, Arg2..., Arg10 . Эти и некоторые другие названия экспортируются и таким образом становятся известны OllyDbg.

Когда loaddll  пропускает главный цикл окна (WINLOOP ), он постоянно проверяет, является ли адрес экспортируемой функции в PROCADR не 0. Если это так, loaddll сохраняет содержимое ESP и EBP и помещает 16 нолей в стек. Это необходимо, чтобы избежать крушения, если пользователь определяет недопустимое число параметров. Тогда loaddll  помещает параметры и устанавливает регистры. В адресе Prepatch есть 16 NOP'ов, которые Вы можете использовать для небольших изменений. Если Вы нуждаетесь в большем количестве места, Вы можете перейти к Patch area  длинойв 2 килобайта. Обратите внимание, что OllyDbg не извлекает loaddll.exe  из ресурсов, если файл с этим названием уже существует.

При экспорте вызывается CallDLL . Эта команда сопровождается еще 16 NOP-ами. Тогда подпрограмма сохраняет измененные регистры и смещение ESP после вызова. Если Вы вводите недопустимыое число параметров в функцию стиля Паскаль, OllyDbg сообщит Вам об этой ошибке. Наконец, loaddll  восстанавливает ESP и EBP, обнуляет PROCADR  и прерывается в INT3 по адресу Finished . Когда этот пункт достигнут, OllyDbg знает, что выполнение закончено.

Используйте LOADDLL.ASM как свободно распространяемое обеспечение. Я не буду возражать, если вы используете эту программу в целом или частями (без авторского права) в ваших собственных программах. Но не смейте использовать Green Bug (LOADDLL.RC)  в проектах, не связанных с OllyDbg…

Это все, Наслаждайтесь!

LOADDLL.ASM:

           P586                        ; 32-bit instructions used!

           MODEL FLAT,PASCAL

           IDEAL                       ; I really like it!

           LOCALS

           PUBLICDLL WndProc,Firstbp,Prepatch,CallDLL,Finished;

           PUBLICDLL Patcharea,Endpatch

           PUBLICDLL Arg1,Arg2,Arg3,Arg4,Arg5,Arg6,Arg7,Arg8,Arg9,Arg10

           SEGMENT _DATA1 PARA PUBLIC USE32 'DATA'

           ; Text below is a keyphrase used by OllyDbg to verify that LoadDll

           ; is correct. Loads at fixed address 00420000. Never change! Note

           ; how coward I am: you cannot replace copyright, otherwise this code

           ; will not work!

           DB "DLL Loader (C) 2004 OlehYuschuk"

           ; Link area. Never change the meaning or order of next 32 dwords!

ERRMSG     DD 0                        ; Pointer to error

HINST      DD 0                        ; Process instance

HWND       DD 0                        ; Handle of main window

DLLBASE    DD 0                        ; Base address of loaded DLL or NULL

           DD OFFSET Firstbp           ; Address of first breakpoint

           DD OFFSET Prepatch          ; Address of patch area before call

           DD OFFSET Arg1              ; Base of 10 arguments x 1024 bytes

           DD OFFSET Finished          ; Address of breakpoint after call

DUMMY      DD 4 DUP(0)                 ; Reserved for the future

PROCADR    DD 0                        ; Address of procedure, starts execution

REGEAX     DD 0                        ; Register arguments

REGECX     DD 0

REGEDX     DD 0

REGEBX     DD 0

REGESI     DD 0

REGEDI     DD 0

NARG       DD 0                        ; Number of arguments to push on stack

ARGLIST    DD 10 DUP(0)                ; DLL argument list

ESPDIFF    DD 0                        ; Difference in ESP caused by code

           DD 0                        ; Reserved for the future

WCLASS     = THIS DWORD                ; Hand-made WNDCLASS structure

           DD 0000002Bh                ; CS_HREDRAW|VREDRAW|DBLCLKS|OWNDC

           DD WndProc                  ; Window procedure

           DD 0                        ; Class extra bytes

           DD 0                        ; Window extra bytes

WCINST     DD 0                        ; Instance

WCICON     DD 0                        ; Icon

HCURS      DD 0                        ; Cursor

HBGND      DD 0                        ; Background brush

           DD 0                        ; No menu

           DD CLSNAME                  ; Class name

MSG        = THIS DWORD                ; Hand-made MSG structure

           DD 0                        ; Handle of window

MSGID      DD 0                        ; Message ID

           DD 0                        ; wParam

           DD 0                        ; lParam

           DD 0                        ; Timestamp

           DD 0                        ; X coordinate

           DD 0                        ; Y coordinate

PSTRUCT    = THIS DWORD                ; Hand-made PAINTSTRUCT structure

           DD 0                        ; HDC

           DD 0                        ; fErase

           DD 0                        ; rcPaint.left

           DD 0                        ; rcPaint.top

           DD 0                        ; rcPaint.right

           DD 0                        ; rcPaint.bottom

           DD 0                        ; fRestore

           DD 0                        ; fIncUpdate

           DB 32 DUP(0)                ; rgbReserved

ORIGESP    DD 0                        ; Original ESP before call

ORIGEBP    DD 0                        ; Original EBP before call

EXPESP     DD 0                        ; Expected ESP after call (C)

WNDNAME    DB "OllyDbg DLL Loader",0

CLSNAME    DB "LoadDLLClass",0

ICONAME    DB "MAINICON",0             ; Green smashed bug - igitt!

E_NONAM    DB "Missing DLL name",0     ; Error notifications to OllyDbg

E_NODLL    DB "Unable to load DLL",0

E_NPARM    DB "Too many parameters",0

           ALIGN 16

Arg1       DB 1024 DUP (?)             ; Area for 10 memory arguments, 1 k each

Arg2       DB 1024 DUP (?)

Arg3       DB 1024 DUP (?)

Arg4       DB 1024 DUP (?)

Arg5       DB 1024 DUP (?)

Arg6       DB 1024 DUP (?)

Arg7       DB 1024 DUP (?)

Arg8       DB 1024 DUP (?)

Arg9       DB 1024 DUP (?)

Arg10      DB 1024 DUP (?)

           ENDS _DATA1

           SEGMENT _TEXT1 PARA PUBLIC USE32 'CODE'

           EXTRN GetModuleHandleA:     PROC

           EXTRN GetCommandLineA:      PROC

           EXTRN LoadIconA:            PROC

           EXTRN LoadCursorA:          PROC

           EXTRN GetStockObject:       PROC

           EXTRN RegisterClassA:       PROC

           EXTRN CreateWindowExA:      PROC

           EXTRN DestroyWindow:        PROC

           EXTRN PostQuitMessage:      PROC

           EXTRN ShowWindow:           PROC

           EXTRN Sleep:                PROC

           EXTRN BeginPaint:           PROC

           EXTRN EndPaint:             PROC

           EXTRN DefWindowProcA:       PROC

           EXTRN LoadLibraryA:         PROC

           EXTRN PeekMessageA:         PROC

           EXTRN TranslateMessage:     PROC

           EXTRN DispatchMessageA:     PROC

           EXTRN ExitProcess:          PROC

           ; Window procedure of main LoadDLL window.

           PROC WndProc

           ARG LP:DWORD,WP:DWORD,MS:DWORD,HW:DWORD

           PUSH EDX

           PUSH EDI

           PUSH ESI

           MOV EAX,[MS]

           CMP EAX,0001h               ; WM_CREATE

           JE RET0

           CMP EAX,0002h               ; WM_DESTROY

           JNE @@080

             PUSH 0

             CALL PostQuitMessage

             JMP RET0

@@080:     CMP EAX,000Fh               ; WM_PAINT

           JNE @@100

             PUSH OFFSET PSTRUCT

             PUSH [HW]

             CALL BeginPaint

             PUSH OFFSET PSTRUCT

             PUSH [HW]

             CALL EndPaint

             JMP RET0

@@100:     CMP EAX,0010h               ; WM_CLOSE

           JNE @@200

             PUSH [HW]

             CALL DestroyWindow

             JMP RET0

@@200:     ; None of listed above, pass to DefWindowProc().

           PUSH [LP]

           PUSH [WP]

           PUSH [MS]

           PUSH [HW]

           CALL DefWindowProcA

           JMP RETA

RET0:      XOR EAX,EAX

           JMP SHORT RETA

RET1:      MOV EAX,1

RETA:      POP ESI

           POP EDI

           POP EDX

           RET

           ENDP WndProc

START:     MOV EBP,ESP                 ; Here execution begins

           PUSH 0

           CALL GetModuleHandleA

           MOV [DWORD DS:WCINST],EAX

           MOV [DWORD DS:HINST],EAX

           CALL GetCommandLineA        ; Path to LOADDLL is taken into quotes

           MOV ESI,EAX

           INC ESI                     ; Skip first quote

@@10:        MOV AL,[BYTE DS:ESI]      ; Skip path to LOADDLL.EXE

             INC ESI

             OR AL,AL

             JNE @@12

               MOV [DWORD DS:ERRMSG],OFFSET E_NONAM

               JMP ERROR

@@12:        CMP AL,'"'

             JNE @@10

@@20:        MOV AL,[BYTE DS:ESI]      ; Skip spaces

             CMP AL,' '

             JNE @@30

             INC ESI

             JMP SHORT @@20

@@30:      PUSH ESI

           CALL LoadLibraryA           ; Load DLL

           OR EAX,EAX

           JNE @@32

             MOV [DWORD DS:ERRMSG],OFFSET E_NODLL

             JMP ERROR

@@32:      MOV [DWORD DS:DLLBASE],EAX

           PUSH OFFSET ICONAME

           PUSH [DWORD DS:HINST]

           CALL LoadIconA

           MOV [DWORD DS:WCICON],EAX

           PUSH 7F88h                  ; IDC_NO

           PUSH 0                      ; External resource

           CALL LoadCursorA

           MOV [DWORD DS:HCURS],EAX

           PUSH 0                      ; WHITE_BRUSH

           CALL GetStockObject

           MOV [DWORD DS:HBGND],EAX

           PUSH OFFSET WCLASS

           CALL RegisterClassA

           PUSH 0                      ; Parameters: none

           PUSH [DWORD DS:HINST]       ; Instance

           PUSH 0                      ; Menu: none

           PUSH 0                      ; Parent window: none

           PUSH 100                    ; Width

           PUSH 200                    ; Height

           PUSH 80000000h              ; CW_USEDEFAULT

           PUSH 80000000h              ; CW_USEDEFAULT

           PUSH 10CF0000h              ; WS_OVERLAPPEDWINDOW|WS_VISIBLE

           PUSH OFFSET WNDNAME         ; Window name

           PUSH OFFSET CLSNAME         ; Class name

           PUSH 0                      ; Extended style: none

           CALL CreateWindowExA

           MOV [DWORD DS:HWND],EAX     ; Save handle

           PUSH 9                      ; SW_RESTORE

           PUSH EAX

           CALL ShowWindow

Firstbp:   NOP                         ; First breakpoint is set here

WINLOOP:     CMP [DWORD DS:PROCADR],0  ; Request to call some function?

             JE NOCALL

               MOV [DWORD DS:ORIGESP],ESP

               MOV [DWORD DS:ORIGEBP],ESP

               PUSH 0                  ; Security buffer (16 doublewords)

               PUSH 0

               PUSH 0

               PUSH 0

               PUSH 0

               PUSH 0

               PUSH 0

               PUSH 0

               PUSH 0

               PUSH 0

               PUSH 0

               PUSH 0

               PUSH 0

               PUSH 0

               PUSH 0

               PUSH 0

               MOV ECX,[DWORD DS:NARG]

               JECXZ @@44

               CMP ECX,10

               JBE @@40

                 MOV [DWORD DS:ERRMSG],OFFSET E_NPARM

                 JMP ERROR

@@40:          MOV EAX,OFFSET ARGLIST

@@42:            PUSH [DWORD EAX]      ; Push requested number of arguments

                 ADD EAX,4

                 LOOP @@42

@@44:          MOV [DWORD DS:EXPESP],ESP ; Expected ESP after return (C)

               MOV EAX,[DWORD DS:REGEAX] ; Preset registers

               MOV ECX,[DWORD DS:REGECX]

               MOV EDX,[DWORD DS:REGEDX]

               MOV EBX,[DWORD DS:REGEBX]

               MOV ESI,[DWORD DS:REGESI]

               MOV EDI,[DWORD DS:REGEDI]

Prepatch:      NOP                     ; Patch area before call

               NOP

               NOP

               NOP

               NOP

               NOP

               NOP

               NOP

               NOP

               NOP

               NOP

               NOP

               NOP

               NOP

               NOP

               NOP

CallDLL:       CALL [DWORD DS:PROCADR] ; Call DLL function

               NOP                     ; Patch area after call

               NOP

               NOP

               NOP

               NOP

               NOP

               NOP

               NOP

               NOP

               NOP

               NOP

               NOP

               NOP

               NOP

               NOP

               NOP

               MOV [DWORD DS:REGEAX],EAX ; Get modified registers

               MOV [DWORD DS:REGECX],ECX

               MOV [DWORD DS:REGEDX],EDX

               MOV [DWORD DS:REGEBX],EBX

               MOV [DWORD DS:REGESI],ESI

               MOV [DWORD DS:REGEDI],EDI

               MOV EAX,ESP

               SUB EAX,[DWORD DS:EXPESP]

               MOV [DWORD DS:ESPDIFF],EAX

               MOV EBP,[DWORD DS:ORIGEBP]

               MOV ESP,[DWORD DS:ORIGESP]

               MOV [DWORD DS:PROCADR],0 ; Confirm execution

               NOP

Finished:      INT 3                   ; Pause after execution

               NOP

NOCALL:      PUSH 0

             CALL Sleep                ; Be fair to other applications

             PUSH 1                    ; PM_REMOVE

             PUSH 0                    ; Process all messages

             PUSH 0

             PUSH 0                    ; Any window

             PUSH OFFSET MSG

             CALL PeekMessageA

             OR EAX,EAX

             JZ WINLOOP

             PUSH OFFSET MSG

             CALL TranslateMessage

             PUSH OFFSET MSG

             CALL DispatchMessageA

             MOV EAX,[DWORD DS:MSGID]

             CMP EAX,12h               ; WM_QUIT

             JNE WINLOOP

           PUSH 0

           CALL ExitProcess            ; Hasta la vista!

ERROR:     PUSH 00001001h              ; Special return code, means error

           CALL ExitProcess            ; Error detected

           ALIGN 4

Patcharea: DB 2047 DUP(90h)            ; Big patch area (2 K of NOPs)

Endpatch:  NOP

           ENDS _TEXT1

           END START

LOADDLL.RC:

MAINICON ICON                          // Green bug

{

 '00 00 01 00 02 00 20 20 10 00 00000000 E8 02'

 '00 00 26 00 0000 10 1010 00 00000000 28 01'

 '00 00 0E 03 00 00 28 00 0000 20 00 0000 40 00'

 '00 00 01 00 04 00 00000000 80 02 00 0000 00'

 '00 00 00000000000000000000000000 00'

 '00 00 0000 80 00 00 80 00 0000 80 80 00 80 00'

 '00 00 80 00 80 00 80 80 00 00 80 8080 00 C0 C0'

 'C0 00 0000 FF 00 00 FF 00 0000 FF FF 00 FF 00'

 '00 00 FF 00 FF 00 FF FF 00 00 FF FFFF 00 00 00'

 '00 00 00000000000000000000000000 00'

 '00 00 0000 02 A0 00 000000 A2 00 000000 00'

 '00 00 0000 0A 20 00 0000 0A 2A 2A 00 0000 00'

 '00 00 0000 A2 A2 00 0000 A2 A2A2 00 0000 00'

 '00 00 0000 2A 2A 00 00 0A 2A 2A2A 00 0000 00'

 '00 00 0000 A2 A2 00 00 A2 A2A2 A0 00 0000 00'

 '00 00 0000 2A 2A 00 0A 2A 2A2A 20 00 00 02 A2'

 '00 00 0000 02 A2 A0 A2 A2A2A2 00 0000 0A 2A'

 '2A 2A 00 00 0A 2A 2A2A2A2A 20 00 0000 02 A2'

 'A2 A2 A0 00 02 A2 A2A2A2A2 00 000000 0A 2A'

 '2A 2A 2A2A2A2A2A2A2A 00 0000000000 A2'

 'A2 A2 A2A2A2A2A2A2 00 000000000000 00'

 '2A 2A 2A2A2A2A2A2A 00 000000000000 00'

 '00 02 A2 A2A2A2A2A2 00 000000000000 00'

 '00 00 0A 2A 2A2A2A2A2A 00 0000000000 00'

 '00 00 02 A2 A2A2A2A2A2A2A2 00 000000 00'

 '00 00 0A 2A 2A2A2A2A2A2A2A 20 00 0000 00'

 '00 00 02 A2 A2A2A2A2A2A2A2A2A2 00 00 00'

 '00 00 0A 2A 2A2A2A2A 00 00 2A 2A2A 20 00 00'

 '00 00 A2 A2 A0 A2 A2 A0 00 00 02 A2 A2 A0 00 00'

 '00 00 2A 2A 00 0A 2A 20 00 0000 2A 2A 20 00 00'

 '00 00 00000000 A2 A0 00 000000000000 00'

 '00 00 00000000 2A 20 00 000000000000 00'

 '00 00 00000000 A2 A0 00 000000000000 00'

 '00 2A 20 00 0000 2A 2A 00 000000000000 00'

 'A2 A2 A0 00 0000 A2 A2 00 000000000000 00'

 '2A 2A 20 00 0000 2A 2A 00 000000000000 00'

 'A2 A2 A0 00 0000 02 A2 00 000000000000 0A'

 '2A 2A 20 00 0000 0A 2A 00 000000000000 02'

 'A2 A2 00 000000000000000000000000 0A'

 '2A 00 00000000000000000000000000 00'

 '00 00 000000000000000000000000 FF F9'

 'FF 3F FF F0 FE 0F FF F0 FC 07 FF E0 78 07 FF E0'

 '70 07 FF E0 60 0F8F E0 40 0F 00 F0 00 1F 00 70'

 '00 3F 00 10 00 7F 00 0000 FF 80 00 03 FF C0 00'

 '0F FF E0 00 03 FF FC 00 003F FF 00 001F FF 00'

 '00 03 FF 00 00 01 FF 00 0000 FE 00 0F 00 FE 04'

 '0F 80 FF 0E 0F C1 FF FE 0F FF FC 7E 0F FF F0 3E'

 '07 FF E0 3E 07 FF E0 3E 07 FF C0 3F 07 FF C0 3F'

 '07 FF C0 7F0F FF C0 FF FFFF E3 FF FFFF 28 00'

 '00 00 10 00 0000 20 00 0000 01 00 04 00 00 00'

 '00 00 C0 00 0000000000000000000000 00'

 '00 00 00000000000000000000 80 00 00 80'

 '00 00 00 80 80 00 80 00 0000 80 00 80 00 80 80'

 '00 00 80 8080 00 C0 C0C0 00 0000 FF 00 00 FF'

 '00 00 00 FF FF 00 FF 00 0000 FF 00 FF 00 FF FF'

 '00 00 FF FFFF 00 000000000000000000 00'

 '00 AA 00 0A AA 00 000000 AA 00 AA AA 00 00 00'

 '00 AA 0A AA A0 00 0A AA 00 0A AA AA 00 00 0A AA'

 'AA AA AA 00 000000 0A AA AAAA 00 000000 00'

 '0A AA AA A0 00 000000 0A AA AAAAAA 00 00 00'

 'AA AA AA 00 AA A0 00 000000 A0 00 000000 00'

 '00 00 A0 00 000000 0A 00 00 AA 00 000000 AA'

 '00 00 AA 00 000000 AA 00 000000000000 00'

 '00 00 00000000 FC E3 00 00 F8 41 00 00 F8 01'

 '00 00 88 03 00 0000 07 00 00000F 00 00 80 1F'

 '00 00 E0 03 00 00 F0 01 00 00 E0 00 0000 F0 31'

 '00 00 EE 3F 00 00 86 1F 00 00 86 1F 00 00 87 3F'

 '00 00 8F FF 00 00'

}


Отладка

Set high priority when tracing debugged process  (Задать высокий приоритет при трассировке отлаживаемого процесса)

Под Windows 95/98 установка высокого приоритета для отлаживаемого процесса значительно ускоряет обработку событий отладки. Например, на Pentium/450 прямая трассировка выполняет 1400 команд в секунду, если приоритеты OllyDbg и отлаживаемого процесса равны, и 2700, когда отлаживаемый процесс имеет более высокий приоритет. На операционных системах NT эта опция не имеет никакого значимого влияния на скорость отладки (которая является так или иначе выше и достигает 5000 команд в секунду). Чтобы не блокировать себя и другие программы, когда отладка находится в свободном выполнении, OllyDbg увеличивает её приоритет только тогда, когда идет анимация или трассировка (но не принудительная).

Warn about frequent conditional breaks  (Предупреждать о частых условных брейкпоинтах)

Если Вы устанавливаете условный брейкпоинт или брейкпоинт на память, OllyDbg может получить много ложных событий отладки. Если условие  не выполняется или нарушение доступа к памяти случилось вне указанной области (80x86-совместимые процессоры могут защищать память только в блоках по 4096 байт), OllyDbg автоматически продолжает выполнение. Отладка событий требует много внимания и от OllyDbg, и от операционной системы. Частые ложные остановки могут заставить выполнение чрезвычайно замедлиться (в худшем случае, менее чем 2000 команд в секунду на Pentium/450). Если эта опция включена, и число ложных остановок превышает 50 в секунду, OllyDbg выдает предупреждающее сообщение.

Smart update of memory map  (Умное обновление карты памяти)

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

Compress  analysis  data  (Сжимать данные анализа)

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

Search for references in  (Искать ссылки в):

Executable code of corresponding module  (Выполнимом коде соответствующего модуля)

Memory block currently selected in Disassembler  (Блоке памяти, в настоящее время выбранном в Дизассемблере)

Определяет, где OllyDbg ищет ссылки.

Use hardware breakpoints to step or trace code  (Использовать аппаратные брейкпоинты для прохождения и трассировки кода)

Если Вы проходите или трассируете выполнимый код, OllyDbg пытается использовать одношаговую ловушку. В некоторых случаях, например, если Вы попросили обойти вызов подпрограммы, или выполнить строковую команду сразу, или выполнить вашу программу до выделения, OllyDbg должен установить временный брейкпоинт. Обычно он использует команду INT3. Если OS поддерживает аппаратные контрольные точки, эта опция активна, и есть по крайней мере один свободный аппаратный брейкпоинт, OllyDbg устанавливает временный аппаратный брейкпоинт. Поскольку межпроцессный доступ к памяти отнимает много времени, аппаратные брейкпоинты могут ускорять прямую трассировку на целых 20 % (трассировка с обходом). Заметьте, что аппаратные брейкпоинты неразрушающие, то есть не изменяют содержимое памяти. Эта особенность была предложена kab.

Hide non-existing source files  (Скрыть несуществующие файлы с исходниками)

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


Отладка автономных DLL

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

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

Откройте DLL, или перетащите его на OllyDbg из окна Проводника. OllyDbg запросит у Вас подтверждение, и передаст полное имя DLL как параметр для loaddll.exe . После того, как библиотека загрузится, OllyDbg сделает паузу в начале кода DLL (< DllEntryPoint  >). Вы можете устанавливать брейкпоинты, запускать или трассировать код  и т.д. После того, как инициализация закончена, приложение делает паузу снова, на этот раз в loaddll  на брейкпоинте, помеченном как Firstbp , который расположен сразу же перед главным циклом Windows.

Теперь Вы можете вызывать функции DLL. Из главного меню выберите «Debug -> Call DLL export» («Отладка->Вызвать экспортируемую функцию DLL»). Всплывающий диалог не является модальным, поэтому Вы все еще имеете полный доступ ко всему, что отображает OllyDbg. Вы можете просмотреть код и данные, установить брейкпоинты, изменить память и т. д. Выберите функцию, которую Вы хотите вызвать. Как пример, здесь я буду использовать MessageBox  из модуля USER32.DLL . Loaddll.exe  уже использует эту библиотеку, поэтому Windows предполагает, что DLL уже инициализирован и не вызывает точку входа снова. Название MessageBox , в действительности это версия ASCII MessageBoxA  и версия в UNICODE MessageBoxW . Давайте попробуем второе:

Когда мы выбираем название функции, прямоугольник справа говорит: «Number of arguments: 4» («Число параметров: 4»). Анализатор определил, что функция заканчивается на RET 10 и правильно распознал число её параметров. RET nnn типично для функций, которые используют вызовы PASCAL (параметры передаются в стек, первый параметр помещается последним, функция удаляет параметры после её вызова). Большинство функций Windows API используют стиль PASCAL.

Далее устанавливается число параметров стека. В нашем случае в этом нет необходимости, так как OllyDbg уже знает правильное число параметров. Но, конечно, Вы можете отменить это решение в любое время, нажав по соответствующему чекбоксу (checkbox) слева.

Теперь заполните список параметров. Этот диалог поддерживает до 6 параметров регистров и до 10 параметров в стеке. Параметр это любое допустимое выражение, которое не использует содержимое регистров. Если операнд указывает на память, окно Дампа справа от содержимого показывает параметры этой памяти. Loaddll.exe  резервирует 10 буферов памяти, по 1K каждый и помечает их, как Arg1.. Arg10 , которые Вы можете свободно использовать для любых целей. Дополнительно, диалог поддерживает две псевдопеременные: хэндл (handle) родительского окна <Hwnd >, созданный loaddll.exe,  и хэндл приложения loaddll  <Hinst >. Для вашего удобства, когда Вы используете Вызов экспортируемых функций (Call export) впервые, OllyDbg добавляет их в журнал истории.

MessageBoxW  требует для своего создания 4 параметра:

·            Хэндл окна владельца. Здесь, мы просто выбираем <Hwnd> ;

·            Адрес текста в формате UNICODE в окне сообщения. Выберите Arg2 , и нажмите ENTER. Дамп отображает содержимое буфера памяти в шестнадцатеричном формате. Этот буфер первоначально заполнен нулями. Выберите первый байт, и нажмите CTRL+E  (альтернатива, выберите «Binary -> Edit» («Бинарные -> Правка») в главном меню). В появившемся окне, напечатайте в формате UNICODE «Text in box» или любой другой текст для отображения;

·            Адрес заголовка UNICODE в окне сообщения. Выберите Arg3 , и напишите «Box title» к направлению памяти;

·            Стиль окна сообщения как комбинация MB_xxx констант. OllyDbg знает их, напечатайте здесь MB_OK|MB_ICONEXCLAMATION.

Нам не нужны никакие параметры регистров.

Теперь мы готовы вызвать экспорт. Опция «Hide on call» означает, что диалоговое окно должно исчезнуть с экрана, когда функция будет выполнена. Эта опция полезна, когда выполнение занимает существенное время, или если Вы устанавливаете брейкпоинты. Вы можете также закрыть диалог вручную. Когда вызываемая функция завершает выполнение, OllyDbg автоматически повторно откроет окно Вызов экспорта. «Pause after call» означает, что loaddll  будет делать паузу после вызова.

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

MessageBoxW  не изменяет его параметры. Если Вы вызываете функцию, которая обновляет память, подобно GetWindowName , окно дампа выделит измененные байты. Обратите внимание, что EAX = 1 после возврата, что означает успех.

Другой пример доступен на моем Internet сайте, http://home.t-online.de/home/Ollydbg/Loaddll.htm .

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


Окно стека

Область окна Стек в окне CPU отображает стек фактического потока. Обычно, когда отлаживаемое приложение делает паузу в выполнении, окно стека отображает элемент, фактически направленный в ESP отображая его сверху. Этот адрес имеет черный фон. В некоторых случаях может быть более удобно отключить прокрутку. Вы можете сделать это или из контекстного меню, или горячей кнопкой «ADDRESS» в панели.

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

Область окна Стека прослеживает цепочку структурированных обработчиков исключения (SEH) и комментирует адреса обработчиков и указателей на следующий элемент в этой цепочке. Адрес начала SEH цепочки - первое двойное слово блока данных соответствующего потока. Чтобы определить его местоположение, перейдите к выражению [FS:0].

Вы можете установить, чтобы OllyDbg отслеживал фреймы стека. Процедуры создают фреймы стека, когда они выполняют PUSH EBP; MOV EBP,ESP или ENTER xxx,0. И снова то же самое предупреждение: я не гарантирую, что найденные фреймы стека фактические.

Если EIP указывает на вызов (CALL), или переход к известной функции или к известной функции непосредственно, OllyDbg расшифрует параметры вызова этой функции в стеке.

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

Меню окна Стек содержит следующие разделы:

Адрес

  Абсолютный  - указывает OllyDbg отображать абсолютные адреса в шестнадцатеричном формате.

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

  Относительно  ESP  - указывает OllyDbg отображать адреса стека относительно содержимого ESP в    фактическом потоке. Если содержимое ESP изменено, адреса следуют за измененным значением.

  Относительно  EBP  - указывает OllyDbg отображать адреса стека относительно содержимого EBP в    фактическом потоке. Если содержимое EBP изменено, адреса следуют за измененным значением.

Показать ASCII дамп  - отображает дополнительный столбец с дампом в формате ASCII.

Показать  UNICODE  дамп  - отображает дополнительный столбец с дампом в формате UNICODE.

Скрыть дамп  - закрывает столбец с дампом UNICODE или ASCII.

Блокировать Стек  - отключает автоматический скроллинг стека, к фактическому содержанию ESP, каждый раз когда приложение делает паузу. Альтернативно, нажмите кнопку «Address » в панели. Когда скроллинг заблокирован, кнопка изменяется на «Locked ».

Разблокировать Стек  - разрешает автоматический скроллинг стека, к фактическому содержимому ESP, каждый раз, когда приложение делает паузу. Альтернативно, нажмите кнопку «Locked »  в панели. Когда скроллинг разрешен, кнопка изменяется на «Адрес ».

Копировать в буфер обмена  (Ctrl+C ) - копирует выбранный фрагмент в буфер обмена. Чтобы исключить какой-либо столбец из копирования, уменьшите его ширину до минимально возможного (остатки столбца окрашиваются в серый). Если какой-либо текст шире чем столбец, OllyDbg заменит последний видимый символ в столбце значком '> '.

Изменить  - позволяет редактировать содержимое первого выбранного двойного слова.

Редактирование  (Ctrl+E ) - позволяет редактировать выбранный фрагмент в ASCII, UNICODE или в hexadecimal форматах.

Push DWORD  - уменьшает ESP на 4.

Pop DWORD  - увеличивает ESP на 4.

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

Поиск бинарной строки  (Ctrl+B ) - отображает диалог, позволяющий определить образец поиска. Максимальный размер образца поиска - 256 байт. Вы можете исключать некоторые байты или участки кода из сравнения. Например, если Вы устанавливаете поиск образца 12 ?? ?6 78 , то этот образец будет соответствовать и 12 34 56 78  и 12 00 06 78 , но не 12 34 55 78 . Вы можете также игнорировать регистр символов ASCII/UNICODE при поиске.

Перейти к  ESP (Звездочка ) - переходит к содержимому регистра ESP фактического потока в окне Стек.

Перейти к  EBP - переходит к содержимому регистра EBP фактического потока в окне Stack.

Перейти к выражению  (Ctrl+G ) - устанавливает стек на значении указанного выражения.

Перейти в Дизассемблер  (Enter ) - переходит к содержимому первого выбранного двойного слова в окне Дизассемблер.

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

Перейти в Стек  - переходит к содержимому первого выбранного двойного слова в окне Стек.

Appearance (Оформление)  - детальное описание здесь


Исполнять до возврата

Вы можете пропустить некоторую подпрограмму и возвратиться к её команде вызова (CALL). OllyDbg может трассировать выполнение программы без вхождения во все вызываемые подпрограммы и останавливаться на первом встреченном возврате (RET, RETF или IRET). Из главного меню, выберите «Debug -> Execute till return » («Отладка -> Запустить до возврата») или нажмите Ctrl+F9 . Пошаговое выполнение - относительно медленно, всего лишь до 5000 команд в секунду на Pentium/500 под Windows NT. Если трассировка занимает слишком много времени, нажмите Esc  или F12 , чтобы остановить выполнение до возврата.

Если Вы хотите выполнить команду возврата и приостановить программу на следующей команде после соответствующего вызова, активируйте опцию «After execution till RET, step over RET » («После запуска до возврата, перейти через RET») в опциях Трассировки.

См. также: Выполнить до кода пользователя, Выполнить до условия


Исполнять до кода пользователя

Иногда ваше приложение останавливается где-нибудь глубоко в системном коде. Чтобы возвратиться назад к отлаживаемой программе, Вы можете нажимать Ctrl+F9  (Execute till return(Выполнить до возврата)) несколько раз, проверяя каждый раз, где Вы находитесь. Однако есть другой, более быстрый способ для этого. Если Вы нажмёте Alt+F9  или выберете «Debug -> Execute till user code » («Отладка -> Выполнить до кода пользователя») из главного меню, OllyDbg будет трассировать код, пока не достигнет первой команды, которая находится не в системном DLL. (С точки зрения OllyDbg, любой DLL файл, который постоянно находится в системном каталоге Windows, является системным). Пошаговое выполнение относительно медленное, всего лишь до 5000 команд в секунду на Pentium/500 под Windows NT. Если трассировка занимает слишком много времени, нажмите Esc  или F12 , чтобы остановить выполнение до пользовательского кода.

Запомните : если системный DLL вызывает пользовательскую функцию, OllyDbg перейдёт через него. Чтобы устранить это, Вы можете установить однократный брейкпоинт на доступ на доступе к пользовательскому коду (доступно только под Windows NT 4.0, 2000 и XP).

См. также: Выполнить до условия


Окно модулей

Окно модулей (сочетание клавиш: 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  (Анализировать все модули) - позволяет анализировать все модули сразу. Анализ извлекает полезную информацию из загруженного кода; отладка обычно проходит быстрее и намного надежнее, когда код проанализирован.

Сделав двойной клик по строке, Вы перейдёте к выполняемому в модуле коду в панели Дизассемблера.


Текущая отладка

Когда некоторая программа генерирует исключение, Windows может вызывать зарегистрированный в системе отладчик и присоединять его к программе. Эта функция называется отладкой «just-in-time» (Just-in-time debugging).

Некоторые JIT отладчики останавливаются при их вызове на системном брейкпоинте. В отличие от них OllyDbg продолжает выполнение, пока не достигнет команды, которая сгенерировала исключение. Это более удобно, но приводит к одной проблеме под системами Windows 95: OllyDbg не может различить системный брейкпоинт и вызов функции DebugBreak  () . И как результат продолжает выполнение приложения, которое сделало остановку на DebugBreak  ().  Этой проблемы не существует под Windows NT/2000.

Отладка «just-in-time» управляется двумя разделами в системном реестре:

·   HKEY _ LOCAL _ MACHINE \ SOFTWARE \ Microsoft \ Windows  NT \ CurrentVersion \ AeDebug \ Debugger  - содержит команду, которая вызывает отладчик;

· HKEY _ LOCAL _ MACHINE \ SOFTWARE \ Microsoft \ Windows  NT \ CurrentVersion \ AeDebug \ Auto  - спрашивать пользователя перед присоединением отладчика к приложению.

Любопытно, все действия в Windows NT также применительны и к системам, основанным на Windows95.

Чтобы сделать OllyDbg отладчиком «just-in-time», нажмите «Make OllyDbg just-in-time debugger » (Сделать OllyDbg отладчиком «just-in-time»)

Чтобы восстановить прежние установки, нажмите «Restore old just-in-time debugger » (Восстановить прежний отладчик «just-in-time»)

Кнопки «Confirm before attaching » (Подтверждать перед присоединением) и «Attach without confirmation » (Присоединять без подтверждения) указывают OllyDbg или другому отладчику, отображать или нет подтверждение перед присоединением к программе.


Окно названий

Окно названий, показывает список всех символьных имен (меток)в некотором модуле. Эти имена включают экспортные (общие символы, доступные другими модулям), импортные (ссылки к внешним символам из других модулей), определяемые пользователем метки и метки, извлеченные из информации об отладке или файлов объекта. Чтобы просмотреть названия, нажмите Ctrl+N  в окне Дизассемблера или окне Модулей (Executable Modules window).

Импортируемые - определяются названиями модулей, где расположены внешние символы. Некоторые модули могут экспортировать символы порядковыми числами (ordinal numbers). OllyDbg отображает ординалы в форме *nnn, где nnn- десятичное число.

Вы можете устанавливать заданный по умолчанию порядок названий (сортируемый в адресном или в алфавитном порядке) в  Address options(опции Адресов). Чтобы изменить порядок сортировки, нажмите соответствующую кнопку на панели или выберите соответствующий пункт в контекстном меню. Если Вы сортируете имена в алфавитном порядке, пожалуйста заметьте, что OllyDbg игнорирует имена модулей и некоторые другие символы, подобно символам подчеркивания, вопроса или амперсанда.

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

Окно названий (Names window) поддерживает следующие действия:

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

Follow in Disassembler  (Перейти в Дизассемблер)( клавиша ENTER )  переходит по адресу в окно Дизассемблера. Этот пункт меню доступен, только если адрес указывает на выполняемый код в текущем модуле.

Follow import in Disassembler  (Перейти по импорту в Дизассемблер)- Импорт - указатель на именованный адрес во внешнем модуле. Этот пункт меню переходит к содержимому двойного слова по связанному адресу в окне Дизассемблера.

Follow in Dump  (Перейти в Дамп) - следует по указанному адресу в окно Дампа CPU.

Find references  (Найти ссылки) - ищет все команды в модуле которые ссылаются на указанное имя.

Find references to import  (Найти ссылки на импорт) (Enter)  - ищет все команды в модуле которые ссылаются на адреса импорта. Некоторые компиляторы осуществляют вызов импортированной функции как вызов косвенного перехода к импортированной функции. Если существует только один такой переход, OllyDbg автоматически ищет ссылки к этому переходу. Заметьте, что эта опция и опция "Follow in Disassembler"  являются взаимоисключаемыми.

View call tree ( Просмотреть "Дерево вызовов")  - отображает дерево вызовов для выбранного имени.

Help on symbolic name  (Справка о символьном названии) (Ctrl+F1)  - если выбран справочный файл по API функциям Windows, OllyDbg ищет в нём пояснение символьного названия.

Toggle breakpoint  (Установить брейкпоинт) (F2)  - устанавливает INT3 брейкпоинт на команде по данному адресу.

Conditional breakpoint  (Брейкпоинт с условием) (Shift+F2)  - позволяет устанавливать брейкпоинт с условием на команде по данному адресу.

Conditional log breakpoint  (Условный Брейкпоинт с записью) (Shift+F4)  - позволяет устанавливать условный брейкпоинт с записью. Для пояснения, см. Брейкпоинты.

Toggle breakpoint on import ( Установить брейкпоинт на импорте) - устанавливает INT3 брейкпоинт на команде, на которую указывает двойное слово по выбранному адресу.

Conditional breakpoint on import ( Брейкпоинт с условием на импорте) - позволяет устанавливать брейкпоинт с условием на команде, на которую указывает двойное слово по выбранному адресу.

Conditional log breakpoint on import  (условный Брейкпоинт с записью на импорте) - позволяет устанавливать условный Брейкпоинт с записью на импорте.

Set breakpoint on every reference  (Установить брейкпоинт на каждой ссылке) - ищет ссылки и устанавливает  INT3 брейкпоинты без условия на каждой ссылке. Эта команда очень полезна, если Вы хотите прерваться на всех вызовах некоторых функций API под OS основанными на Windows 95. Под Windows NT, Вы можете устанавливать брейкпоинт непосредственно на входе в функцию API. Эта команда не пытается находить ссылки к функциям, загружаемым с помощью GetProcAddress .

Set log breakpoint on every reference  (Установить брейкпоинт с записью на каждой ссылке) - позволяет Вам искать ссылки и устанавливать брейкпоинты с записью, с одинаковым условием на каждой ссылке.

Remove all breakpoints  (Удалить все брейкпоинты) - ищет ссылки и удаляет любые виды брейкпоинтов во всех найденных ссылках.

Appearance  (Оформление) - смотри здесь.


Окно SEH

SEH - сокращение от "Structured Exception Handler (Структурированый обработчик исключений)". Если приложение совершает какую-либо ошибку, подобно делению на 0 или вызов чисто виртуальной функции, Windows вызывает исключение и ищет обработчик, который готов обработать его. В коде C++ Вы объявляете хэндлы использующие try/catch пары.

Обработка исключений должна быть связана с кодом. Если деление на 0 случается в подпрограмме Calculatemeanvelocity, Вы можете установить среднюю скорость на 0. Если это происходит в остальной части кода, лучшее решение - записать назад изменяемые файлы и завершить задачу. Чтобы сделать это поведение, обработчики связаны в цепочку. Каждые элементы содержат два элемента двойного слова:

addr+ 0  Pointer to next SEH record

addr+ 4  Address of SE handling function

Pointer=0xFFFFFFFF означает конец цепочки. Каждый поток имеет свою собственную SEH цепочку, ее адрес начало - первое двойное слово блока данных соответствующего потока. Чтобы определить местонахождение начала, следуйте в выражение [FS:0]. При исключении, Windows следует по цепочке и вызывает каждый обработчик, узнавая, способен ли он обработать исключение. Если достигнут конец цепочки, Windows вызывает заданный по умолчанию обработчик исключительных ситуаций. В большинстве случаев, он отображает сообщение и заканчивает приложение.

SHE окно отображает SHE цепочку для потока, выбранного в окне центрального процессора. Из этого окна, Вы можете смотреть записи или хэндлы и устанавливать брейкпоинты на входе функцию. Чтобы избежать бесконечной рекурсии, полная длина цепочки ограничена 500 элементами.


Меню окна Дизассемблер

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

Backup functions  (Функции резервного сохранения) - см. описание здесь.

Copy  (Копировать)

To clipboard  (В буфер обмена) (Ctrl+C ) - копирует выбранную часть кода в буфер обмена. Использует выбранную в настоящее время ширину столбцов. Чтобы исключить столбец из копируемого фрагмента, уменьшите его ширину до минимально возможной (в этом случае оставшаяся часть столбца станет серой). Если текст шире столбца, OllyDbg заменяет последний видимый символ в столбце символом '>'.

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

Select all  (Выделить всё) - выделяет весь код, отображаемый в панели Дизассемблер

Select procedure  (Выбрать процедуру) - выбирает текущую распознанную процедуру.

Binary  (Бинарные)

Edit  (Редактирование) (Ctrl+E ) -  позволяет Вам редактировать выбранную часть кода как ASCII, UNICODE или шестнадцатеричную строку. Все три области редактирования связаны друг с другом, прокручиваются вместе (первый видимый байт - тот же самый во всех 3 окнах) и немедленно отображают изменения, которые Вы сделали в любой области управления. Нажимая клавиши Ctrl+Стрелка вверх  или Ctrl+Стрелка вниз  Вы можете быстро переходить в соответствующее место в различных областях. Максимальная длина отредактированного кода - 256 байт. Неполные символы отображаются как красные знаки вопроса. Если hexadecimal строка содержит нечетное число участков, OllyDbg завершает их 0-ми. Когда опция «Keep size» («Сохранять размер») включена, Вам не разрешается вставлять или удалять символы или переписывать конец выбранного участка кода.

Fill with 00's  (Заполнить 00-ми) - заполняет выбранную часть кода нолями.

Fill with NOP's  (Заполнить NOP-ами) - заполняет выбранную часть кода NOP-ами

Binary copy  (Бинарное копирование) - копирует выбранную часть кода как шестнадцатеричный дамп ASCII в буфер обмена.

Binary paste  (Бинарная вставка) - вставляет шестнадцатеричный дамп из буфера обмена в выделенный участок. OllyDbg сканирует текст в буфере обмена и извлекает шестнадцатеричные цифры (0 .. 9, A.. F, a .. f), игнорируя все остальные символы. Код вне выбранной области остается неизменным. Если последний байт содержит отдельную HEX цифру, то она игнорируется. Например: "part of code" интерпретируется как AF CD, но не как AF CD 0E.

Copy with masked fixups  (Копировать с привязками к адресам по маске) - то же самое что и бинарное копирование, но заменяет все адресные привязки знаками вопроса. Облегчает поиск похожих фрагментов кода. См. также Поиск бинарных строк.

Modify byte  (Изменить байт) - позволяет Вам редактировать содержимое байтовой константы как десятичное число со знаком, либо десятичное или шестнадцатеричное число без знака.

Modify integer  (Изменить целое число) - позволяет Вам редактировать содержимое целочисленной константы как десятичное число со знаком, либо десятичное или шестнадцатеричное число без знака.

Modify float  (Изменить число с плавающей запятой) - позволяет Вам редактировать содержимое выбранной константы с плавающей запятой.

Modify MMX  (Изменить MMX) - позволяет Вам редактировать содержимое выбранной MMX константы как совокупность десятичных чисел со знаком, десятичных без знака или hexadecimal областей.

Modify 3DNow!  (Изменить 3DNow!) - позволяет Вам редактировать содержимое выбранной 3DNow! константы как пару чисел с плавающей запятой или шестнадцатеричное число.

Modify SSE  (Изменить SSE) - позволяет Вам редактировать содержимое выбранной SSE константы, как набор 4 чисел с плавающей запятой или шестнадцатеричные числа.

Undo selection  (Отменить выделение) (Alt+BkSpc)  - заменяет выбранную часть кода соответствующей частью резервных данных. Доступно только когда резервные данные существуют и отличаются от выбранного кода.

Assemble  (Ассемблировать) (Пробел ) -  позволяет Вам редактировать или записывать поверх существующего кода одну или несколько команд на языке ассемблера. Подробности, см. Ассемблер.

Label  (Метка) (: ) - позволяет Вам назначать пользовательскую метку на первый выбранный адрес.

Edit label  (Редактировать метку) (: ) - позволяет Вам редактировать или стирать пользовательскую метку, назначенную на первый выбранный адрес.

Comment  (Комментарий) (; ) - позволяет Вам добавлять комментарий к первому выбранному адресу.

Edit comment  (Редактировать комментарий) (; ) - позволяет Вам редактировать или стирать пользовательский комментарий, назначенный на первый выбранный адрес.

Breakpoint

Toggle  (Установить) (F2 ) - устанавливает INT3 брейкпоинт на первой выбранной команде.

Conditional  (Условный) (Shift+F2 ) - позволяет устанавливать условный брейкпоинт на первой выбранной команде.

Conditional log  (Условный с записью) (Shift+F4 ) - позволяет устанавливать условный брейкпоинт  с записью. Подробности, см. брейкпоинт .

Message breakpoint on WinProc  (Брейкпоинт на сообщения WinProc) - позволяет редактировать активный брейкпоинт  на сообщения. Брейкпоинт на сообщения может быть установлен из окна Windows.

Run to selection  (Выполнять до выделенного) (F4 ) - устанавливает одношаговый брейкпоинт  на первой выделеной команде и продолжает выполнение отлаживаемой программы. Если OllyDbg останавливает программу перед достижением этой команды, одношаговый брейкпоинт остается активным. В случае необходимости, Вы можете удалить его в окне Breakpoints .

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

Memory, on write  (На запись в память) - устанавливает брейкпоинт в выбранной части памяти. Программа останавливается каждый раз, когда происходит запись в данный блок памяти. OllyDbg поддерживает единственный брейкпоинт на память любого размера. Брейкпоинт на память может значительно замедлять выполнение. Под Windows 95/98, брейкпоинт на память может привести к краху отлаживаемой программы, когда системные подпрограммы обращаются к блокам памяти, содержащим брейкпоинт. Используйте его в крайнем случае.

Remove memory breakpoint  (Удалить брейкпоинт на память) - удаляет установленный брейкпоинт на память.

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

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

Remove hardware breakpoint   (Удалить аппаратный брейкпоинт) - удаляет аппаратный брейкпоинт, установленный на первом выбранном байте.

Set real SFX entry here  (Установить реальный SFX вход здесь) - объявляет первую выбранную команду как реальную точку входа в распакованную SFX программу. Если реальный SFX вход объявлен, и опция "Use real entry from previous run" ("Использовать реальный вход из предыдущего выполнения") активирована, OllyDbg сможет быстро обходить распаковщик и останавливаться на реальном входе.

Hit trace  (Пошаговая трассировка) - команды, которые управляют пошаговой трассировкой, доступны только для проанализированного кода.

Add selection  (Добавить выбор) - вызывает пошаговую трассировку для выбранной части кода.

Add procedure  (Добавить процедуру) - вызывает пошаговую трассировку для текущей процедуры.

Add all recognized procedures  (Добавить все распознанные процедуры) - вызывает пошаговую трассировку на всех процедурах, распознанных Анализатором в коде, отображаемом в панели Дизассемблера. Чтобы избежать сбоев, я рекомендую, чтобы Вы выбрали строгое или эвристическое распознавание процедур.

Remove from selection  (Удалить из выделенного) - удаляет пошаговую трассировку из выделенного. Если в нём есть принудительный запуск трассировки, также удаляет и его.

Remove from module  (Удалить из модуля) - удаляет пошаговую трассировку из секции кода в модуле, который в настоящее время выбран в Дизассемблере. Если в нём есть принудительный запуск трассировки, также удаляет и его.

Mark selection as not traced  (Пометить выделенное как не трассированное) - отмечает все выбранные команды с активизированной пошаговой трассировкой как не пройденные.

Mark module as not traced  (Пометить модуль как не трассированный) - отмечает все команды с активизированной пошаговой трассировкой в пределах секции кода в модуле, выбранном в Дизассемблере как не пройденные.

Run trace  (Прямая трассировка) - команды, которые управляют прямой трассировкой, доступны только, когда код проанализирован.

Add selection  (Добавить выбор) - принудительная трассировка в выбранной части кода и одновременный вызов пошаговой трассировки.

Add procedure  (Добавить процедуру) - принудительная трассировка для текущей распознанной процедуры и одновременный вызов пошаговой трассировки.

Add branches in procedure  (Добавить ветви в процедуру) - принудительная трассировка для всех распознанных адресов переходов и вызовов и удаление трассировки из всех остальных команд в текущей процедуре. Одновременно вызывает пошаговую трассировку.

Add entries of all procedures  (Добавить входы всех процедур) - принудительная трассировка на точках входа распознанных процедур и удаление трассировки из всех остальных команд в текущем модуле. Одновременно вызывает пошаговую трассировку для всех распознанных процедур.

Skip selection when tracing  (Пропустить выделенное при трассировке) - исключает выбранную квазилинейную часть кода из трассировки. Когда трассировка сталкивается с исключенным кодом, устанавливается временный брейкпоинт в конце выделенного фрагмента и выполняется весь код сразу. Это значительно ускоряет трассировку.

Set condition  (Установить условие) (Ctrl+T ) - позволяет устанавливать условие для остановки процесса трассировки.

Profile current module  (Профилировать текущий модуль) - открывает окно с данными профиля текущего модуля.

Global profile  (Глобальный профиль) - открывает окно с данными профиля целого приложения. Сбор глобальных данных профиля может занять много времени.

Remove from selection  (Удалить из выбора) - удаляет принудительную трассировку из выбранного.

Remove from module  (Удалить из модуля) - удаляет принудительную трассировку из секции кода модуля, который в настоящее время выбран в Дизассемблере.

Follow  (Перейти) (ENTER ) -  следует по адресу перехода, вызова, возврата или переключателя. См. также История команд.

Follow immediate constant   (Перейти за непосредственной константой) - если непосредственная константа в команде указывает на код, переходит по указанному адресу.

Follow SE handler  (Перейти в SE обработчик) (ENTER ) - если фактическая команда устанавливает структурированный обработчик исключений (SEH), переходит к точке входа обрабатываемой подпрограммы.

New origin here  (Новый указатель выполнения здесь) (Ctrl+Gray * ) - устанавливает EIP выбранного в настоящее время  потока на адрес первого выбранного байта. Вы можете отменить эту операцию, если Вы перейдете в панель Регистры и выберете EIP.

Go to  (Перейти к):

Origin  (Указатель выполнения) (* ) - переходит по адресу, содержащему EIP текущего потока.

Previous  (Предыдущий) (- ) - переходит к предыдущему адресу в истории команд. Вы не можете просматривать историю выполнения, когда открыт буфер прямой трассировки.

Previous run trace record  (Предыдущая запись трассировки) (- ) - переходит к предыдущей записи в буфере трассировки.

Next  (Следующий) (+ ) - переходит к следующему адресу в истории команд. Вы не можете просматривать историю выполнения, когда открыт буфер прямой трассировки.

Next run trace record  (Следующая запись трассировки) (+ ) - переходит к следующей записи в буфере трассировки.

Expression  (Выражение) (Ctrl+G ) -  позволяет Вам переходить к шестнадцатеричному адресу или результату выражения. Диалог сохраняет несколько последних введенных адресов. Чтобы облегчить распознавание, Вы можете комментировать адреса, просто напечатайте любой текст, отделенный от адреса или выражения точкой с запятой.

Previous procedure  (Предыдущая процедура) (Ctrl+Minus ) - переходит в начало предыдущей распознанной процедуры.

Next procedure  (Следующая процедура) (Ctrl+Plus ) - переходит в начало следующей процедуры.

Previous reference  (Предыдущая ссылка) (Alt+F7 ) - переходит к предыдущей найденной ссылке . Выделение в окне Ссылки (Reference) перемещается синхронно с окном Дизассемблер.

Next reference  (Следующая ссылка) (Alt+F8 ) - переходит к следующей найденной ссылке.

Source file  (Исходный файл) (Ctrl+F5 ) - открывает окно с исходниками и отображает код, соответствующий первой выбранной команде. В настоящее время эта опция доступна, только если выполняемый файл содержит информацию об отладке в формате Borland.

Switch base  (Основание переключателя),

Default case  (Случай по умолчанию),

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

More cases...  (Больше случаев...)  - если число случаев в переключателе превышает 10, открывает окно, которое отображает все случаи в переключателе.

CALL from xxxx,

JMP from xxxx,

JNZ from xxxx,

JMP [ ] from xxxx  и т.д. - следует к команде, которая переходит к выбранной команде или вызывает её. Это может быть прямой или косвенный местный (intramodular) вызов, прямой безусловный переход, условный переход или таблица переключателей. Заметьте, что вызовы из различных модулей не перечисляются, даже если они присутствуют в дереве вызовов.

More jumps and calls...  (Больше переходов и вызовов...) (Ctrl+J ) - если число переходов и вызовов к текущему местоположению превышает 10, открывает окно, которое отображает все переходы и вызовы к выбранной команде. Клавиша всегда активна, даже если этот элемент не появляется в меню.

Call DLL export  (Вызов экспорта DLL) - вызывает диалоговое окно Экспортируемые вызовы. Доступно, только если Вы делаете отладку автономных DLL и первая выбранная строка - точка входа экспортируемой функции в этом DLL.

Thread  (Поток) - в многопотоковых приложениях позволяет быстрый переход между различными потоками.

Follow  in  Dump  (Просмотр в Дампе)

Selection  (Выбор) - повторно открывает блок памяти в окне Дамп CPU и переходит к первому выбранному адресу.

Constant  (Константа) - переходит к непосредственной константе в область окна Дамп.

Address constant   (Константа Адреса) - переходит к константе, которая является частью адреса в области окна Дампа. Например, если выбранная в настоящее время команда - MOV [ESI+123456], 543210, окно Дамп отобразит содержимое памяти, начинающейся с адреса 0x123456.

Immediate constant  (Непосредственная константа) - переходит к непосредственной константе в панель Дампа. Например, если выбранная в настоящее время команда - MOV [ESI+123456], 543210, окно Дамп отобразит содержимое памяти, начинающейся с адреса 0x543210.

Implicit stack address  (Неявный адрес стека) - переходит к местоположению стека, неявно адресованному ESP, как в командах PUSH и RET.

Memory address  (адрес памяти),

First address  (первый адрес),

Second address  (второй адрес) - переходит по адресу в панель Дампа. Например, если в настоящее время выбранная команда - MOV [ESI+123456], 543210 и ESI содержит 0x10, Дамп отобразит содержимое памяти, начинающейся с адреса 0x123466. Некоторые команды, подобно MOVS, имеют два операнда памяти. В этом случае, первый адрес - это местоположение, а второй адрес - источник.

View call tree  (Просмотреть Дерево вызовов) (Ctrl+K ) -  открывает окно Дерево вызовов, которое отображает все известные вызовы к текущей процедуре и всем процедурам, вызываемым с текущей процедуры. Если Вы хотите расширить дерево в различные модули, пожалуйста, проанализируйте их.

Search for  (Искать)

Name (label) in current module  (Имя (метку) в текущем модуле) (Ctrl+N ) - отображает таблицу, содержащую все названия (экспортируемые, импортируемые, библиотеки, определяемые пользователем) определяемые или используемые в текущем модуле.

Name in all modules  (Название во всех модулях) - отображает таблицу, содержащую все известные названия.

Command  (Команду) (Ctrl+F ) - позволяет Вам искать команду в формате ассемблера. OllyDbg пробует находить все возможные кодировки. Например, если Вы ищете MOV EAX, [123456], то OllyDbg будет искать и A1 56341290  и 8B05 56341200 . Вы можете также искать неточные команды, подобно MOV R32, [CONST] - которым соответствует и MOV EAX, [10000] и MOV ESI, [123456]. Однако этот вид поиска не может находить более сложные формы адресов. Для получения лучших результатов, проанализируйте код перед началом поиска.

Sequence of commands  (Последовательность команд) (Ctrl+S ) - позволяет Вам искать последовательность команд на языке ассемблера. Эта последовательность может включать неточные команды и соответствие регистрам и позволяет опускать промежуточные команды.

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

Binary string  (Бинарная строка) (Ctrl+B ) - отображает диалоговое окно, в котором Вы можете ввести образец поиска. Максимальный размер образца поиска - 256 байт. Вы можете исключать некоторые байты или участки из сравнения. Например, если Вы устанавливаете образец поиска 12??? 6 78 , то он будет соответствовать и 12 34 56 78  и 12 00 06 78 , но не 12 34 55 78 . Вы можете также игнорировать регистр символов ASCII / UNICODE.

Modified command  (Измененная команда) - ищет команду, которая отличается от команды в резервной копии.

Trace hit  (Пошаговая трассировка) - ищет следующий непрерывный блок команд, который отмечен как пройденный в пошаговой трассировке.

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

All intermodular calls  (Все межмодульные вызовы) - ищет все команды, которые вызывают (прямо или косвенно, даже через несколько промежуточных переходов) функции, постоянно находящиеся в других модулях. Особенно полезно для поиска вызовов к функциям API, загружаемым GetProcAddress  ().

All commands  (Все команды) - позволяет находить все команды, которые соответствуют указанному образцу на языке ассемблер.

All sequences  (Все последовательности) - позволяет находить все последовательности команд, которые соответствуют указанному образцу.

All constants  (Все константы) - позволяет находить все местоположения указанной константы в секции кода в текущем модуле.

All switches  (Все переключатели) - отображает таблицу, которая содержит все переключатели, распознанные в текущем модуле.

All referenced text strings  (Все упомянутые текстовые строки) - ищет все строки в ASCII и UNICODE, которые упоминаются в секции кода текущего модуля или внедрены в эту секцию.

User-defined label  (Пользовательскую метку) - отображает таблицу всех определяемых пользователем меток в текущем модуле.

User-defined comment  (Пользовательский комментарий) - отображает таблицу всех определяемых пользователем комментариев в текущем модуле.

Last record in run trace  (Последняя запись в трассировке) - ищет последнее упоминание первой выбранной команды в буфере трассировки.

Find references to  (Найти ссылки) - эти команды ищут ссылки к указанному элементу в секции кода в модуле, открытом в панели Дизассемблера. Для получения наилучших результатов, проанализируйте код перед поиском ссылок.  Поддерживаются следующие элементы поиска:

Selected command   (Выбраннаякоманда) (Ctrl+R ),

Selected address   (Выбранный адрес) (Ctrl+R ) - первый выбранный адрес;

Selected block  (Выбранный блок) - выбранный диапазон;

Immediate constant  (Непосредственная константа) - непосредственная константа, которая является частью первой выбранной команды;

Address constant  (Адресная константа) - адресная константа в первой выбранной команде;

Call destination  (Расположение вызова) - расположение вызова (CALL) первой выбранной команды;

Jump destination  (Адрес перехода) - переходит по адресу первой выбранной команды;

Call constant  (Константа вызова),

Jump constant  (Константа перехода) - постоянная часть местоположения адреса в первой выбранной команде.

Stop till return  (Остановиться до возвращения) (Esc ) - останавливает выполнение до возврата.

Stop tracing   (Остановить трассировку) ( Esc ) -  останавливает трассировку.

Stop animation  (Остановить анимацию) ( Esc ) -  останавливает анимацию.

View  (Просмотреть):

Source file  (Исходный файл)  (Ctrl+F5) -  открывает окно и отображает исходный код, соответствующий первой выбранной команде. В настоящее время эта опция доступна, только если исполняемый файл содержит информацию об отладке в формате Borland.

Original comments  (Оригинальные комментарии) - отображает комментарии в четвертом столбце панели Дизассемблера. Если включена панель Дизассемблера, нажмите панель Комментарии, чтобы переключаться между комментариями, исходником и профилем.

Source as comments  (Исходник как комментарии) - отображает строки исходного текста в четвертом столбце панели Дизассемблер (обычно показывающем комментарии). Если включена панель Дизассемблера, нажмите панель Комментарии, чтобы переключаться между комментариями, исходником и профилем. Эта опция доступна, только если исполняемый файл содержит информацию об отладке в формате Борланда.

Profile as comments  (Профиль как комментарии) - отображает количество раз которые каждая команда появлялась в буфере трассировки. Если включена панель Дизассемблера, нажмите панель Комментарии, чтобы переключаться между комментариями, исходником и профилем. Эта опция доступна только, когда данные профиля открыты.

Executable file  (Исполняемый файл) - отображает дамп исполняемого файла по смещению, которое соответствует первой выбранной команде. Если выбранный участок не принадлежит файлу, дамп устанавливается в смещение 0.

Absolute address   (Абсолютный адрес) - отображает абсолютные адреса в первом столбце.

Relative address  (Относительный адрес) - отображает относительные адреса к выбранному в настоящее время адресу. Альтернатива, двойной клик по базовому адресу в первом столбце.

Module 'xxx'   (Модуль 'xxx') - отображает выполнимый код выбранного модуля.

Copy to executable  (Копировать в исполняемый файл)

Selection  (Выделенное) - копирует выделенное в исполняемый файл. OllyDbg корректирует адресные привязки и предупреждает Вас, если эта операция может создать ошибки.

All modifications  (Все изменения) - копирует все выделенные изменения (то есть различия между фактическим кодом и общей резервной копией) в исполняемый файл.

Analysis  (Анализировать)

Analyze code  (Анализировать код) (Ctrl+A ) - анализирует секцию кода в модуле, открытом в панели Дизассемблера. Другие части OllyDbg работают более надежней, если доступны данные анализа.

Remove analysis  (Удалить анализ) - удаляет данные анализа в текущем модуле.

Scan object files  (Сканировать объектные файлы) (Ctrl+O ) - позволяет Вам выбрать объектные файлы или библиотеки и расположить их позиции в секции кода в модуле, открытом в Дизассемблере.

Remove object scan  (Удалить объектное сканирование) - удаляет результаты сканирования объекта.

Assume arguments  (Применить параметры) - позволяет обрабатывать первую выбранную команду как точку входа в функцию с определенными параметрами. В настоящее время доступны типы функций:

WinProc(hWnd,msg,wParam,lParam)  - функция Windows, которая вызывает сообщения

WinMain(hInst,hPrevInst,CmdLine,ShowState)  - точка входа в программу

DllEntryPoint(hInst,CallReason,pReserved)  - точка входа в DLL

Format(format,...)  - функция схожая с printf

Sformat(ptr,format,...) -  функция схожая с sprintf

StdFunc0(void)  - функция без параметров

StdFunc1(int)  - функция с одним параметром

.....

StdFunc8(int,int,int,int,int,int,int,int)  - функция с 8-ю параметрами

Remove analysis from selection  (Удалить анализ из выделенного фрагмента) (BkSpc ) - удаляет анализ из выбранного блока. Полезно, если Анализатор интерпретировал код как данные.

During next analysis, treat selection as  (В процессе следующего анализа, обрабатывать выделенное как) - устанавливает подсказки расшифровки.

Help on symbolic name  (Справка о символическом названии) - если первая выбранная строка содержит символическое название, и справочный файл справка по API приложен к OllyDbg, пытается открыть раздел справки о символическом названии.

Appearance  (Оформление) - смотри детальное описание здесь.


Окно регистров

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

После EFL- следуют суффиксы условных команд, которые удовлетворяют текущим флагам. Если, например, Вы видите:

  EFL 00000A86 (O,  NB ,  NE , A, S,  PE ,  GE , G),

Это означает, что будут приняты JO и JNE, принимая во внимание, что JB и JPO нет.

Таким же образом, после FST– следует расшифровка FPU флагов C0, C2 и C3, как будто последняя операция FPU была сравнение.

Когда отлаживаемое приложение делает паузу, OllyDbg выделяет все различия, начиная с предыдущей остановки. Если Вы изменяете любой элемент, OllyDbg также выделяет все измененные элементы в окне Регистры.

Для переключения значения какого-либо флага, сделайте двойной клик по нему, или выделите его и нажмите возврат (return). Двойной клик на регистре вызывает диалоговое окно, где Вы можете изменять его содержимое. Чтобы изменить целочисленный регистр или регистр FPU, напечатайте новое содержимое. Клавиши Плюс (+) и Минус (-)  увеличение или уменьшение выбранного целочисленного регистра.

Вы можете выбирать любую плавающую запятую, MMX или 3DNow! расшифровывая FPU регистры. Если окно содержит панель, то нажатие на неё переключает между этими тремя форматами. Вы можете также позволить OllyDbg изменять это отображение, автоматически, основываясь на типе команды, где произошло последнее прерывание. Альтернативно, окно регистра может отображать, регистры отладки DR0.. DR3, DR6 и DR7. Однако Вы не сможете изменять их.

Если Вы делаете отладку кода SSE, активируйте опцию «Decode SSE registers» («Расшифровывать SSE регистры») для просмотра 128-битных SSE регистров. Заметьте, что эта опция замедляет выполнение и иногда опасна (особенно, когда приложение использует много потоков), не используйте ее, если в этом нет крайней  необходимости.

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

Вы можете отобразить последнюю ошибку, обнаруженную в потоке (как возврат вызова функции API GetLastError ). Эта функция управляется опцией «Show last error» («Показывать последнюю ошибку»). Если эта опция активирована, последняя совершённая ошибка сохраняется в журнале прямой трассировки, но может значительно (до 20 %) замедлять скорость просмотра.

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


Команды

Use short form of string commands  (Использовать короткую форму команд в строках)

Эта опция переключает отображение между короткой формой управляющих команд в строках (MOVSD, REP STOSB) и длинной формой (MOVS DWORD PTR ES: [EDI], DWORD PTR DS: [ESI], REP STOS DWORD PTR ES: [EDI]).

Use  RET instead of  RETN (Использовать RET вместо RETN)

80x86 процессоры различают ближние (RETN) и дальние (RETF) возвраты. В большинстве случаев, приложения Win32 используют ближнюю форму. Включение этой опции будет отображать мнемонику, как RET вместо RETN.

Specify sizeof 16-byte SSE operandsas:  (Определять размер 16-байтовых SSE операндов как)

DQWORD (Double Quadword)

XMMWORD (eXtended MMX operand)

Здесь Вы можете определить, как отладчик должен расшифровывать размер 128-битных SSE операндов в командах ассемблера.

Decode size-sensitive 16/32-bit mnemonicslike:  (Расшифровывать чувствительную к размеру 16/32-битную мнемонику, как)

    PUSHA/PUSHAD

   PUSHAW/PUSHAD

   PUSHAW/PUSHA

80x86 набор команд включает несколько команд, мнемоника которых зависит от размера адресуемых данных. Здесь Вы можете выбрать, каким образом Дизассемблер должен расшифровывать такие команды.

Decode top of stack as:  (Расшифровывать вершину стека как)

ST( 0)

ST

Обе расшифровки имеют идентичное значение в командах Ассемблера. Вы можете выбрать форму, которая вам больше нравится.


Исключения

Ignore memory access violations in KERNEL32

(Игнорировать нарушения доступа к памяти в KERNEL32)

Windows API включает несколько функций (IsBadReadPtr ,  IsBadStringPtr  и т.д.), которые проверяют, имеет ли процесс доступ к указанному диапазону памяти. Эти функции постоянно находятся в модуле Kernel32.dll. Внутри него они просто пробуют обратиться к памяти и возвращают сообщение об ошибке, если CPU сообщает о нарушении доступа к памяти. Если Вы запустите программу под OllyDbg, и эта опция выключена, сообщения о нарушениях доступа будут сообщаться отладчику. Вы можете принимать их, нажимая Shift+F9 . Если опция включена, любое нарушение доступа к памяти в пределах Kernel32.dll будет немедленно переходить в структурировваный обработчик исключений (standard error handler, SEH).

Ignore (pass to program) following exceptions:

(Игнорировать (передать программе) следующие исключения)

INT3 breaks                                                   (INT3 брейкпоинты)

Single-step break                                         (Одношаговые брейкпоинты)

Memory access violation                            (Нарушение доступа к памяти)

Integer division by 0                                    (Деление на 0)

Invalid  or  privileged  instruction               (Недопустимая или привилегированная команда)

All  FPU  exceptions                                     (Все исключения FPU)

Если происходит одно из перечисленных выше исключений, и соответствующая опция включена, OllyDbg передает это исключение в обработчик исключений, установленный отлаживаемой программой. (В качестве альтернативы можно использовать «сдвинутую» («shifted») команду выполнения, подобно Shift+F7  или Shift+F9, чтобы передавать исключения в обработчик исключений).

Ignore also following custom exceptions or ranges:

(Игнорировать также следующие исключения или диапазоны)

 Здесь Вы можете определить пользовательские исключения или диапазоны исключений, которые нужно передавать в обработчик исключений. Если Вы хотите проигнорировать последнее обнаруженное исключение, нажмите Add last exception (Добавить последнее исключение)


Каталоги

UDD path

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

Backup old .udd files  (Резервировать старые .udd файлы)

Включает создание резервной копии старых .udd файлов.

Plugin path  (Путь для плагинов)

Каталог, где находятсяплагины.


Изменения

Окно Изменения (Patches) (клавиша Ctrl+P ) показывает список изменений, сделанных в файле. В этом окне Вы можете просмотреть, применить или удалить все произведённые изменения.

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

Поиск изменений может занять много времени, поэтому окно Изменения не обновляется, если Вы измените код. Чтобы обновить список изменений, выберите Actualize  (Обновить) из контекстного меню, или нажмите кнопку Patches  (Изменения) в панели инструментов.


Защита

  When loading module-related information:  (При загрузке связанной с модулем информации)

 Ignore path and extention  (Игнорировать путь и расширения)

OllyDbg сохраняет определяемые пользователем данные, метки, комментарии и брейкпоинты в .udd файле. Обычно этот файл имеет название главного модуля и постоянно находится в каталоге OllyDbg. Однако, совершенно обычное дело, когда главный исполняемый файл и какой-либо DLL имеют одинаковое название, или имеют несколько одинаковых названий DLL в различных каталогах. Для предотвращения конфликтов, OllyDbg 1.09 добавляет суффиксы _1, _2 и т.д. в названия файлов. Отрицательный побочный эффект этого процесса - в том, что, если Вы переместите отлаживаемое приложение в другую папку, Вы не сможете использовать старые метки и брейкпоинты. Опция «Ignore path and extention » отключает суффиксы в названиях и игнорирует путь и расширения в .udd файлах при проверке корректности данных.

Ignore timestamp  (Игнорировать метку времени)

Ignore CRC of code section  (Игнорировать контрольную сумму секции кода)

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

Save user data outside any module to main .udd file  (Сохранять пользовательские данные вне любого модуля в главный .udd файл)

.UDD файлы связаны с главным модулем. Если Вы назначаете метку или комментарий, или устанавливаете брейкпоинт на адресе вне какого-либо модуля, по умолчанию OllyDbg удаляет эту информацию при завершении сеанса отладки. Если Вы активизируете эту опцию, OllyDbg сохранит эти данные в .udd файл главного (.exe) модуля. Однако обратите внимание, Windows не гарантирует, что память будет распределена в те же самые адреса, когда Вы запустите приложение.

Allow stepping into unknown commands  (Разрешить прохождение неизвестных команд)

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

Allow code injection to get address of WinProc  (Разрешить вставку кода для получения адреса WinProc)

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

Warn when breakpoint is outside the code section  (Предупреждать, когда брейкпоинт устанавливается вне раздела кода)

Обычный брейкпоинт - ни что иное, как 1-байтовая INT3 команда. Когда процессор выполняет эту команду, он генерирует исключение, на котором OllyDbg прерывается. Это означает, что INT3 брейкпоинт не может быть установлен на данных. Когда эта опция включена, OllyDbg предупреждает Вас, если Вы пытаетесь установить брейкпоинт вне секции кода загруженных модулей. Если Вы делаете отладку SFX файла, код инициализации в большинстве случаев находится в отдельной секции. Чтобы избежать частых сообщений, Вы можете отключить эту опцию.

Warn when terminating active process  (Предупреждать при завершении активного процесса)

Чтобы закончить отлаживаемое приложение, OllyDbg вызывает функцию API TerminateProcess  () , которая  завершает приложение сразу же, не давая ему времени для сохранения данных и очистки. Если это предупреждение раздражает Вас, отключите эту опцию.

Warn if not administrator  (Предупреждать, если не администратор)

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


Значения по умолчанию

Horizontal scroll bar in tables  (Горизонтальная полоса прокрутки в таблицах)

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

Default font  (Заданный по умолчанию шрифт)

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

  OEM fixed font

   Terminal 6

   System fixed font

   Courier (UNICODE)

   Lucida (UNICODE)  (недоступенпод Windows 95)

Последние два шрифта поддерживают расширенный набор символов в формате UNICODE. Заметьте, что эта опция не изменяет шрифт в уже существующих окнах, или в окнах, позиция и оформление которых загружается из .ini файла. Вы можете изменить шрифт в существующем окне, выбрав Appearance -> Font (Оформление -> Шрифт), в контекстном меню окна. Вы также можете настраивать шрифты в опциях шрифтов.

Default color scheme  (Заданная по умолчанию цветовая схема)

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

    Black on white                  (Черный на белом)

   Yellow on blue       (Желтый на синем)

    Marine                            (Морская)

   Mostly black                    (Черная)

Заметьте, что эта установка не изменяет цвета в уже существующих окнах, или в окнах, позиция и оформление которых загружается из .ini файла. Вы можете изменить цвета в существующем окне, выбрав Appearance -> Colors (Оформление -> Цвета) в контекстном меню окна. Также Вы можете настраивать цветовые схемы в опциях Цвета.

Default syntax highlighting  (Заданная по умолчанию подсветка синтаксиса)

Выбор схемы подсветки, которая будет использоваться по умолчанию в окне CPU, трассировки и всех вновь создаваемых окнах дампа, или отключение подсветки синтаксиса. OllyDbg поддерживает до 4 схем подсветки. Заметьте, что выбранная цветовая схема не имеет никакого влияния на цвета подсветки. Некоторые комбинации цвет/подсветка, могут плохо читаться. В этом случае Вы можете отредактировать схему подсветки.


Добавить в Проводник

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

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

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

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

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

OllyDbg может использоваться как текущий отладчик. Это требует регистрации в системном реестре. Выберите отладку Options|Just-in-time, и в появляющемся диалоге нажмите, " MakeOllyDbg just-in-time debugger ". Теперь, когда какое либо приложение допустит ошибку, появится диалоговое окно с предложением отладить это приложение в OllyDbg. Операционная система запустит OllyDbg, который остановится непосредственно в точке, где произошло исключение . Или, если Вы выбрали опцию "Запускаться без подтверждения", OllyDbg запустится, не спрашивая вас. Чтобы восстановить предыдущий текущий отладчик, нажмите соответствующую кнопку в упомянутом диалоге, это - все.

Еще одна возможность состоит в том, чтобы добавить OllyDbg в контекстное меню, связанное с исполняемыми файлами в Проводнике Windows. (Эта идея принадлежит JochenGerster). В главном меню, выберите Options| Add to Explorer, затем нажмите, " Add OllyDbg to menu in Windows Explorer ". Впоследствии Вы можете щелкнуть правой кнопкой мыши на исполняемом файле, или 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, Вам, вероятно, придется иметь права администратора для отладки программы.


Дизассемблер

Дизассемблер распознает все стандартные 80x86, защищенные, FPU, MMX и 3DNow! инструкции (включая Athlon расширения к набору команд MMX). Он не распознает команды ISSI, хотя существуют планы, чтобы включить их поддержку в следующих версиях OllyDbg. Некоторые устаревшие или недокументированные команды, подобно LOADALL, также не включены.

Disassembler корректно расшифровывает 16-битные адреса. Однако, он предполагает, что это 32-битные сегменты (атрибут сегмента USE32). Это верно для PE (Portable Executable) файлов. OllyDbg не поддерживает 16 битные NE .

Если Вы знакомы с MASM или TASM, у Вас не будет никаких проблем с дизассемблированным кодом. Однако, существуют некоторые особенности. Расшифровка следующих команд отличается от стандарта Intel:

AAD (ASCII Корректировка AX Before Division)-

Обобщенная форма этой команды (недесятичные числа) - расшифровывается как AAD imm8

AAM (ASCII Корректировка AX After Multiply)-

Обобщенная форма этой команды (недесятичные числа) - расшифровывается как AAM imm8

SLDT (Store Local Descriptor Table register)-

Операнд всегда декодируется как 16-битный. 32-битная форма этой команды хранит сегментный селектор в 16 битах младшего разряда операнда адресата, оставляя старшие биты неизменными.

SALC (Sign-extend Carry bit to AL, undocumented)-

OllyDbg поддерживает эту недокументированную команду.

PINSRW (Insert Word From Integer Register, дополнение Athlon к MMX)-

В оригинале документации к AMD, форма памяти этой команды использует 16-битный операнд памяти  принимая во внимание, что форма регистра требует 32-битный регистр, но использует только 16 бит младшего разряда. Чтобы облегчить обработку, Дизассемблер расшифровывает регистр как 16-битный. Ассемблер поддерживает обе формы.

CVTPS2PI иCVTTPS2PI (Convert Packed Single-Precision Floating to Packed Doubleword, Convert with Truncation Packed Single-Precision Floating to Packed Doubleword)-

В этих командах, первый операнд - регистр MMX, второй может быть или 128-битным XMM регистром или 64-битным местоположением в памяти. Чтобы облегчить обработку, операнд памяти - расшифровывается, как 128-битный double quadword.

Некоторые команды имеют мнемонику, которые зависят от размера операнда:

Независимая от размера                         Явная 16-битная                                 Явная 32-битная

                  форма                                         форма                                                  форма

  PUSHA                                                       PUSHAW                                                PUSHAD

  POPA                                                         POPAW                                                   POPAD

  LOOP                                                         LOOPW                                                   LOOPD

  LOOPE                                                       LOOPWE                                                LOOPDE

  LOOPNE                                                    LOOPWNE                                              LOOPDNE

  PUSHF                                                       PUSHFW                                                 PUSHFD

  POPF                                                         POPFW                                                    POPFD

  IRET                                                           IRETW                                                     IRETD

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

Расшифровка MMX и 3DNow! Команд возможна всегда, даже если процессор не поддерживает эти команды.


Сочетания клавиш в окне Дизассемблер

OllyDbg учитывает эти горячие клавиши, когда активна панель Дизассемблер в окне CPU:

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

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

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

Ctrl+F1 - если файл справки API выбран, открывает раздел справки, связанный с символическим именем в первой выбранной строке.

F2 - переключить установить брейкпоинт INT3 на первой выбранной команде. Иначе, Вы можете дважды нажать строку во втором столбце.

Shift+F2 –установить брейкпоинт с условием на первой выбранной команде. См. также Ignore memory access violations in Kernel32.

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

Shift+F4 -устанавливает брейкпоинт с регистрацией (брейкпоинт с условием дополнительной регистрации значения некоторого выражения, когда условие выполнено). Для получения подробностей, см. Брейкпоинты.

Ctrl+F5 - открывает исходный файл, который соответствует первой выбранной команде.

Alt+F7 - идет в предыдущей найденной ссылке.

Alt+F8 - идет в следующей найденной ссылке.

Ctrl+A - анализирует секцию кода текущего модуля.

Ctrl+B - запускают бинарный поиск.

Ctrl+C - копирует выделенное в буфер обмена. Копия грубо сохраняет ширину столбцов и усекает невидимые символы. Чтобы исключить некоторый столбец из копии, уменьшите его ширину до минимума.

Ctrl+E - редактирует выделенное в бинарном (или шестнадцатеричном) формате.

Ctrl+F - запускает поиск команды.

Ctrl+G – переходит к адрессу. Вызывает окно, для ввода адреса или выражения, чтобы перейти к нему. Эта команда не изменяет EIP.

Ctrl+J - перечисляет все вызовы и/или переходы к текущему местоположению. Вы должны проанализировать код прежде, чем Вы сможете использовать эту функцию.

Ctrl+K - показывает дерево вызовов, связанное с текущей процедурой. Вы должны проанализировать код прежде, чем Вы сможете использовать эту особенность.

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

Ctrl+N - открывает список названий {имен} (меток) в текущем модуле.

Ctrl+O - обзор файлов объекта. Эта команда отображает диалог просмотра файлов объекта, где Вы можете выбрать файлы объекта или библиотеки и просмотреть их для поиска модулей объекта в пределах фактической секции кода.

Ctrl+R - находит ссылки на выбранную команду. Эта команда просматривает выполнимый код активного модуля и находит все ссылки (константы, переходы или вызовы) к первой выбранной команде. Вы можете использовать клавиши Alt+F7 и Alt+F8, чтобы переходить по ссылкам. Для вашего удобства, команда, которая упоминается, также включена в список ссылок

Ctrl+S - ищет команду. Эта команда отображает диалог Find command, где Вы можете ввести команду в формате Ассемблер и ищет следующий образец этой команды.

Звездочка (*) - перейти к началу координат (содержание EIP активного потока).

Ctrl+Gray Звездочка (*) - установить новую точку входа здесь, устанавливает EIP в настоящее время выбранного потока к адресу первого выбранного байта. Вы можете отменить эту операцию, если Вы перейдете в область окна Регистров и выберете EIP.

Плюс (+) - если трассировка  не активна, переходит к следующему адресу из хронологии команд. Иначе, переходит к следующей записи в  данных отладки.

Ctrl+Plus - переходит в начало предыдущей процедуры.

Минус (-) - если трассировка  не активна, переходит к предыдущему адресу из хронологии команд. Иначе, переходит к следующей записи в  данных отладки.

Ctrl+Minus - переходит в начало следующей процедуры.

Пробел - ассемблирование. Отображает диалог ассемблирования, где Вы можете редактировать фактическую команду или вводить новые команды на языке Ассемблера. Эти команды заменяются фактическим кодом. Альтернативно, дважды нажмите команду, которую Вы собираетесь изменять.

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

Точка с запятой (;) - добавляет комментарий. Отображает диалоговое окно для добавления нового или редактирования существующего комментария, где Вы вводите комментарий (текстовая строка, отображенная в последнем столбце) связанный с первым байтом первой выбранной команды. Обратите внимание, что многие языки Ассемблера используют точку с запятой, чтобы запустить комментарий. Альтернативно, Вы можете дважды нажать дезассемблированную строку в столбце Comments.


Меню окна Дамп

Backup  (Резервное сохранение) - смотри здесь

Undo selection  (Отменить выделение (Alt+Backspace ) - заменяет выбранную часть данных соответствующей частью резервной копии. Доступно только, когда существует резервная копия.

Copy  (Копировать)

To clipboard  (В буфер обмена) (Ctrl+C)  - копирует выбранную часть кода в буфер обмена. Используется  выбранная в настоящее время ширина столбцов. Чтобы исключить столбец из копируемого фрагмента, уменьшите его ширину до минимально возможного (в этом случае оставшаяся часть столбца станет серой). Если текст шире размеров столбца, OllyDbg заменяет последний видимый символ в столбце символом '>'.

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

Select all  (Выделить всё) - выделяет весь код, отображаемый в панели Дизассемблер

Binary  (Бинарные)

Edit  (Редактирование) (Ctrl+E)  - позволяет Вам редактировать выбранную часть кода как ASCII, UNICODE или hexadecimal строки. Все три области редактирования сильно связаны друг с другом, прокручиваются вместе (первый видимый байт - тот же самый во всех 3 окнах) и немедленно отображают изменения, которые Вы сделали в любой области управления. Нажимая клавиши Ctrl+UpArrow  или Ctrl+DownArrow  Вы можете быстро переходить в соответствующее место в различных областях. Максимальная длина отредактированного кода - 256 байт. Неполные символы отображаются как красные знаки вопроса. Если hexadecimal строка содержит нечетное число участков, OllyDbg заполняет их нолями. Когда опция "Keep size" ("Сохранять размер") включена, Вам не разрешается вставлять или удалять символы или переписывать конец выбранного участка кода.

Fill with 00's  (Заполнить 00-ми) - заполняет выбранную часть кода нолями.

Fill with NOP's  (Заполнить NOP-ами)- заполняет выбранную часть кода NOP-ами

Binary copy  (Бинарное копирование) - копирует выбранную часть кода как hexadecimal дамп ASCII в буфер обмена.

Binary paste  (Бинарная вставка) - вставляет дамп hexadecimal из буфера обмена в выделенный участок. OllyDbg сканирует текст в буфере обмена и извлекает hexadecimal цифры (0 .. 9, A.. F, a .. f), игнорируя все остальные символы. Код вне выбранной области остается неизменным. Если последний байт содержит отдельную HEX цифру, то она игнорируется. Например: "part of code" интерпретируется как AFCD, но не как AFCD 0E.

Copy with masked fixups  (Копировать с привязками к адресам по маске) - то же самое что и бинарное копирование, но заменяет все адресные привязки знаками вопроса. Облегчает поиск похожих фрагментов кода. См. также Поиск бинарных строк.

Modify  (Изменить) - позволяет Вам изменять значение первого выбранного элемента (целое число или с плавающей точкой).

Assemble  (Ассемблировать) - позволяет Вам редактировать или записывать поверх существующего кода одну или несколько команд на языке ассемблера. Подробности, см. Ассемблер.

Modify byte  (Изменить байт) - позволяет Вам редактировать содержимое байтовой константы как десятичное число со знаком, либо десятичное или hexadecimal число без знака.

Modify integer  (Изменить целое число) - позволяет Вам редактировать содержимое целочисленной константы как десятичное число со знаком, либо десятичное или hexadecimal число без знака.

Modify float  (Изменить число с плавающей точкой) - позволяет Вам редактировать содержимое выбранной константы с плавающей запятой.

Label ( Метка) (: ) - позволяет Вам назначать определяемую-пользователем меткуна первый выбранный адрес.

Edit label ( Редактировать метку) (: ) - позволяет Вам редактировать или стирать установленную-пользователем метку, назначенную на первый выбранный адрес.

Breakpoint  (Брейкпоинт)

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

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

Remove memory breakpoint  (Удалить брейкпоинт на память) - удаляет установленный брейкпоинт на память.

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

Hardware, on access  (Аппаратный брейкпоинт, на доступ) - устанавливают аппаратный брейкпоинт на блок памяти, начинающийся с первого выбранного байта. Брейкпоинт может охватывать 1, 2 или 4 байта и должен быть выровнен. Программа останавливается каждый раз, когда происходит обращение к выбранному участку памяти. Аппаратные брейкпоинты доступны только под Windows МЕ, NT или 2000. 80x86 процессоры поддерживают до 4 аппаратных брейкпоинтов. Если OllyDbg не может найти свободный слот для аппаратного брейкпоинта, то OllyDbg попросит, чтобы Вы удалили уже существующий брейкпоинт.

Hardware, on write  (Аппаратный брейкпоинт, на запись) - устанавливают аппаратный брейкпоинт на блок памяти, начинающийся с первого выбранного байта. Брейкпоинт может охватывать 1, 2 или 4 байта и должен быть выровнен. Программа останавливается каждый раз, когда происходит запись в выбранный участок памяти. Аппаратные брейкпоинты доступны только под Windows МЕ, NTили 2000. 80x86 процессоры поддерживают до 4 аппаратных брейкпоинтов. Если OllyDbg не может найти свободный слот для аппаратного брейкпоинта, то OllyDbg попросит, чтобы Вы удалили существующий брейкпоинт.

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

Search for  (Искать)

Command  (Команду) (Ctrl+F ) - позволяет Вам искать команду в формате ассемблер. OllyDbg пробует искать во всех возможных кодировках. Например, если Вы ищете MOV EAX, [123456], то OllyDbg будет искать и A1 56341290  и 8B05 56341200 . Вы можете также искать неточные команды, например MOV R32, [CONST] - которая соответствует и MOV EAX, [10000] и MOV ESI, [123456]. Однако этот вид поиска не может находить более сложные формы адресов.

Integer  (Целое число,),

Address  (Адрес) - позволяет Вам искать 16-или 32-разрядные константы в пределах данных. Поиск может быть выровнен, когда OllyDbg проходит по данным как показано в окне (то есть с шагом равным размеру отображаемого элемента), и невыровненный, когда поиск сравнивает каждый байт.

Float  (Число с плавающей точкой) - позволяет Вам искать 32-, 64- или 80-разрядные константы с плавающей запятой в пределах данных. Поиск может быть выровнен, когда OllyDbg проходит данные как они отображаются в окне (то есть с шагом равным размеру отображаемого элемента), и невыровненный, когда поиск сравнивает каждый байт. Вы можете также предоставлять допустимую погрешность поиска 0.1 %. Это особенно полезно, когда Вы ищете дробную константу, например 2/3=0.6666666...

Binary string  (Бинарная строка) (Ctrl+B)  - отображает диалоговое окно, в котором Вы можете ввести образец поиска. Максимальный размер образца поиска - 256 байт. Вы можете исключить некоторые байты или участки из сравнения. Например, если Вы устанавливаете образец поиска 12??? 6 78 , то он будет соответствовать и 12 34 56 78  и 12 00 06 78 , но не 12 34 55 78 . Вы можете также игнорировать регистр символов ASCII.

Modified data  (Измененные данные) - ищет введённый элемент, который отличается от элемента в резервной копии.

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

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

Follow DWORD in Disassembler  (Перейти по DWORD в панель Дизассемблер),

Follow in Disassembler  (Перейти в панель Дизассемблер) - следует по содержимому первого выбранного бинарного слова в панель Дизассемблер.

Follow DWORD in Dump  (Перейти по DWORD в панель Дампа),

Follow in Dump  (Перейти в панель Дампа) - следует по содержимому первого выбранного бинарного слова в панель Дампа CPU.

Find references  (Найти ссылки)(Ctrl+R ) - ищет все ссылки к выбранному диапазону адресов в секции кода в модуле содержащем данные, открытые в панели Дампа. Для наилучших результатов, проанализируйте код перед поиском ссылок.

View executable file  (Просмотреть исполняемый файл) - отображает дамп исполняемого файла в смещении, которое соответствует первому выбранному байту. Если выделенный участок не принадлежит файлу, дамп устанавливается в смещение 0.

Copy to executable  file  (Копировать в исполняемый файл) - копирует выделенный фрагмент в исполняемый файл. OllyDbg корректирует адресные привязки и предупреждает Вас, если эта операция может привести к ошибкам. Будьте осторожны, если Вы копируете части раздела данных, потому что они могут содержать важные инициализации, уже измененные выполняемым кодом.

Save file  (Сохранить файл) - если это дамп файла, записывает его на диск.

Go to expression  (Перейти к выражению),

Go to address  (Перейти к адресу),

Go to offset  (Перейти к смещению) - позволяет позиционировать окно дампа по указанному адресу или значению выражения (или смещению в файле, если это - дамп файла).

Go to  (Перейти к):

Expression  (Выражению) - позиционирует окно дампа на значении указанного выражения.

Previous  (Назад) (Минус ) - переходит к предыдущему выбранному фрагменту в журнале истории Дампа.

Next  (Далее) (Плюс ) - переходит в следующему выбранному фрагменту в журнале истории Дампа.

View image in Disassembler  (Просмотреть изображение в панели Дизассемблера),

View image in CPU Dump  (Просмотреть изображение в панели Дампа CPU) - если Дамп отображает выполняемый (.exe или .dll) файл некоторого загруженного модуля, показывает его изображение в памяти.

Hex

Hex/ASCII (16 байт)  - отображает данные как hexadecimal и ASCII дамп, по 16 байт в строке.

Hex/ASCII (8 байт)  - отображает данные как hexadecimal и ASCII дамп, по 8 байт в строке.

Hex/UNICODE (16 байт)  - отображает данные как hexadecimal и UNICODE дамп, по 16 байт в строке.

Hex/UNICODE (8 байт)  - отображает данные как hexadecimal и UNICODE дамп, по 8 байт в строке.

Text  (Текст)

ASCII (64 символа)  - отображает данные как дамп ASCII, по 64 символа в строке.

ASCII (32 символа)  - отображает данные как дамп ASCII, по 32 символа в строке.

UNICODE (64 символа)  - отображает данные как UNICODE дамп, по 64 символа (128 байт) в строке. Чтобы откорректировать выравнивание данных в 1-байтовых шагах, нажмите Ctrl+UpArrow  или Ctrl+DnArrow .

UNICODE (32 символа)  - отображает данные как UNICODE дамп, по 32 символа (64 байта) в строке.

Short  (Короткие)

Signed decimal  (Десятичные числа со знаком) - отображает данные как 16-битные десятичные числа со знаком (по 8 чисел в строке). Чтобы откорректировать выравнивание данных в 1-байтовых шагах, нажмите Ctrl+UpArrow  или Ctrl+DnArrow .

Unsigned decimal  (Десятичные числа без знака) - отображает данные как 16-битные десятичные числа без знака (по 8 чисел в строке).

Hex   - отображает данные как 16 битные hexadecimal числа (по 8 чисел в строке).

Long  (Длинные)

Signed decimal  (Десятичные числа со знаком) - отображает данные как 32-битные десятичные числа со знаком (по 4 числа в строке). Чтобы откорректировать выравнивание данных в 1-байтовых шагах, нажмите Ctrl+UpArrow  или Ctrl+DnArrow .

Unsigned decimal  (Десятичные числа без знака) - отображает данные как десятичные 32-битные числа без знака (по 4 числа в строке).

Hex  - отображает данные как 32-битные hexadecimal числа (по 4 числа в строке).

Address  (Адрес) - отображает данные как 32-битные адреса и пытается расшифровывать значения адресов. Окно стека также использует эту форму.

Address with ASCII dump  (Адрес с дампом в ASCII) - отображает данные и как 32-битные адреса и как дамп в ASCII и пытается расшифровывать значения адресов.

Address with UNICODE dump  (Адрес с дампом в UNICODE)- отображает данные и как 32-битные адреса и как дамп в формате UNICODE и пытается расшифровывать значения адресов.

Float  (Число с плавающей запятой)

32-bit float  (32-битные числа с плавающей запятой) - отображает данные как 32-битные числа с плавающей запятой (по 4 числа в каждой строке). Если данные - не допустимое число с плавающей запятой, OllyDbg отображает тип данных (NAN, INF) сопровождаемых hexadecimal дампом. Чтобы откорректировать выравнивание данных в 1-байтовых шагах, нажмите Ctrl+UpArrow  или Ctrl+DnArrow .

64-bit double  (64-битные двойные) - отображает данные как 64-битные числа с плавающей запятой (по 2 числа в каждой строке). Если данные - не допустимое число с плавающей запятой, OllyDbg отображает тип данных (NAN, INF) сопровождаемых hexadecimal дампом.

80-bit long double  (80-битные с удвоенной длиной) - отображает данные как 64-битные числа с плавающей запятой (по 2 числа в каждой строке). Если данные - не допустимое число с плавающей запятой, OllyDbg отображает тип данных (NAN, INF, UNORM) сопровождаемых hexadecimal дампом.

Disassemble  (Дизассемблер) - отображает данные как код.

Special  (Специальный)

P E header  (PE заголовок) - отображает данные как прокомментированный COFF заголовок исполняемого файла.

Appearance  (Оформление) - смотри детальное описание здесь.


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

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).


Анализ 1

Procedure recognition:  (Распознавание процедур)

   Strict  (Строгое)

   Heuristical  (Эвристическое)

   Fuzzy  (Нечеткое)

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

Show ARGs and LOCALs in procedures  (Отображать ARG и LOCAL в процедурах)

Если эта опция включена, и Вы анализируете код, OllyDbg будет отображать адреса такие как [SS:EBP+8] и [SS:EBP-8] с распознанными процедурами, в виде [ARG.1] и [LOCAL.2], подсказывая Вам, что первый адрес это первый параметр процедуры, и другой - второе слово локальных данных, помещённых в стек. Однако компиляторы высокой оптимизации и написанные вручную программы могут использовать EBP по-другому. Индексы это десятичные 1-основные числа, как исключения из общих правил OllyDbg. По умолчанию эта опция выключена.

Auto start analysis of main module  (Автоматически запускать анализ при запуске главного модуля)

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

Recognize loops and switches  (Расшифровывать циклы и переключатели)

Включите эту опцию для активизации распознавания переключателей и циклов.

Decode cascaded IFs as switches  (Расшифровывать каскадные IF как переключатели)

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

Decode tricky code sequences  (Расшифровывать хитрые последовательности кода)

В настоящее время OllyDbg распознает одну уловку: когда данная опция включена, то отладчик распознает вызовы (CALL), следующие за ASCII строками, такими как PUSH объединенными с JMP, как в следующей последовательности:

PUSH 0

  CALL @1

  DB 'title',0

@1:      CALL @2

  DB 'message',0

@2:      PUSH 0

  CALL MessageBoxA

которая является стандартным вызовом MessageBox (0," message "," title ",0).  Когда опция отключена, OllyDbg будет пытаться определять строки как отдельные команды. Этот трюк был предоставлен by BlackArt.

Gray commands that fill gaps between procedures  (Закрашивать серым команды, которые заполняют промежутки между процедурами)

Анализатор способен распознать бессмысленные команды, заполняющие промежутки между выровненными процедурами. Если опция активна, они окрашиваются серым в окне Дизассемблера.

Keep analysis between sessions   (Сохранять данные анализа между сеансами отладки)

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


Подсветка кода

Чтобы улучшить удобочитаемость кода, Вы можете подсвечивать различные типы команд и операндов в дизассемблированном коде. В разделе "Highlighting (Подсветка)", в опциях Appearance  (Оформление) Вы можете создавать собственные или редактировать существующие, схемы подсветки.

Подсветка применяется к следующим классам команд:

  FPU/MMX/SSE                                  Все комманды, которые работают с плавающей запятой, MMX или SSE операндами

    Cond  jumps                                   Все условные переходы

   Jumps  (Переходы)                        Все безусловные переходы, включая косвенные

   PUSH/POP                                     Команды PUSH и POP

   Calls   (Вызовы)                             Команды CALL

   Returns  (Возвраты)                       Команды RET и RETnn (обе, близкие и дальние)

   Privileged                         Привилегированые команды, которые допускают исключения на ring 3

  (Привилегированные)

   Bad commands               Неверные комманды

  (Неверные команды)

   Filling  (Заполнение)                   Команды, используемые, для заполнения промежутков между выровненными процедурами

   Modified code                           Код, который отличается от кода в резервной копии

  (Измененный код)

Если установлен флажок "Highlight operands (Подсвечивать операнды)", операнд подсвечивается согласно этой таблицы:

Общие регистры          Целочисленные регистры общего назначения (EAX, EBX...)

FPU / SSE  регистры    С плавающей запятой, MMX, 3DNow! И SSE регистры

Seg / sys  регистры      Сегментные регистры (DS, SS...), отладочные (DR0 ...) и регистры управления (CR0 ...)

Стек памяти                   Память, адресуемая через ESP или EBP

Другая память              Любые другие операнды памяти

Адресные                       Константы на адрес, существующий в памяти

константы

Другие константы         Любые другие константы

Чтобы восстановить параметры по умолчанию для выбранной схемы подсветки, нажмите Restore defaults (Восстановить параметры по умолчанию). Если Вы нажмёте Отмена, OllyDbg отменит все изменения, которые Вы сделали.

Вы можете настраивать подсветку из меню Appearance (Оформление)  на панели Дизассемблер, Дамп CPU или любом автономном окне Дампа.

Заметьте, что схемы подсветки , "Christmas tree" и "Jumps'n'calls" установленные по умолчанию, оптимизированы для цветовой схемы "Черное на белом".


Шрифты

Здесь Вы можете настраивать шрифты, которые OllyDbg использует при прорисовке содержимого окон. Сначала выберите один из 8 доступных шрифтов. Нажмите Rename  (Переименовать), чтобы изменить его внутреннее название (как в меню Оформление). Нажмите Change  (Изменить), чтобы выбрать другой установленный шрифт, его стиль и размер.

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

Чтобы восстановить параметры по умолчанию для выбранного шрифта, нажмите Restore defaults  (Восстановить по умолчания). Если Вы нажмёте Cancel  (Отмена), OllyDbg отменит все внесённые изменения.


Метки

Метка - символическое имя, привязанное к некоторому адресу в линейном адресном пространстве отлаживаемого приложения. OllyDbg воспринимает четыре различных типа меток:

- Экспортируемые . Это - общие символы, доступные другим модулям. Каждый DLL содержит по крайней мере одно экспортируемое имя. OllyDbg добавляет специальное экспортируемое псевдоимя <ModuleEntryPoint>, которое определяет точку входа в модуль, записанную в PE заголовке. Некоторые экспортируемые символы не имеют символических имен, только порядковые числа. OllyDbg расшифровывает их как #ordinal. Если включена соответствующая опция, OllyDbg также добавляет приставку с названием модуля.

- Импортируемые . Большинство модулей используют внешние символы, определяемые в других модулях. Адрес такого символа не известен, пока упомянутый модуль не загружен в память. Для помощи загрузчику при определении внешних символов, исполняемый файл содержит совокупность таблиц импорта. Для каждого встречающегося внешнего символа, эти таблицы содержат имя внешнего модуля, имя символа (или его порядковый номер) и адрес 32-битного слова в модуле, который получает адрес внешнего символа. OllyDbg определяет адреса из таблиц импорта специальными псевдоназваниями <&extmod.extsymbol> (или <&extmod.#extordinal>, если внешний символ определяется только порядковым номером. Амперсанд '&' указывает, что импортируемые названия меток не являются внешними символами непосредственно, а только указывают на эти символы. Угловые скобки '<>' подразумевают, что символ был создан отладчиком. Заметьте, что метки импорта - не уникальны и служат для лучшего понимания кода.

Некоторые компиляторы осуществляют вызов внешней функции как вызов косвенного перехода к адресу внешней функции. OllyDbg расшифровывает этот случай как <jmp.&extmod.extsymbol>.

- Метки, определяемые пользователем . Вы можете присвоить символическое имя любому адресу в распределяемой памяти. Если адрес принадлежит некоторому модулю, OllyDbg сохраняет эту метку в пользовательский файл данных, когда модуль выгружается и автоматически загружает в следующий раз, когда модуль загружается (даже если он загружается различными программами). Пользовательские метки не проверяются на уникальность и могут содержать любые символы. Среди всех меток они имеют самый высокий приоритет. Чтобы сразу увидеть все метки, установленные пользователем в секции кода в текущем модуле, выберите «Search for -> User-defined label» («Искать -> Определяемые пользователем метки») в окне Дизассемблера. Все команды, содержащие ваши метки, появятся в окне Reference(Ссылки), и Вы можете легко просматривать весь список, нажимая Alt+F7  и Alt+F8 .

- Метки, извлеченные из объектных файлов  или библиотек Сканером объектов, или извлеченный из отладочной информации , созданной компилятором. Эти названия помечаются как «Library» («Библиотека») в списке названий. В этой версии OllyDbg не может гарантировать, что названия, извлеченные Сканером объектов - правильные на 100 %. Метки Библиотек имеют самый низкий приоритет.


Горячие клавиши
Глобальные сочетания клавиш

Эти сочетания клавиш OllyDbg, зависят от активного в данный момент окна:

Ctrl+F2  - рестарт программы, начинает заново отлаживаемую программу. Если нет никакой активной в данный момент программы, OllyDbg перезапускает первую программу в списке истории. Рестарт Программы удаляет аппаратные брэйкпоинты и брэйкпоинты на память.

Alt+F2  - закрыть, закрывает отлаживаемую программу. Если программа все еще активна, Вас попросят подтвердить действие.

F3  - открыть, открывает диалоговое окно, где Вы можете выбрать 32-bit .EXE файл и произвольно определить параметры.

Alt+F5  - делает OllyDbg поверх всех окон. Если отлаживаемая программа остановилась на брэйкпоинте когда отображается окно со свойствами «поверх всех» (обычно некоторое модальное или диалоговое сообщение), это окно может закрывать части OllyDbg, и Вы не сможете переместить или свернуть его без продолжения. Активизируйте OllyDbg (например, из панели задач) и нажмите Alt+F5. OllyDbg получит режим поверх всех окон и будет занимать место поверх отлаживаемого приложения. Если Вы нажмете Alt+F5 второй раз, OllyDbg становится нормальным окном. Состояние поверх всех окон  сохраняется между сеансами отладки. Фактическое состояние OllyDbg отображается в строке состояния.

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

Shift+F7  - тот же самое, что и F7, но если отлаживаемая программа остановилась на некотором исключении, Отладчик, сначала будет пробовать передать исключение в обработчик, указанный в отлаживаемой программе (см., такжеИгнорирование нарушения доступа к памяти в Kernel 32).

Ctrl+F7  - анимация с входом, выполняет команды пошагово, с входом в вызываемые функции (как будто Вы нажали и держите F7, только быстрее). Анимация останавливается, когда Вы нажмёте другую команду продвижения или продолжения, программа встретит активный брэйкпоинт, или некоторое исключение. Каждый раз, когда в процессе анимации выполняется следующий шаг, OllyDbg изменяет все окна. Чтобы ускорить анимацию, закройте все окна, которые Вы не используете и уменьшите размер оставшихся окон. Чтобы остановить анимацию, нажмите Esc.

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

Shift+F8  - то же самое, что и F8, но если отлаживаемая программа остановилась на некотором исключении, Отладчик, сначала будет пробовать передать исключение в обработчик, указанный в отлаживаемой программе (см., также Игнорирование нарушения доступа к памяти в Kernel32).

Ctrl+F8  - анимация с обходом, выполняет команды пошагово, без вхождения в вызываемые функции (как будто Вы нажали и держите F8, только быстрее). Анимация останавливается, когда Вы выберете другую команду продвижения или продолжения, программа встретит активный брэйкпоинт, или  исключение. Каждый раз, когда выполняется следующий шаг, OllyDbg прорисовывает все окна. Чтобы ускорить анимацию, закройте все окна, которые Вы не используете и уменьшите размер оставшихся окон. Чтобы остановить анимацию, нажмите Esc .

F9  - запускает выполнение программы.

Shift+F9  - тот же самое, что и F9, но если отлаживаемая программа остановилась на некотором исключении, Отладчик, сначала будет пробовать передать исключение в обработчик, указанный в отлаживаемой программе (см., также Игнорирование нарушения доступа к памяти в Kernel32).

Ctrl+F9  - выполнить до возвращения (execute till return), выполняет программу без вхождения в вызываемые функции и обновления окна CPU до следующего возврата. Поскольку программа выполняется постепенно, это может занять некоторое время. Нажмите Esc , чтобы прекратить отладку.

Alt+F9  - выполнить до пользовательского кода, выполняет программу без вхождения в вызываемые функции без обновления окна CPU и останавливается, когда встречает команду, принадлежащую модулю, который не находится постоянно  в системном каталоге. Поскольку программа выполняется постепенно, это может занять некоторое время. Нажмите Esc , чтобы прекратить выполнение.

Ctrl+F11  - трассировкас входом, пошагово выполняет команды, входя  в вызываемые функции и добавляя содержимое регистров, в данные отладки. Прямая отладка не анимирует окно CPU.

F12  - останавливает выполнение программы, приостанавливая все потоки отлаживаемой программы. Не возобновляйте потоки вручную, используйте обычные клавиши продолжения и пункты меню (подобно F9).

Ctrl+F12  - трассировкас обходом, пошагово выполняет команды, не входя  в вызываемые функции и добавляя содержимое регистров, в данные отладки. Прямая отладка не анимирует окно CPU.

Esc  - если анимация или выполнение активны, останавливает анимацию или выполнение. Если окно CPU показывает данные отладки, то отображает фактические данные.

Alt+B  - открывает или восстанавливает окно Breakpoints. Здесь Вы можете редактировать, удалять или переходить к установленным брэйкпоинтам.

Alt+C  - открывает или восстанавливает окно CPU.

Alt+E  - открывает или восстанавливает список Модулей.

Alt+K  - открывает или восстанавливает окно Call stack (Стек Вызовов).

Alt+L  - открывает или восстанавливает окно Log (Журнал).

Alt+M  - открывает или восстанавливает окно Memory (Память).

Alt+O  - открывает диалоговое окно Опций.

Ctrl+P  - открывает окно Patches (Изменения)

Ctrl+T  - открывает диалоговое окно Pause run trace (Условие останова трассировки)

Alt+X  - закрывает OllyDbg.

К большинству окон можно применять следующие команды клавиатуры:

Alt+F3  - закрывает активное окно.

Ctrl+F4  - закрывает активное окно.

F5  - разворачивает активное окно или восстанавливает его.

F6  - активизирует следующее окно.

Shift+F6  - активизирует предыдущее окно.

F10  - открывает контекстное меню, связанное с активным окном или областью окна.

Стрелка влево  - сдвигает содержимое на 1 символ влево

Ctrl+Стрелка влево  - сдвигает содержимое на 1 столбец влево

Стрелка вправо  - сдвигает содержимое на 1 символ вправо

Ctrl+Стрелка вправо  - сдвигает содержимое на 1 столбец вправо


Цвета

Здесь Вы можете настроить цветовые схемы, которые OllyDbg использует для отображения содержимого окон. Сначала выберите одну из 8 доступных цветовых схем. Если Вы хотите изменить её внутреннее название (как в меню Оформление), нажмите Rename  (Переименовать).

Каждая цветовая схема состоит из 8 элементов:

Элемент                                      используемый, чтобы рисовать значение по умолчанию в Черном на белом

Открытый текст                           обычный текст, контекст, поток EIP                                    черный

Подсвеченный текст          подсвеченный текст, переходы,брейкпоинты                  красный индикатор

Недоступный текст                                недоступный текст                                                   полутон

Нормальный фон                                     обычный фон                                                          белый

Выбранный фон                                               выбор                                                           светлосерый

Отдельные строки                                  строки между столбцами                                          полутон

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

Брейкпоинт с условием, установленный брейкпоинт                 сиреневый

Чтобы изменить цвет, выберите элемент, затем нажмите на цвет, который Вы хотите назначить. Повторите это со всеми восемью элементами. OllyDbg автоматически сохраняет новые параметры настройки в файл ollydbg.ini.

Чтобы восстановить параметры по умолчанию для выбранной цветовой схемы, нажмите Restore defaults (Восстановить заданные по умолчанию). Если Вы нажмёте Cancel (Отмена), OllyDbg отменит все произведённые изменения.


Адреса

Demangle symbolic names  (Расшифровывать символические названия)

Объектно-ориентированные языки, например C++, используют методику называемую сжатие (mangling) названия, которая добавляет информацию относительно типов и параметров в символ. Например, функция Mainwp  (HWND  *,  unsigned  int ,  unsigned  int ,  long ) может быть сжата например как @Mainwp$qqsp4HWNDuiuil , которая вряд ли является читаемой формой. Эта опция указывает OllyDbg расшифровывать символические названия, когда они добавляются во внутреннюю таблицу. Включение этой опции никак на влияет на названия, которые уже были обработаны. OllyDbg автоматически распознает сжатые названия в Форматах Microsoft и Borland. Чтобы расшифровать сжатый Microsoft-style, Вам будет необходим dbghelp.dll  (поставляется с дистрибутивом). Заметьте, что расшифрованные названия могут быть (и часто так оно и есть) неоднозначными.

Prepend ordinals to IMPLIB names  (Сопоставлять ординалы с названиями IMPLIB)

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

  Как ординал                                               #123

  Как символ                                                  Symbol

  Символ с добавленным ординалом                 #123_Symbol

Отображать адрес в форме:

    HEX, Symbol

   Symbol, HEX

   Either HEX or Symbol

Если какой-либо адрес в памяти не имеет символического названия, OllyDbg отображает его как 8-разрядное hexadecimal число. Если адрес имеет символическое название (метку), эта опция выбирает одну из 3 возможных форм:

  - 8-разрядное hexadecimal число, сопровождаемое символическим названием

  - Символическое название, сопровождаемое 8-разрядным hexadecimal числом

  - Только символическое название

Show name of local module  (Отображать название локального модуля)

Когда эта опция включена, OllyDbg добавляет имя модуля к символическому адресу, отображаемому в первом столбце дампа или дизассемблированного кода.

Highlight symbolic names  (Выделять символические названия)

Когда эта опция включена, OllyDbg выделяет символические названия (метки), отображаемые в первом столбце дампа или дизассемблированного кода. Это может помочь в понимании кода.

By default, sort contents of Names window by:  (По умолчанию, сортировать содержимое окна "Названия" по)

Address  (Адресу)

Name  (Названию)

Эта опция определяет заданный по умолчанию режим сортировки для окон Names (Названия).


Диалоги

Align dialogs on selection  (Выравнивать диалоговые окна по выделенному)

Когда опция активизирована, OllyDbg выравнивает всплывающие диалоговые окна так, чтобы они не «заслоняли» выделенный фрагмент кода.

Font used in dialogs:  (Шрифт, используемый в диалогах)

   System default  (Системный по умолчанию)

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

   Same as in parent window  (Тот же, что и в родительском окне)

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

   Specified here  (Определенный здесь)

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


Обработка выражений

OllyDbg поддерживает очень сложные выражения. Формальная грамматика выражений описана в конце этого раздела, но честно - Вам это не интересно, не так ли? Так что я начну с примеров:

10  - константа 0x10 (без знака). Все целочисленные константы воспринимаются как шестнадцатеричные, если не сопровождаются десятичной точкой;

10.  - десятичная константа 10. (со знаком);

'A ' - символьная константа 0x41;

EAX   - содержимое регистра EAX, интерпретируется как число без знака;

EAX . - содержимое регистра EAX, интерпретируется как число со знаком;

[123456]  - содержимое двойного слова без знака по адресу 123456. По умолчанию, OllyDbg воспринимает операнды двойного слова;

DWORD PTR [123456]  - то же самое что и выше. Ключевое слово PTR дополнительное;

[SIGNED BYTE 123456]  - содержимое байта со знаком по адресу 123456. OllyDbg разрешает MASM- и IDEAL- схожие выражения памяти;

STRING  [123456]  - строка ASCII законченная нолем, которая начинается по адресу 123456. Квадратные скобки необходимы, потому что Вы отображаете содержимое памяти;

[[123456]] -  двойное слово по адресу, которое сохранено в двойном слове по адресу 123456;

2+3*4 -  сравнение с 14. OllyDbg назначает стандартные приоритеты арифметическим операциям "C";

(2+3) *4 -  сравнение с 20. Круглые скобки используются, для изменения порядка операций;

EAX. < 0.  - 0, если EAX находится в диапазоне 0 .. 0x7FFFFFFF иначе 1. Заметьте, что константа 0 также со знаком. Когда сравнивается выражение со знаком с выражением без знака, OllyDbg всегда конвертирует операнд со знаком в операнд без знака.

EAX < 0 -  всегда 0 (ложно), потому что числа без знака всегда положительны.

MSG == 111 -  истинно, если сообщение - WM_COMMAND. 0x0111 - код для WM_COMMAND. Использование MSG имеет смысл только когда условный или условный с записью брейкпоинт устанавливается на вызове или точке входе к известной функции, которая обрабатывает сообщение.

[ STRING  123456] == "Brown fox" -  истинно, если память, начинающаяся с адреса 0x00123456, содержит строку ASCII "Brown fox", "BROWN FOX JUMPS", "brown fox??? или подобное выражение. Сравнение чувствительно к регистру и ограничено длиной текстовой константы.

EAX == "Brown fox" -  то же самое, EAX обработан как указатель.

UNICODE [EAX] == "Brown fox"  - OllyDbg обрабатывает EAX как указатель на строку UNICODE, конвертирует её в ASCII и сравнивает с текстовой константой.

[ESP+8] == WM_PAINT  - в выражениях, Вы можете использовать сотни символических констант из Windows API.

([BYTE ESI+DWORD DS:[450000+15*(EAX-1)]] & 0F0)!=0 -  абсолютно допустимое выражение.

И теперь формальная грамматика. Каждый элемент в фигурных скобках ({}) может встречаться только однажды, порядок охваченных элементов - не важен:

expression = memterm | memterm  <бинарная операция> memterm

memterm = term | { sigmod sizemod prefix [ } expression ]

term = (expression) | unaryoperation memterm | signedregister | register | fpuregister | segmentregister

 | integerconst | floatingconst | stringconst | parameter | pseudovariable

unaryoperation = ! | ~ | + | -

signedregister = register .

register  = AL| BL | CL ... | AX | BX | CX ... | EAX | EBX | ECX ...

fpuregister  = ST | ST0 | ST1 ...

segment register  = CS | DS | ES | SS | FS | GS

integerconst  = <десятичная константа>. | <шестнадцатеричная константа> | <символьная константа> | <символьная API константа>

floatingconst  = <константа с плавающей точкой>

stringconst  = " <строковая константа>"

sigmod  = SIGNED | UNSIGNED

sizemod  = BYTE | CHAR | WORD | SHORT | DWORD | LONG | QWORD | FLOAT | DOUBLE | FLOAT10 | STRING | UNICODE

prefix  = term:

parameter  = %A | %B                  // Допускается только в Инспекторах

pseudovariable  = MSG        // Код сообщения окна

Эта грамматика не слишком строга, ей свойственна двусмысленность в интерпретации [WORD [EAX]] или подобные выражения. Это двойное слово по адресу, которое сохранено в двух байтах по адресу EAX, или это - слово по адресу, которое будет принято из 4-байтовой памяти, адресованной EAX? OllyDbg пробует добавлять модификаторы к наиболее удаленному адресу, пока это возможно. В нашем случае, [WORD [EAX]] эквивалентно WORD [[EAX]].

По умолчанию, BYTE, WORD и DWORD без знака, в то время как CHAR, SHORT и LONG имеет знак. Все регистры общего назначения без знака. Можно использовать явные модификаторы SIGNED и UNSIGNED (даже с регистрами). В двойных операциях, если один из операндов с плавающей запятой, то другой будет конвертирован в такой же формат, еще один без знака, другой также будет конвертирован в беззнаковый. Типы с плавающей запятой не принимают UNSIGNED. MASM-совместимое ключевое слово PTR после модификатора размера (подобно в BYTEPTR) также позволяется, но не требуется. Названия регистров и модификаторы размера не чувствительны к регистру.

Вы можете использовать следующие C-подобные арифметические операции (приоритет 0 самый высокий):

Приоритет                          Тип                                                 Операции

0                                   Унарный                                 ! ~ + -

1                                   Умножение                             * / %

2                                   Сложение                               + -

3                                   Сдвиг                                    << >>

4                                   Сравнение                              < <= > >=

5                                   Сравнение                              == !=

6                                   Побитный AND                         &

7                                   Побитный XOR                         ^

8                                   Побитный OR                           |

9                                   Логический AND                      &&

10                                 Логический OR                        ||

В вычислениях промежуточные результаты сохраняются или как DWORD, или как FLOAT10. Некоторые комбинации типов терминов и операций не позволяются. Например, QWORD может быть только отображен; STRING и UNICODE позволяют только + и - (как будто они были C указатели) и сравнение равно/не равно со STRING, UNICODE или строковой константой; Вы не можете сдвигать FLOAT и т.д.


Проблемы с локализованными версиями ОС

Я не думаю, что возникнут какие-нибудь проблемы, если Вы запустите OllyDbg не на английской (американской) версии операционной системы Microsoft Windows, однако я не проводил никаких испытаний. OllyDbg использует английский (я надеюсь, понятный) язык. Однако в некоторых случаях, OllyDbg может запрашивать справку OS, про расшифровку идентификаторов языка ресурса и т.д. В результате, иногда Вы можете увидеть сверхъестественное соединение английских и родных слов. Если родные слова непонятны, попробуйте использовать шрифт UNICODE (Courier или Lucida).

Некоторые пользователи сообщали, что OllyDbg не работает на локализованных версиях WindowsXP. Я не могу объяснить, чем вызвано это поведение.


Как работает Анализатор

Предположим, что у Вас есть следующая часть кода:

00440540  55 8B EC 83 C4 F8 DB 45 0C DC 0D B4 05 44 00 83              U......E.....D..

00440550  C4 F8 DD 1C 24 E8 7A 29 01 00 83 C4 08 E8 8A 28              ....$.z).......(

00440560  01 00 89 45 FC 89 45 F8 8B 45 08 83 F8 04 77 28               ...E..E..E....w(

00440570  8A 80 7D 05 44 00 FF 24 85 82 05 44 00 01 02 01               ..}.D..$...D....

00440580  02 01 98 05 44 00 8E 05 44 00 93 05 44 00 8B 45               ....D...D...D..E

00440590  F8 EB 1C 8B 45 FC EB 17 6A 10 68 1A 6D 46 00 68              ....E...j.h.mF.h

004405A0  08 6D 46 00 A1 18 FB 46 00 50 E8 50 4F 01 00 59               .mF....F.P.PO..Y

004405B0  59 5D C3 00 4A D8 12 4D FB 21 09 40 45 72 726F              Y]..J..M.!.@Erro

004405C0  72 21 00 49 6E 76 61 6C 69 64 20 70 61 72 61 6D               r!.Invalidparam

004405D0  65 74 65 72 00                                                                                 eter.

Как это может происходить? Обычный дизассемблер выдаст следующие результаты:

00440540  55                PUSH EBP

00440541  8BEC              MOV EBP,ESP

00440543  83C4 F8           ADD ESP,-8

00440546  DB450C           FILD DWORD PTR [EBP+C]

00440549  DC0D B4054400     FMUL QWORD PTR [4405B4]

0044054F  83C4 F8           ADD ESP,-8

00440552  DD1C24            FSTP QWORD PTR [ESP]

00440555  E8 7A290100       CALL 00452ED4

0044055A  83C4 08           ADD ESP,8

0044055D  E8 8A280100       CALL 00452DEC

00440562  8945 FC           MOV DWORD PTR [EBP-4],EAX

00440565  8945 F8           MOV DWORD PTR [EBP-8],EAX

00440568  8B45 08           MOV EAX,DWORD PTR [EBP+8]

0044056B  83F8 04           CMP EAX,4

0044056E  77 28             JA SHORT 00440598

00440570  8A80 7D054400     MOV AL,BYTE PTR [EAX+44057D]

00440576  FF2485 82054400   JMP DWORD PTR [EAX*4+440582]

0044057D  0102              ADD DWORD PTR [EDX],EAX

0044057F  0102              ADD DWORD PTR [EDX],EAX

00440581  0198 0544008E     ADD DWORD PTR [EAX+8E004405],EBX

00440587  05 44009305       ADD EAX,5930044

0044058C  44                INC ESP

0044058D  008B 45F8EB1C     ADD BYTE PTR [EBX+1CEBF845],CL

00440593  8B45 FC           MOV EAX,DWORD PTR [EBP-4]

00440596  EB 17             JMP SHORT 004405AF

00440598  6A 10             PUSH 10

0044059A  68 1A6D4600       PUSH 4405BC

0044059F  68 086D4600       PUSH 4405C3

004405A4  A1 18FB4600       MOV EAX,DWORD PTR [46FB18]

004405A9  50                PUSH EAX

004405AA  E8 504F0100       CALL 004554FF

004405AF  59                POP ECX

004405B0  59                POP ECX

004405B1  5D                POP EBP

004405B2  C3                RETN

004405B3  004A D8           ADD BYTE PTR [EDX-28],CL

004405B6  124D FB           ADC CL,BYTE PTR [EBP-5]

004405B9  2109              AND DWORD PTR [ECX],ECX

004405BB  40                INC EAX

004405BC  45                INC EBP

004405BD  7272             JB SHORT OT.004600F1

004405BF  6F                OUTS DX,DWORD PTR [EDI]

004405C0  72 21             JB SHORT OT.004600A3

004405C2  0049 6E           ADD BYTE PTR [ECX+6E],CL

004405C5  76 61             JBE SHORT OT.004600E8

004405C7  6C                INS BYTE PTR [EDI],DX

004405C8  696420 70 6172616>IMUL ESP,DWORD PTR [EAX+70],6D617261

004405D0  65:74 65          JE SHORT OT.004600F8

004405D3  72 00             JB SHORT OT.00460095

Хм... Напоминает функцию... По крайней мере, создаются стандартные фреймы стека (PUSH EBP; MOV EBP,ESP) и возвращаются назад. Но что происходит по адресу 0044057D? Эта команда выглядит очень подозрительно. И что получается после возвращения? Какой то текст в ASCII и кое-что ещё... Давайте выполним анализ кода и сканирование объекта. Через минуту этот код выглядит намного лучше:

Dummy    - $ 55              PUSH EBP                     ;

00440541 ¦ . 8BEC            MOV EBP,ESP                  ;

00440543 ¦ . 83C4 F8         ADD ESP,-8                   ;

00440546 ¦ . DB45 0C         FILD [ARG.2]                 ;

00440549 ¦ . DC0D B4054400   FMUL QWORD PTR [4405B4]      ;

0044054F¦ . 83C4 F8         ADD ESP,-8                   ;

00440552 ¦ . DD1C24          FSTP QWORD PTR [ESP]         ;

00440555 ¦ . E8 7A290100     CALL Test._sqrt              ;

0044055A ¦ . 83C4 08         ADD ESP,8                    ;

0044055D ¦ . E8 8A280100     CALL Test.__ftol             ;

00440562 ¦ . 8945 FC         MOV [LOCAL.1],EAX            ;

00440565 ¦ . 8945 F8         MOV [LOCAL.2],EAX            ;

00440568 ¦ . 8B45 08         MOV EAX,[ARG.1]              ;

0044056B ¦ . 83F8 04         CMP EAX,4                    ;

0044056E ¦ . 77 28           JA SHORT Test.00440598       ;

00440570 ¦ . 8A80 7D054400   MOV AL,BYTE PTR [EAX+44057D] ;

00440576 ¦ . FF2485 82054400 JMP DWORD PTR [EAX*4+440582] ;

0044057D ¦ . 01              DB 01                        ;  Index table to switch 00440582

0044057E ¦ . 02              DB 02                        ;

0044057F¦ . 01              DB 01                        ;

00440580 ¦ . 02              DB 02                        ;

00440581 ¦ . 01              DB 01                        ;

00440582 ¦ . 98054400        DD Test.00440598             ;  Switch table used at 00440576

00440586 ¦ . 8E054400        DD Test.0044058E             ;

0044058A ¦ . 93054400        DD Test.00440593             ;

0044058E ¦ > 8B45 F8         MOV EAX,[LOCAL.2]            ;

00440591 ¦ . EB 1C           JMP SHORT Test.004405AF      ;

00440593 ¦ > 8B45 FC         MOV EAX,[LOCAL.1]            ;

00440596 ¦ .EB 17           JMP SHORT Test.004405AF      ;

00440598 ¦ > 6A 10           PUSH 10                      ; - fuStyle = MB_OK|MB_ICONHAND|MB_APPLMODAL

0044059A ¦ . 68 1A6D4600     PUSH Test.004405BC           ; ¦ lpszTitle = "Error!"

0044059F¦ . 68 086D4600     PUSH Test.004405C3           ; ¦ lpszText = "Invalid parameter"

004405A4 ¦ . A1 18FB4600     MOV EAX,DWORD PTR [46FB18]   ; ¦

004405A9 ¦ . 50              PUSH EAX                     ; ¦ hwndOwner

004405AA ¦ . E8 504F0100     CALL Test.MessageBoxA        ; L MessageBoxA

004405AF ¦ > 59              POP ECX                      ;

004405B0 ¦ . 59              POP ECX                      ;

004405B1 ¦ . 5D              POP EBP                      ;

004405B2 L . C3              RETN                         ;

004405B3     00              DB 00                        ;

004405B4   . 4AD8124DFB210940DQ FLOAT 3.141592600000000   ;

004405BC   . 45 72 726F 72 >ASCII "Error!",0             ;

004405C3   . 49 6E 76 61 6C >ASCII "Invalid paramete"     ;

004405D3   . 72 00           ASCII "r",0                  ;

Смотрите! Это действительно законченная процедура. Подозрительные команды по адресу 0044057D в действительности индексные и адресные таблицы переключателей с двумя стадиями! Анализатор также распознал и расшифровал вызов стандартной функции API MessageBox (версия ASCII). Этот вызов отображает модальное сообщение об ошибке „Invalidparameter" с только одной кнопкой "OK".

Байт в 004405B3 используется как заполнение, чтобы выровнять константу с плавающей запятой (знаете, что она значит?) к DWORD границе. Две текстовых строки следуют за плавающей константой. Сканер Объекта также распознал вызовы функций библиотек sqrt, и _ftol (последняя преобразует двойной к длинному (doubletolong)) которые постоянно находятся в различных областях памяти.

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

int  Dummy(inti,int j) {

  int a[2];

  a[0]=a[1]=sqrt(j*3.1415926);

  switch (i) {

    case 0:

    case 2:

    case 4:

      return a[0];

    case 1:

    case 3:

      return a[1];

    default:

      MessageBox(hwmain,"Invalidparameter","Error!",

      MB_OK|MB_ICONSTOP|MB_APPLMODAL);

    break;

  }

}

Заметьте, что MB_ICONSTOP и MB_ICONHAND - синонимы.

# $ + Что нового в версии 1.10

Версия 1.10 является последней. Этот проект закрыт, и я не буду больше поддерживать его. Но не волнуйтесь: скоро выйдет OllyDbg 2.00, заново разработанный «с нуля»!

• Наиболее важные новые особенности:

- Отладка отдельных библиотек (без исполняемого файла);

- Окно SEH цепочек;

- Подсказки анализа, которые помогают Анализатору расшифровывать неоднозначные куски кода;

- Брейкпоинты с записью и условия трассировки поддерживают счетчики проходов, которые указывают OllyDbg остановить выполнение после срабатывания брейкпоинта N раз или после N команд, добавленных в журнал трассировки;

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

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

- Новая опция Безопасности «Сохранять пользовательскую информацию вне модулей в главный .udd файл» позволяет сохранять брейкпоинты и комментарии, которые не принадлежат ни к одному из модулей;

- Прямая трассировка может отображать и записывать в файл измененные флаги;

- Максимальная длина строки аргументов увеличена с 1024 до 4096 символов;

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

• Новые функции плагинов:

- Функция обратного вызова ODBG _ Paused ( int  reason , t _ reg  * registers )  или её расширенная версия ODBG _ Pausedex ( int  reasonex , int  extmode , reg  * registers , DEBUG _ EVENT  * debugevent ) . Вызывается каждый раз, когда отлаживаемое приложение останавливается;

- Функция обратного вызова ODBG _ Plugincmd ( int  reason , t _ reg  * registers , char  * cmd ) . Вызывается, когда приложение останавливается на условном брейкпоинте и этот брейкпоинт содержит команды, передаваемые плагинам;

- Функция Settracecount ( ulong  count )  устанавливает число команд, которые необходимо выполнить перед остановкой трассировки;

- Функция Settracepauseoncommands ( char  * cmdset )  задает набор команд, на которых необходимо сделать остановку;

- Функции Getbreakpointtypecount ( ulong  addr , ulong  * passcount )  и Setbreakpointext ( ulong  addr , ulong  type , char  cmd , ulong  passcount )  поддерживают счетчик проходов в условных брейкпоинтах;

- Функция Listmemory ()  обновляет список блоков памяти.

• Исправленные ошибки:

- Опция меню Регистров «Копировать все регистры в буфер обмена» («Copy all registers to clipboard») теперь копирует и EAX;

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

- Меню «Перейти в окне Дампа» («Follow in Dump») теперь отображает более интуитивные элементы, если один из операндов - неявный указатель на стек (как в PUSH);

- OllyDbg теперь корректно дизассемблирует VxDCall и VxDJump, используемые драйверами Win95. Однако он ассемблирует их в один и тот же код. В почти невероятном случае, если кто-нибудь будет использовать эту псевдокоманду, пользователь должен правильно установить бит 0x00008000, чтобы различать вызов и переход;

- OllyDbg поддерживал ерунду вроде REP STOS FWORD [EDI] и компилировал её в REP STOS DWORD [EDI];

- Окно «Имена» («Names») иногда теряет свое содержимое после загрузки новых модулей;

- Ассемблер поддерживает упрощенную форму IMUL: IMULreg, const (дизассемблируется как IMULreg, reg,const);

- Дизассемблер использует размер адреса вместо размера операнда для определения размера непосредственного смещения (JMPFARssss:oooooooo);

- Табуляторы в исходном тексте комментариев Дизассемблера и информационной панели отображались маленькими квадратиками. Теперь они расширены до 8 пробелов;

- ARPL расшифровывался с 32-битными операндами (корректная расшифровка - ARPLr/m16,r16);

- Теперь OllyDbg должен корректно работать в режиме нескольких мониторов (но у меня нет возможности убедиться в этом);

- 2-байтовый INT 3 (CD 03) обрабатывался некорректно;

- Столбик «Хэндл» («Handle») удален из окна «Потоки» («Threads»). Этот столбик отображал хэндл, присвоенный потоку в OllyDbg. Такие хэндлы не имеют смысла в отлаживаемом приложении;

- Анализ вызывал ошибку на больших модулях из-за переполнения таблицы трассировки переходов;

- Нестандартные модули (с размером, не выровненным на 4096 байт) теряли всю пользовательскую информацию, такую, как брейкпоинты или комментарии;

- При попытке обхода вызова ExitThread() или ExitProcess(), OllyDbg пытался установить брейкпоинтINT3 на следующей команде, которая в некоторых случаях оказывалась данными;

- Запрос сбросить собранные данные прямой трассировки в файл приводил к записи неверных команд;

- OllyDbg не проверял, что папка . udd , указанная в файле .ini действительно существует;

- После двоичного редактирования, Дизассемблер не обновлял выделение, поэтому некоторая команда могла быть частично выделенной;

- OllyDbg вызывал сбой, когда он получал командную строку в форме «a.exe %.622496x» или аналогичной, похожей на строку формата;

- Окна дампа подчеркивали подстройки (fix-ups) вне области дампа памяти;

- Окно шестнадцатеричного редактирования могло вести себя непредсказуемо, когда пользователь переходил от одного представления к другому, и некоторые символы могли быть незавершенными;

- FSAVE/FRSTOR и FLDENV/FSTENV отображали неверный размер операнда при использовании с префиксом 66;

- Анализатор зависал (навсегда или на несколько минут), если функция с недостаточным числом параметров находилась близко от начала блока памяти;

- Косметическое: Диалог «Сохранить файл» («Save file») вызывается с помощью GetOpenFileName() вместо GetSaveFileName();

- ESP не записывается в файл, открытый в Runtrace, даже если установлена соответствующая опция;

- Данную (неправильную) команду MOVQWORD [1234],0 (как и многие другие между адресом в памяти и константой) Ассемблер смело компилировал в код с 8-байтовой непосредственной константой;

- При попытке открыть приложение с аргументами, заключенными в кавычки (a.exe "ab" "cd") второй раз, OllyDbg удалял внешние кавычки (a.exeab" "cd). Это не моя ошибка, честно, это недостаток GetPrivateProfileString () !

Что нового в версии 1.09 c

• Новые особенности:

- При пошаговом прохождении или анимации окно «Дизассемблер» («Disassembler») старается оставить 1 или 2 полностью видимых строк после текущей команды;

- Журнал трассировки сохраняет 16 старших бит регистра флагов;

- Новая быстрая клавиша Ctrl+P открывает окно «Изменения» («Patches»);

- OllyDbg экспортирует две новых функции: int  Attachtoactiveprocess ( int  newprocessid )  и HWND  Createpatchwindow ( void ) ;

• Исправленные ошибки:

- PEXTRW менял два своих операнда (регистр MMX и регистр общего назначения);

- Некоторые сообщения об ошибках перекрывались главным окном, когда оно устанавливалось «поверх всех»;

- OllyDbg распознавал некоторые абсолютно корректные PE файлы как поврежденные из-за неудачного размещения секций;

- LOCK не поддерживался с reg-reg или при отсутствии записи в память;

- Ассемблер сообщал о неверной мнемонике в команде IN, так как сканер смешивал мнемоники с оператором IN;

- Добавлена поддержка нестандартного короткого дополнительного заголовка PE (PEOptionalHeader);

- При остановке на аппаратномбрейкпоинте, OllyDbg не могу обходить некоторые команды, если были включены автоматические аппаратные брейкпоинты;

- Слишком длинный аргументы программ (длиннее 256 байт) приводили к сбою OllyDbg из-за переполнения буфера;

- Команда LEA с 16-битным адресованием распознавалась как «Superfluousprefix», так как она помечалась как не обращающаяся к памяти;

- Модификаторы NEAR/FAR подсвечивались случайными цветами;

- Проблемы с конвертацией японского текста UNICODE в набор байтов (не проверялось, так как я не знаю японского);

- Команды SETZ, SETO... с неиспользуемым Reg полем байта ModRegRM, не равным 0, не распознавались. Теперь OllyDbg предупреждает, если опция «Нестандартные формы команд» («Non-standardcommandforms») не активна;

- OllyDbg ассемблировал и дизассемблировал некорректную команду MOVCS,R16 без каких-либо предупреждений;

- Если бы вы нажали Alt+F2 (или X на панели инструментов), но затем решили не закрывать отлаживаемый процесс, OllyDbg все же удалил бы все данные процесса, делая отладку невозможной;

- Если размер исполняемого кода был меньше размера секции или размер модуля был меньше 1 блока памяти, анализ исчезал при прокрутке кода.

Что нового в версии 1.09 b

• Новые особенности:

- Менеджер изменений является самой важной новой особенностью. OllyDbg сохраняет все изменения, произведенные над отлаживаемым приложением в предыдущих сеансах отладки. Из окна «Изменения» («Patches») вы может быстро применить исправления или восстановить исходный код;

- С помощью одной команды вы можете скопировать в исполняемый файл все изменения, сделанные в модуле;

- Одно дочернее окно может быть установлено «поверх всех». Внимание, для поддержки этой возможности плагины должны передать WM_WINDOWPOSCHANGED в Tablefunction () ;

- Вы можете указать папки, где OllyDbg должен сохранять файлы .udd и искать плагины;

- Если на выделенную команду ссылается переход, OllyDbg может показать путь «переход с команды»;

- На системах NT, окно «Хэндлы» («Handles») отображает список хэндлов, принадлежащих отлаживаемому приложению;

- Если команда, которую вы набрали в диалоге Ассемблера содержит комментарий, он будет автоматически добавлен к этой команде;

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

• Улучшения анализа

- «Искать все межмодульные вызовы» («Searchforallintermodularcalls») включает теперь предсказанные вызовы;

- Опция трассировки регистров во всей процедуре. Предыдущий анализатор предсказывал регистры только внутри линейных частей кода (без переходов наружу);

- Опция, позволяющая Анализатору считать, что неизвестные функции сохраняют регистры EBX, ESI и EDI. Если это не так, содержимое регистров может быть предсказано некорректно, так что используйте эту опцию с осторожностью.

• Исправленные ошибки:

- В дереве вызовов OllyDbg временно забывал вызовы, предсказанные в предыдущем сеансе отладки с трассировкой регистров;

- Иногда OllyDbg создавал новый файл .udd (xxx_1, xxx_2 и т.д.) после каждого сеанса отладки.

Что нового в версии 1.09

• Новые особенности:

- В дополнение к режимам дизассемблирования MASM и IDEAL, версия 1.09 поддерживает также синтаксис HLA (HighLevelAssembly, разработанный РэнделломХайдом [RandallHyde]). HLA общедоступное программное обеспечение, вы можете скачать его вместе с документацией на http :// webster . cs . ucr . edu ;

- Анализатор знает, что вызовы kernel 32. ExitThread ()  и kernel 32. ExitProcess ()  не имеют возврата и интерпретирует их как конец процедуры;

- Если несколько модулей имеют одинаковое 8-байтовое имя, OllyDbg переименовывает их в xxx_1, xxx_2 и т.д.;

- Чтобы избежать смешивания файлов .udd в случаях, когда основное приложение и библиотека имеют одинаковое имя или если приложение использует библиотеки с одинаковыми именами в разных папках, OllyDbg добавляет _1, _2 и т. д. к именам файлов .udd. Эта возможность активна, если опция «Безопасность -> Игнорировать путь и расширение» («Security -> Ignorepathandextention») не отмечена;

- Опция синхронизации CPU с исходником;

- OllyDbg поддерживает относительные пути к исходным файлам в отладочной информации Borland, созданной BCC5.5;

- Движок отладки теперь может производить шаг с вхождением в неизвестные команды вроде SSE2 (новая опция Безопасности);

- Опция блокировки стека (т.е. окно стека не прокручивается при пошаговом прохождении);

- Панель регистров отображает отладочные регистры DR0..3,6,7. Отладочные регистры не сохраняются в журнале трассировки и вы не можете их менять. Вниманию создателям плагинов: размер структуры t_reg изменен!

- Из дампа исполняемого файла вы можете перейти к его образу в памяти в окне Дизассемблера или в панели дампа CPU;

- OllyDbg распознает «действительную» (недокументированную) инструкцию SAL, но, в соответствии с документацией Intel, ассемблирует её в SHL. Обе инструкции имеют одинаковый эффект;

- Новый недокументированный опкод:ICEBP (INT1);

- Поиск адресов и двоичных строк в стеке - теперь официально;

- Опция сохранения ширины столбцов в .ini файл;

- В дополнение к переходам, информационная панель CPU, список известных переходов и соответствующие меню отображают локальные вызовы текущей инструкции;

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

• Исправленные ошибки:

- Если вы закрываете отлаживаемую программу (Alt+F2), OllyDbg теперь корректно закрывает все открытые еюхэндлы. Открытыехэндлы делали перекомпиляцию исполняемого файла невозможной;

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

- OllyDbg корректно присоединяется к активному процессу из Менеджера задач. Внимание: формат записи JIT в реестре изменен (добавлены кавычки к имени файла), так что новая версия не будет распознавать старое описание JIT;

- Короткие (без операндов) формы INS и OUTS теперь распознаются как команды ввода/вывода;

- Исправлена некорректная расшифровка и ассемблирование SSE инструкций MOVHLPS и MOVLPS. Intel сделал это сложнее: MOVHLPS является формой register-register, а MOVLPS - формой register-memory одной и той же команды, и ведут они себя по-разному...

- Иногда OllyDbg рушится на «Выполнить до возврата» («Executetillreturn»). Здесь я забыл проверку на возможный указатель NULL;

- Даже когда главный модуль находится в системной папке, он считается пользовательским;

- И, наконец, несколько косметических улучшений.

Что нового в версии 1.08

OllyDbg 1.08 следующая «устойчивая» версия после 1.06. Я буду считать нечетные версии экспериментальными и размещать их только на моем сайте. (Тем не менее, вы можете свободно скачивать и распространять их). Зарегистрированные пользователи OllyDbg будут получать сообщения только о выходе четных версий.

Полный список изменений, которые я сделал после версии 1.06, слишком велик, чтобы поместить его здесь. Наиболее значимые изменения:

• Новые особенности:

- Поддержка отладочной информации форматах Microsoft, как это реализовано в dbghelp . dll . Включает форматы CodeView, COFF, PDB и SYM и (я надеюсь) все остальные форматы, которые будут добавлены в будущем;

- Стек вызовов, отслеживающий вложенные вызовы, даже если процедуры используют нестандартные прологи и эпилоги;

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

- Состояние кучи распознает все блоки памяти, распределенных в куче. К сожалению, эта опция не доступна на системах NT (NT, 2000, XP?);

- Подсветка кода. Вы можете подсвечивать различные типы команд, таких как FPU/MMX/SSE, условные и безусловные переходы, PUSH и POP, вызовы, возвраты, привилегированные, ошибочные и заполняющие команды. Опциональная подсветка операндов распознает основные, FPU/SSE и сегментные/системные регистры, операнды памяти в стеке (т.е. с обращением через ESP или EBP) и в обычной памяти. Дополнительно, подсветка различает константы, являющиеся правильными адресами памяти, и все остальные константы. Вы можете создавать свои схемы подсветки;

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

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

• Значительно усовершенствованный анализ:

- Увеличена скорость распознавания процедур;

- Распознавание циклов. По определению, это закрытая непрерывная последовательность команд (где последняя команда - переход на первую) с единственной точкой входа и любым числом выходов. Обратите внимание, что точка входа - не обязательно первая команда цикла;

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

- Анализатор распознает возвраты, которые используются как переходы (но только если нет промежуточных PUSH, POP или CALL), перемещение в стек 4- и 8-байтовых чисел с плавающей точкой, наподобие ADDESP,-4; FSTP [DWORDSS:EBP], и процедуры, которые служат как структурированные обработчики исключений (structuredexceptionhandlers; SEH);

- Информация о переходах хранится в файле .udd между сеансами, обеспечивая поддержку мгновенного вывода списка переходов к данному адресу («Переход от команды» («Jumpsfrom»));

- Анализатор автоматически расширяет функции с переменным числом аргументов (многоточие).

• Безопасность:

- OllyDbg пытается восстановить размер секции кода, когда размер и смещение кода в заголовке PE равны 0.

- Доступ к памяти, содержащей активный INT3 брейкпоинт (чтение или запись) и команда CLI считаются подозрительными при трассировке;

- OllyDbg предупреждает пользователя, если он не имеет прав администратора под NT;

- Если psapi.dll или dbghelp.dll, распространяемые с OllyDbg имеют более старые версии, чем те, что находятся в системной папке, то OllyDbg посоветует удалить локальные.

• Редкие или недокументированные команды и псевдонимы:

- AMD-специфические инструкции SYSCALL и  SYSRET;

- Недокументированная инструкция FFREEPSTn;

- Ассемблер понимает псевдомнемоники JNAE, JAE и SAL.

• Выражения:

- Выражения поддерживают несколько тысяч символических констант, таких как WM_PAINT или O_RDONLY;

- Новая арифметическая операция 'IN' в выражениях позволяет легко указывать диапазоны;

- Новая псевдофункция WINTEXT (псевдоним:GetWindowText) в выражениях возвращает текст ASCII окна с указанным хэндлом. Обратите внимание, что этот текст представляется как строковая константа, так что сравнения идет по всей его длине, но без учета регистра;

- Окно «Наблюдатель» («Watch») подсвечивает синтаксические ошибки и выделяет положение ошибки в выражении.

• Другие улучшения:

- Панель стека распознает блоки структурированных обработчиков исключений;

- Когда адрес имеет как символическое имя, так и ординал, предпочтение отдается символическому имени;

- Путь перехода выделяется серым, если условный переход не выполняется;

- Автоматическое пробуждение потока, которые вызывает WaitMessage();

- Профиль всего модуля или всего приложения, опция группировать смежные команды в профиль или считать каждую команду по отдельности;

- Окно «Дамп» («Dump») поддерживает непосредственное копирование изменений в исполняемый файл;

- Окно модулей отображает версии исполняемых файлов;

- Диалоги двоичного поиска имеют журнал из 10 последних использовавшихся строк;

- Окна, открываемые в нескольких копиях (как отдельные Dump или Names) сохраняют последнее выбранное оформление (шрифт, цвета, полосы прокрутки). Дамп памяти и дамп файла имеют различные оформления;

- Выполнение до пользовательского кода (быстрая клавиша:Alt+F9) позволяет вернуться в отлаживаемое приложение из системного кода.DLL считается системным, если он находится в системной папке;

- Возможности остановить программу на системномбрейкпоинте, точке входа модуля или WinMain();

- Возможность уничтожения потока;

- Возможность анализа всех модулей сразу;

- Поддержка выделения кода/данных с помощью Shift+LeftClick.

• Множество исправленных ошибок, среди них:

- Команды SFENCE/LFENCE/MFENCE расшифровывались некорректно;

- Команды FXSAVE/FXRSTOR вызывали сбой основной защиты (generalprotectionfault; GPF) когда OllyDbg пытался расшифровать 512-байтный операнд памяти;

- Ассемблер сообщал об ошибке при попытке ассемблировать SETcc;

- FSTSWAX компилировалось неправильно (с 16-битным префиксом);

- В окне «Ссылки» («References») иногда было невозможно перейти по адресу в Дизассемблер;

- «Шрифт (всё)» / «Цвета (всё)» («Font (all)» / «Colours (all)») не работали в панели дампа CPU;

- OllyDbg иногда блокировался при попытке завершить процесс, который остановился на исключении;

- После Ctrl+G в окне «Отладка» («Debug»), содержимое окна не обновлялось (но соответствующий элемент меню работал правильно);

- Текстовые константы в выражениях некорректно интерпретировали символы '\\', '\n' и т.д.

- Несколько других, не столь важных, ошибок и недостатков.


Меню Оформление

Это меню доступно в большинстве окон OllyDbg. Оно позволяет настраивать оформление отдельных окон или областей окна.

Always on top  (Всегда сверху) - располагает окно OllyDbg поверх всех окон MDI. Только одно окно MDI одновременно может быть объявлено поверх всех. Заметьте, что эта опция работает неправильно с окнами MDI, созданными старыми плагинами.

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

Hide bar  (Скрыть панель) - скрывает отображаемую панель.

Show horizontal scroll  (Показывать горизонтальную прокрутку) - отображает горизонтальную прокрутку, которая позволяет листать окно налево и направо. Альтернатива, можно использовать стрелки влево и вправо.

Hide horizontal scroll  (Скрыть горизонтальную прокрутку) - скрывает горизонтальную прокрутку.

Default columns  (Столбцы по умолчанию) - сбрасывает ширину всех столбцов в таблице, к значению по умолчанию.

Font  (Шрифт),

Font (this),  ( Шрифты (здесь))

Font (all)  (Шрифты (все)) - позволяет изменять шрифт в окне, в области окна или во всех областях окна CPU выбранных в настоящее время. По умолчанию, OllyDbg определяет следующие шрифты:

  OEM fixed font                  - стандартный шрифт

  Terminal                          - компактный, хорошо читаемый шрифт

  System fixed font    - стандартный шрифт

  Courier                            - поддерживает UNICODE

  Lucida                             - поддерживает UNICODE, обычно не доступен под Windows 95/98

Вы можете добавлять ваши собственные шрифты или изменять существующие

Colors,  (Цвета)

Colors (this),  (Цвета здесь)

Colors (all)  (Цвета Все) - позволяет выбирать цветовую схему в окне, в области окна или во всех областях окна CPU выбранных в настоящее время. По умолчанию, OllyDbg поддерживает следующие цветовые схемы:

  Black on white                  - черный шрифт на белом фоне

  Yellow on blue                  - желтый шрифт  на темно-синем фоне

  Marine                                 - различные тона синего

  Mostly black           - белый шрифт на черном фоне

Вы можете создавать ваши собственные цветовые схемы или редактировать существующие.

Highlighting  (Подсветка) - позволяет выбирать или отключать подсветку  дизассемблированного кода. Вы можете создавать ваши собственные схемы подсветки и редактировать существующие. Две существующих схемы, Chrismas  tree  и Jumps ' n ' calls , являются лучшим сочетанием с цветовой схемой Черное на белом .


Анализ 3

Существует много 80x86 команд, которые могут появляться в допустимой программе, выполняющейся под Win32. Обычно Анализатор комментирует такие команды, как потенциально недопустимые и обрабатывает их скорее как двоичные данные, чем как код. Здесь Вы можете выбрать, какие виды потенциально недопустимых команд Вы хотите разрешить. См. также Паузы в процессе трассировке.

Far calls and returns  (Дальние вызовы и возвраты)

Дальние (межсегментные или межпривилегированные или переключающие задачи) вызовы и возвраты обычно не появляются в Win32 программах.

Modifications of segment registers  (Изменения сегментных регистров)

Win32 программы обычно не играют с сегментными регистрами.

Privileged commands  (Привилегированные команды)

Привилегированные команды, например HLT или LGDT, не разрешается использовать в пользовательском коде.

I/O commands  (Команды ввода/вывода)

Windows NT не позволяет приложениям непосредственно обращаться к портам ввода/вывода. Однако некоторые драйверы могут изменять I/O Permission Bit Map, чтобы разрешить такой доступ. В отличие от Windows NT операционные системы Windows 95/98 не настолько строги. Включите эту опцию, если Вы подозреваете, что отлаживаемая программа, может непосредственно обращаться к портам ввода/вывода.

Commands that are equivalent to NOP  (Команды, являющиеся эквивалентами NOP)

Компиляторы обычно не включают фиктивные команды в код. Активируйте эту опцию, чтобы разрешить такие команды как NOP, XCHG EDX,EDX или LEA EAX,[EAX] в коде.

Shifts  out  of  range  1..31  (Сдвиг за пределами диапазона 1..31)

Перед выполнением сдвигов, 80x86-совместимые процессоры добавляют маску счета сдвига 0x1F, эффективно ограничивая диапазон счета до 0..31. Нулевой счет означает NOP и вряд ли будет произведен компилятором.

Superfluous prefixes  (Лишние приставки)

Активируйте эту опцию, если Вы хотите разрешить команды с повторяющимися или противоречивыми приставками (например MOV EAX, ES:FS: [ESI]), или команды с префиксом памяти, который не обращается к памяти (ES: XOR EAX, EAX).

LOCK prefixes  (LOCK префиксы)

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

Unaligned stack operations  (Невыровненные операции стека)

Win32 программы обычно сохраняют DWORD-выровненный стек. Команды подобно INC ESP или ADD ESP,7 обычно редко встречаются в приложениях.

Non-standard command forms  (Нестандартные формы команд)

Некоторые команды, такие как SETZ, не используют Reg часть из ModRegRM адреса байта. Справочники Intel указывают на то, чтобы Reg был установлен в 0, но все существующие процессоры игнорируют Reg при выполнении таких команд. Это может измениться в будущем.

VxD  calls  (Вызовы VxD)

DOS-основанные операционные системы Windows 95 и 98 используют VxD вызовы для связи с виртуальными устройствами. В основном, это вызов INT 20,сопровождаемый двойным словом, содержащим код требуемой службы. Приложения не вызывают VxD непосредственно, они пытаются дизассемблировать файл драйвера, что приводит к созданию непонятного мусора. По умолчанию эта опция включена для Windows 95 и 98.


Анализ 2

Show arguments of known functions  (Показывать параметры известных функций)

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

Guess number of arguments of unknown functions  (Предполагать число параметров неизвестных функций)

Когда Анализатор сталкивается с вызовом неизвестной функции и эта опция включена, он пробует определить число двойных слов, вызывающих процедуру помещения в стек и отмечает их как параметры Arg1, Arg2...  и так далее. Заметьте, что параметры регистра, если таковые вообще имеются, остаются нераспознанными и не включаются в этот счет. Анализатор идет безопасным путём. Например, он не распознает процедуры без параметров или случаи, где POP может восстанавливать регистры перед возвратом вместо сброса параметров. Однако, число распознанных функций обычно очень высокое, что значительно улучшает удобочитаемость кода.

Trace contents of registers:  (Трассировать содержимое регистров)

   Off  (выключено)

   In linear sequences  (в линейных последовательностях)

   In recognized procedures  (в распознанных процедурах)

Эта опция определяет, как Анализатор будет определять содержимое регистров. Если Вы выбираете режим «In linear sequences », Анализатор трассирует содержимое целочисленных регистров в пределах линейных частей кода (то есть без переходов или вызовов направленных к ним). Если Вы выбираете «In recognized procedures », в этом случае Анализатор рекурсивно объединяет предсказания от всех переходов к тому же самому адресу. Последний метод занимает много времени, но дает лучшие результаты, особенно в коде, сгенерированном компилятором оптимизации. OllyDbg использует предсказания, чтобы расшифровать вызовы известных функций и их параметры. Отслеженные параметры отмечаются символом = > см. пример).

Use this tracing option at your own risk:  (Используйте эту опцию трассировки на ваш собственный страх и риск)

   Unknown functions preserve  EBX, ESI and  EDI (Неизвестные функции сохраняют EBX, ESI и EDI)

Большинство функций API сохраняют регистры, упомянутые выше. Анализатор использует этот факт при просмотре регистров. Если функция не находится в списке известных функций, и опция - отключена, трассировщик лишает законной силы EBX, ESI и EDI. Активизируя эту опцию, Вы информируете Анализатор, что все функции следуют стандартным соглашениям регистров. В некоторых случаях (особенно для кода написанного на Ассемблере и оптимизированного вручную) это может привести к недопустимым предсказаниям. Эта опция не оказывает никакого влияния на отладку.