MyTetra Share
Делитесь знаниями!
О, смотри-ка какое хорошее место. Дайте два!
Использование OllyDbg
27.08.2014
08:52
Раздел: Компьютер - Программирование - Ассемблеры - Архитектура Intel

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Дамп

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

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

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

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

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

Модули

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Карта памяти

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Стек вызовов

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

← Содержание ...
 
MyTetra Share v.0.35
Яндекс индекс цитирования