Ollydbg инструкция по применению. "Урок крэкинга с помощью OllyDbg". Главные настройки программы
К ак запустить сеанс отладкиСамый простой путь состоит в том, чтобы запустить OllyDbg, выбрать File -> Open (Файл -> Открыть) и выбрать программу, которую Вы хотите отладить. Если эта программа требует каких-нибудь параметров командной строки, напечатайте их в поле внизу диалогового окна, или выберите одну из строк с параметрами, которые Вы использовали в предыдущих сеансах.
OllyDbg может делать отладку автономных DLL. В этом случае OllyDbg создает и запускает маленькое приложение, которое загружает библиотеку и, по вашему запросу, вызывает экспортируемые функции.
Если Вы хотите перезапустить последнюю отлаживаемую программу, просто нажмите Ctrl+F2 (это горячая клавиша для перезапуска программы), и OllyDbg запустит её с теми же самыми параметрами. Альтернативно, выберите меню File, а затем программу из истории. Вы можете также перетащить исполняемый файл или DLL из Проводника Windows и бросить его значок на OllyDbg.
Конечно, Вы можете определить название отлаживаемой программы и ее параметры в командной строке при запуске OllyDbg. Например, Вы можете создать на рабочем столе ярлык, указывающий OllyDbg, выбрать Свойства, перейти к Ярлыку програмы, и добавить название программы в командную строку. Каждый раз, когда Вы дважды щелкаете этот ярлык, OllyDbg автоматически запустит вашу программу. Обратите внимание, что DLL не поддерживают командную строку.
Вы можете присоединить OllyDbg к запущенному процессу. Выберите File -> Attach (Файл -> Присоединить), и выберите процесс из списка. Заметьте, однако, что после того, как Вы закрываете OllyDbg, этот процесс тоже завершится. Никогда не пробуйте присоединяться к системному процессу, это может закончиться сбоем операционной системы. (Честно говоря, в большинстве случаев OS не позволит Вам присоединяться к чувствительному процессу).
OllyDbg может действовать как отладчик JIT « just - in - time » . Это требует регистрации в системном реестре. Выберите Options -> Just-in-time debugging (Опции -> Отладка «just-in-time»), и в появившемся диалоге выберите «Make OllyDbg just-in-time debugger» (Сделать OllyDbg отладчиком «just-in-time»). Теперь, когда какое-нибудь приложение даст сбой, Вас спросят, хотите ли Вы произвести отладку этого приложения. Тогда операционная система запустит OllyDbg, который остановится непосредственно в точке, где произошёл сбой. Или, если Вы выбрали присоединение без подтверждения, OllyDbg запустится без всяких вопросов. Чтобы восстановить предыдущий отладчик «just-in-time», нажмите соответствующую кнопку в упомянутом диалоге и все.
Также существует другая возможность добавлять OllyDbg в контекстное меню, связанное с исполняемыми файлами в Проводнике Windows . (Эта идея принадлежит JochenGerster). В главном меню OllyDbg выберите «Options|Add to Explorer» (Опции -> Добавить в Проводник), затем нажмите «Add OllyDbg to menu in Windows Explorer» (Добавить OllyDbg в контекстное меню Проводника Windows). Впоследствии Вы можете щелкнуть правой кнопкой мыши на исполняемом файле, или DLL и выбрать OllyDbg из меню. Эта опция создает 4 ключа в системном реестре:
HKEY_CLASSES_ROOT\exefile\shell\Open с OllyDbg
HKEY_CLASSES_ROOT\exefile\shell\Open с OllyDbg\command
HKEY_CLASSES_ROOT\dllfile\shell\Open с OllyDbg
HKEY_CLASSES_ROOT\dllfile\shell\Open с OllyDbg\command
OllyDbg может производить отладку консольных приложений (на основе текста).
OllyDbg не может отлаживать.NET приложений. .NET программы состоят из псевдокода, который Windows интерпретирует или собирает «на лету» в родные "86 команды.
Заметьте, что, если Вы используете Windows NT, 2000 или XP, Вам, вероятно, придется иметь права администратора, чтобы отлаживать программы.
Брейкпоинты (контрольные точки)
OllyDbg поддерживает несколько видов брэйкпоинтов:
- Обычный брейкпоинт , первый байт команды, на которой Вы хотите остановиться, заменяется специальной командой INT3 (Ловушка для отладчика). Вы можете установить этот брейкпоинт, выбрав необходимую команду в панели Дизассемблер и нажав F2 , или из контекстного меню. Когда Вы нажмете F2 второй раз, брейкпоинт будет снят. Заметьте, что программа останавливается перед выполнением команды с установленным брейкпоинтом. Число INT3 брейкпоинтов, которые Вы можете установить, неограничено. Когда Вы закрываете отлаживаемую программу, или Отладчик, OllyDbg автоматически сохраняет брейкпоинты на диск. Никогда не пробуйте устанавливать этот тип брейкпоинта на данные или в середине команды! OllyDbg предупредит Вас, если Вы пытаетесь установить брейкпоинт вне раздела кода. Вы можете выключить это предупреждение в опциях Безопасности. В некоторых случаях Отладчик может вставлять собственные временные INT3 брейкпоинты.
- Условный брейкпоинт (Shift+F2) - обычный INT3 брейкпоинт со связанным условием. Когда Отладчик сталкивается с этим брейкпоинтом, он оценивает условие и если результат отличен от нуля, или условие недопустимо, останавливает отлаживаемую программу. Однако, вероятность переполнения, вызванного неправильным условным брейкпоинтом очень высока (главным образом из-за времени ожидания операционной системы). На PII 450 под Windows NT OllyDbg обрабатывает до 2500 ложных условных брейкпоинтов в секунду. Важный случай условного брейкпоинта - остановка на сообщениях Windows (подобно WM_PAINT). Для этой цели Вы можете использовать псевдопеременную MSG вместе с надлежащей интерпретацией параметров. Если окно активно, смотрите брейкпоинт сообщения, описанный ниже.
- Условный Брейкпоинт с записью (Shift+F4) - условный брейкпоинт с возможностью регистрации значения некоторого выражения или параметров известной функции каждый раз, когда срабатывает брейкпоинт или когда выполняется установленное условие. Например, Вы можете установить брейкпоинт с записью на некоторую оконную процедуру, чтобы регистрировать все вызовы этой процедуры (CALL), или только идентификаторы полученных WM_COMMAND сообщений, или установить его на вызов CreateFile и записать названия файлов, открытых только для чтения и т.д. Брейкпоинт с записью (logging breakpoint) такой же быстрый как и Брейкпоинт с условием (сonditional breakpoint), и конечно намного легче просмотреть несколько сотен сообщений в окне журнала, чем нажимать F9 несколько сотен раз. Таким образом, Вы можете выбрать более подходящую интерпретацию для вашего условия.
Вы можете устанавливать счетчик проходов - счетчик, который уменьшается каждый раз, когда выполняется условие остановки. Если счетчик прохода перед уменьшением не равен нулю, OllyDbg продолжит выполнение. Рассмотрим цикл (loop), который выполняется 100. (десятичное число) раз. Поставим брейкпоинт в середине и установим значение 99. (Десятичное число). OllyDbg прервётся на последней итерации.
В дополнение, условный брейкпоинт с записью (conditional logging breakpoint) позволяет Вам передать одну или несколько команд плагинам. Например, это может быть запрос к плагину командной строки, чтобы изменить содержимое регистра и продолжить.
- Брейкпоинт сообщения - то же самое, что и брейкпоинт с условием записи, за исключением того, что OllyDbg автоматически генерирует условие, позволяющее прерваться на некотором сообщении (подобно WM_PAINT) на точке входа к процедуре окна. Вы можете установить его в окне Windows.
- Трассировочный брейкпоинт (Trace breakpoint) - критический случай INT3 брейкпоинтов устанавливаемых на каждой указанной команде. Если Вы производите пошаговую трассировку (hit trace, брейкпоинт будет удален, а адрес, будет помечен как пройденный, после того, как будет достигнута команда. Если Вы используете обычную трассировку (run trace), OllyDbg добавит запись в журнал трассировки, а брейкпоинт останется активным.
- Брейкпоинт на Память . OllyDbg позволяет установку только одного брейкпоинта на память. Вы выбираете некоторую часть памяти в панелях Дизассемблер или Дамп в окне CPU и используете контекстное меню, чтобы установить брейкпоинт на память. Предыдущий брейкпоинт на память, если он был, будет автоматически удалён. У вас есть две доступные опции: прерваться на доступе к памяти (чтение, запись, или выполнение в памяти) или только на записи. Чтобы установить этот брейкпоинт, OllyDbg изменяет аттрибуты блоков памяти, содержащих выделение. На 80x86-совместимых процессорах память распределена и защищена в блоках по 4096 байт. Если Вы выбираете даже отдельный байт, OllyDbg должен будет защитить целый блок. Это может привести к возникновению множества ложных тревог с огромным переполнением. Используйте этот вид брейкпоинта с осторожностью. Некоторые системные функции (особенно под Windows 95/98) приводят к зависанию отлаживаемой программы вместо генерации события отладки при доступе к защищенной памяти.
- Аппаратный брейкпоинт (доступен только под Windows МЕ, NT, 2000 или XP). 80x86-совместимые процессоры позволяют Вам установить 4 аппаратных брейкпоинта. В отличие от брейкпоинта на память, аппаратные брэйкпоинты не замедляют скорость выполнения, но охватывают только до 4 байт. OllyDbg может использовать аппаратные брейкпоинты вместо INT3 при выполнении или сканировании кода.
- Однократное прерывание на доступе к памяти (Single-shot break on memory access) (доступно только под Windows NT, 2000 и XP). Вы устанавливаете его в окне Память на целом блоке памяти из контекстного меню или, нажимая F2 . Этот брейкпоинт особенно полезен, если Вы хотите поймать вызов или возвращение к некоторому модулю. После того, как выполняется остановка, брейкпоинт удаляется.
- Остановка обычной трассировки (Run trace pause) (Ctrl+T) - установка условий, которые проверяются на каждом шаге процесса трассировки (run trace). Вы можете остановить трассировку (run trace), если EIP входит в некоторый диапазон или покидает другой диапазон, или некоторое условие истинно, или когда команда соответствует одному из указанных образцов, или когда команда является подозрительной, или после того, как прослежено указанное число команд. Обратите внимание, что эта опция может значительно (до 20 замедлять скорость трассировки (run trace) .
OllyDbg может также останавливать выполнение программы на некоторых событиях отладки, подобно загрузке или выгрузке DLL, запуску или уничтожению потока, или когда программа посылает отладочную строку (debugstring).
Дамп
Окно Дампа отображает содержимое памяти или файла. Вы можете выбирать один из нескольких определенных форматов: byte, text, integer, float, address, disassembly or PE Header.
Все окна дампа поддерживают резервное копирование, поиск и функции редактирования. Область окна Дампа окна CPU позволяет Вам определять метки, устанавливать брейкпоинты на памяти, находить ссылкик данным в выполняемом коде и открытом изображении выбранной памяти в исполняемом файле (.exe или.dll). Меню Дампаотображает только относительный набор доступных команд.
Если доступно резервное копирование, нажмите Address/Backup в панели, чтобы переключить режим отображения между резервным копированием и нормальным видом. Другие кнопки на панели позволяют Вам изменять режимы дампа.
Подобно окну Дизассемблер, Дамп сохраняет длинную историю посещенных местоположений памяти. Вы можете передвигаться по истории нажимая кнопки " + " или " - ".
Чтобы листать данные, удерживайте клавишу Ctrl , и нажимайте стрелки Up/Down .
Модули
Окно выполняемых модулей (сочетание клавиш: Alt+E) перечисляет все модули, загруженные в настоящее время отлаживаемым процессом. Это окно также отображает полезную информацию, подобно размеру модуля, адресу входа, версии модуля или пути к исполняемому файлу. Некоторая информация, например десятичный размер модуля, символическое название точки входа и т.д., обычно скрывается системой. Чтобы увидеть эти данные, увеличьте ширину соответствующих столбцов. Контекстное меню поддерживает следующие опции:
Actualize - заново сканирует модули и убирает подсветку из новых модулей. В большинстве случаев, OllyDbg заботится о себе.
View memory (Просмотреть память) - открывает окно Памяти и прокручивает его к первому блоку памяти, принадлежащему отображаемому модулю.
View code in CPU (Просмотр Кода в CPU) - открывает выполняемый код модуля в Дизассемблере.
Follow entry (Перейти ко входу) - следует за точкой входа в модуль в Дизассемблере
Dump data in CPU (Данные Дампа в CPU) - открывает раздел данных модуля в Дампе CPU.
View names (Просмотр названий) (Ctrl+N) - отображает таблицу, содержащую все имена (экспорт, импорт, библиотека, определяемые пользователем) определяемые или используемые в текущем модуле.
Mark as system DLL
(Пометить как системный DLL),
Mark as non-system DLL (Пометить как не-системный DLL) - отмечает выбранный модуль как системный или несистемный. Отмечая модуль как системный Вы исключаете его из Трассировки, значительно ускоряя его выполнение. По умолчанию, системные модули - модули, которые постоянно находятся в системном каталоге (обычно c:\windows\system на Windows 95/98, c:\winnt\system32 в NT/2000/XP).
Update .udd file now
(Обновить.udd файл сейчас) - запишет, все зависимые от данного модуля данные в файл
View executable file (Просмотреть исполняемый файл) - отображает дамп исполняемого файла.
View all resources (Просмотреть все ресурсы) - отображает список всех ресурсов, определенных в модуле вместе с краткой информацией. OllyDbg не поддерживает ресурсы как отдельный объект; все, что Вы можете сделать это сдампить ресурс и отредактировать его в бинарном виде.
View resource strings (Просмотреть строковые ресурсы) - отображает список строковых ресурсов и их идентификаторы.
View run trace profile (Просмотреть профиль трассировки) - вычисляет профиль для этого модуля. См. также Run trace (Прямая трассировка).
Analyze all modules
(Анализировать все модули) - позволяет анализироватьвсе модули сразу. Анализ извлекает полезную информацию из загруженного кода; отладка обычно проходит быстрее и намного надежнее, когда код проанализирован.
Сделав двойной клик на строке, Вы перейдёте к выполняемому в модуле коду в панели Дизассемблера.
Карта памяти
Окно карты Памяти отображает все блоки памяти, используемые отлаживаемой программой. Нет никаких стандартных средств, чтобы выполнить эту задачу, так что может случиться, что OllyDbg объединит несколько частей распределенной памяти в одном большом блоке памяти. Однако в большинстве случаев нет необходимости в точной разрешающей способности. Чтобы получить список блоков памяти, запрашиваемых приложением через вызовы к GlobalAlloc (), LocalAlloc () и т.д., используйте Heap list.
Если блок памяти - секция некоторого выполняемого модуля, OllyDbg сообщит, какой вид данных этот блок содержит: код, данные, ресурсы и т.д.
Есть некоторые различия между Windows 95/98 и Windows NT/2000. Под Windows 95/98, OllyDbg не способен показать названия отображаемых файлов. Также, Windows 95/98 ограничивает разрешённые типы доступа к памяти: на чтение и на запись. Примите во внимание также, что Windows NT/2000 имеют намного более широкую палитру возможностей, включая доступ на выполнение, copy-on-write и флаг защиты. OllyDbg игнорирует атрибут copy-on-write.
Если OllyDbg распознает, что программа распределила новый или перераспределила существующий блок памяти, то OllyDbg выделяет соответствующую запись в окне карты памяти. Чтобы сбросить всю подсветку, выберите Actualize (Обновить) в контекстном меню.
Вы можете вызывать окно Память, нажав Alt+M .
Доступны следующие пункты контекстного меню:
Actualize (Обновить) - обновляет список распределенной памяти и удаляет выделение из новых блоков памяти.
View in Disassembler (Просмотреть в Дизассемблере) - открывает блок памяти в Дизассемблере. Эта опция доступна, только когда блок памяти содержит выполняемый код или самораспаковщик некоторого модуля.
Dump в CPU (Дамп в окне CPU) - отображает содержимое блока памяти в области окна Дампа CPU.
Dump (Дамп) - дамп содержимого блока памяти в отдельном окне. Если тип блока памяти известен, OllyDbg автоматически выбирает формат дампа.
View all resources (Просмотреть все ресурсы) - если блок содержит данные ресурсов, список всех ресурсов и связанные данные. OllyDbg не поддерживает ресурсы как отдельный объект; все, что Вы можете сделать с ресурсами, это сдампить и отредактировать в двоичном формате.
View resource strings (Просмотр ресурсных строк) - если блок содержит данные ресурсов, то Олли перечисляет все строки ресурсов с их идентификаторами.
Search (Поиск) - позволяет Вам просматривать все блоки памяти, начиная с выделенного, до того как будет встречена бинарная строка. Если строка найдена, OllyDbg показывает дамп найденного блока памяти. Карта Памяти и окно дампа совместно используют один и тот же образец поиска, поэтому Вы можете немедленно продолжить поиск до следующего возникновения в появляющемся дампе. Вы можете закрыть окно дампа, нажав Esc.
Set break-on-access (Установить прерывание на доступе) (F2 ; доступно только под Windows NT/2000) - защищает целый блок памяти. После брейкпоинта, OllyDbg останавливает отлаживаемую программу и удаляет брейкпоинт. Этот брейкпоинт особенно полезен, если Вы хотите поймать вызов или возврат к некоторому модулю.
Remove break-on-access (Удалить прерывание на доступе) (F2) - удаляет установленное прерывание-на-доступ из блока памяти.
Set memory breakpoint on access (Установить брейкпоинт на доступ к памяти) - устанавливает брейкпоинт на память на целом блоке памяти. Программа будет прерываться каждый раз при обращении отлаживаемой программы к этому блоку памяти. OllyDbg поддерживает только один брейкпоинт на память. Под Windows 95/98, отлаживаемая программа может зависнуть, когда системные подпрограммы обращаются к блокам памяти, содержащим брейкпоинт. Используйте его в крайнем случае.
Set memory breakpoint on write (Установить брейкпоинт на запись в память) - устанавливает брейкпоинт на целом блоке памяти. Программа будет прерываться каждый раз, когда будет записывать в этот блок памяти. Под Windows 95/98, отлаживаемая программа может зависнуть, когда системные подпрограммы обращаются к блокам памяти, содержащим брейкпоинт. Используйте его в крайнем случае.
Remove SFX memory breakpoint (Удалить SFX брейкпоинт на память) - останавливает поиск на реальной точке входа в запакованную программу (SFX). Этот поиск использует брейкпоинт на память специального типа.
Set access (Установить доступ)
- устанавливает желаемый атрибут защиты памяти на целый блок памяти.
Возможные опции:
No access (нет доступа)
Read only (Только чтение)
Read / write (Чтение/Запись)
Execute (Выполнение)
Execute / read (Выполнение/Чтение)
Full access (Полный доступ)
Копировать в буфер обмена
Целую строку - копирует выбранную запись в буфер обмена как многострочный текст с пояснениями. Чтобы исключить какой-либо столбец из копирования, уменьшите его ширину до минимума (оставшаяся часть столбца станет серой).
Целую таблицу - копирует целую карту памяти в буфер обмена как многострочный текст. Первая строка этого текста содержит заголовок окна («MemoryMap» - «Карта памяти»), вторая строка - заголовки столбцов, все последующие строки - записи данных памяти. Копия сохраняет ширину столбцов. Чтобы исключить какой-либо столбец из копируемого, уменьшите его ширину до минимума (оставшаяся часть столбца станет серой).
Наблюдатели и инспекторы
Окно Наблюдателя содержит несколько выражений. Оно отображает их значения во втором столбце. OllyDbg сохраняет выражения в.udd файл главного модуля, так что они будут доступны при следующем сеансе отладки.
Инспектор - автономное окно, которое может показывать содержание некоторой переменной, 1- или 2-мерного массива или даже выбранные элементы массива структур. Выражение в основном то же самое, как у Наблюдателя, но может включать два параметра: %A и %B. Когда Вы устанавливаете Инспектор, Вы можете определить пределы для этих параметров. OllyDbg тогда просчитывает все возможные комбинации %A и %B в выражение, начинающееся от 0 и до предела (не включая), и отображает результаты в таблице. Предел для %B (число столбцов) не может превышать 16.
Стек вызовов
Окно "Стек вызовов" (клавиша Alt+K) делает попытку отследить последовательность вызовов в стеке выбранного потока и отображает его, вместе с известными или предложенными параметрами вызываемых функций. Эта задача проста, когда вызываемые функции создают стандартные фреймы стека (PUSH EBP; MOV EBP,ESP). Современные оптимизирующие компиляторы не беспокоятся о фреймах стека, поэтому OllyDbg использует различные уловки. Например, OllyDbg пробует прослеживать код к следующему возврату и рассчитывает все push, pop или изменения ESP. Если это не помогает, OllyDbg предпринимает более опасный и отнимающий много времени подход: OllyDbg просматривает стек, пытаясь найти все возможные адреса возврата и проверок, в которых функция вызывалась соответствующим оператором, включая проанализированные команды. Есть также другая, довольно сомнительная эвристика. Просмотр стека может быть действительно медленным. OllyDbg производит его, только если окно "Стек вызовов" открыто.
Окно "Стек вызовов" содержит 5 столбцов: Address, Stack, Procedure, Called from, Frame .
Столбец Address содержит адрес в стеке, Stack отображает значение соответствующего адреса возврата или параметра.
Procedure (или Procedure / arguments) - отображает то место, где окно Стек вызовов располагает в стек адрес вызываемой функции. В некоторых случаях OllyDbg не уверен, является ли этот адрес правильным и добавляет один из следующих маркеров:
Найденная точка входа - не надежна
Maybe OllyDbg не смог найти надежную точка входа, найденный адрес необходимо проверить, используя эвристику
Includes OllyDbg, не смог найти точку входа и только знает, что эта процедура включает отображаемый адрес
Нажимая кнопку на панели или выбирая «Hide/Show arguments» («Скрыть/показать параметры») в меню, Вы можете включать или выключать параметры функций.
Called from это адрес команды, которая вызывается этой процедурой.
Последний столбец, Frame , по умолчанию скрыт и отображает значение указателя фрейма (регистр EBP), если он известен.
Просматривать стек надежнее и значительно быстрее, когда все вызываемые функции проанализированы.
Дерево вызовов
Дерево вызовов (CALL) (клавиша Ctrl+K в Дизассемблере) использует результаты анализа, чтобы подготовить список функций, вызываемых данной процедурой, непосредственно или косвенно, и список всех известных вызовов данной функции. Побочный эффект - распознает, является ли выбранная процедура явно рекурсивной. "Явно" означает, что она не может прослеживать запросы с неизвестным адресом, подобно CALL EAX. Если процедура совершает неизвестные вызовы, "Дерево вызовов" добавляет маркеры " Unknown destination(s)" (Неизвестный адрес(а)).
Некоторые из вызываемых функций комментируются одним из следующих слов:
Leaf Не вызывает никакие другие функции
Pure Не вызывает никаких функций, не имеет никаких побочных эффектов
RETN Состоит из единственной команды RETN
Sys Функция в системном DLL. По определению, системный DLL - DLL, постоянно находящийся в системном каталоге
Чтобы пройтись по "Дереву вызовов", сделайте двойной щелчок по адресу в "Called from" или столбцу "Calls/Calls directly". Окно "Дерево вызовов" сохраняет историю ваших действий (клавиши " - " и " + ").
Если отлаживаемая программа состоит из нескольких модулей, я рекомендую проанализировать все эти модули. "Дерево вызовов" не пытается обрабатывать системные функции.
Самоизвлекающиеся (SFX) файлы
SFX файл состоит из распаковщика и упакованной оригинальной программы. При исследовании запакованных файлов Вы обычно хотите пропустить упаковщик и остановиться на точке входа в программу ("реальный вход"). OllyDbg содержит несколько функций, которые облегчают эту задачу.
Обычно распаковщик загружается в адреса, которые находятся вне раздела первоначальной программы. В этом случае OllyDbg распознает файл как SFX.
Когда SFX опция требует трассировки реального входа, OllyDbg устанавливает брейкпоинт на память на всей секции кода. Обычно он пуст или содержит сжатые данные. Когда программа пытается выполнить некоторую команду в пределах защищенной области, которая не является ни RET, ни JMP, OllyDbg сообщает о реальном входе. Таким образом и работает побайтное извлечение.
Этот метод очень медленный. Есть другой, более быстрый метод. Каждый раз, когда происходит исключение при чтении данных, OllyDbg производит чтение из этого 4K блока памяти, и отключает предыдущее окно чтения. На каждом исключении записи данных (data write exception) он разрешает запись в этот блок и запрещает запись в предыдущий. Когда программа выполняет команды в незащищенной области, OllyDbg сообщает о реальном входе. Однако, если реальный вход - внутри окна чтения или записи, его местоположение будет сообщено неправильно.
Вы можете исправить адрес входа вручную. Выберите новый адрес входа и в контекстном меню окна Дизассемблер выберите Breakpoint-> Set real SFX entry here(Брэйкпоинт->Установить реальный SFXвход здесь). Если соответствующая опция SFX включена, в следующий раз OllyDbg пропустит распаковщик быстро и надежно.
Вы идёте по отлаживаемой программе, нажимая F7 (шаг с вхождением) или F8 (шаг с обходом). Главное различие между этими методами - то, что, если текущая команда выполняет вызов (CALL) некоторой функции, F7 войдёт в функцию и остановится на ее первой команде, в то время как F8 будет сразу пробовать выполнить функцию. Если Вы обходите некоторую функцию, любой брейкпоинт, или случай отладки находящийся в пределах функции, приостановит выполнение основной программы, но временный брейкпоинт после вызова процедуры останется активным, и Вы дойдете до него рано или поздно.
Если отлаживаемая программа останавливается на исключении, Вы можете передать это исключение в обработчик, установленный с отлаженной программой. Просто нажмите Shift вместе с любой командой продвижения.
Вместо нажатия F7 или F8 несколько сотен раз, Вы можете использовать анимацию (Ctrl+F7 или Ctrl+F8). В этом случае, OllyDbg автоматически повторяет F7 или F8 после того, как предыдущий шаг закончен, и все окна модифицированы. Процесс останавливается когда:
- Вы нажимёте Esc или запустите любую другую команду продвижения, или
- OllyDbg встретит установленный ранее брейкпоинт, или
- Отлаживаемая программа произведёт исключение.
Используя Клавиши "+ " и "- " , Вы можете отмотать назад историю выполнения.
Обратите внимание, что OllyDbg прорисовывает большинство окон, каждый раз, когда выполнение приостанавливается. Если анимация, окажется, очень медленной, попробуйте закрыть или, по крайней мере, свернуть все неиспользуемые окна.
Другой, более быстрый путь для обратной трассировки (backtrace) выполнения программы - Run trace. В этом случае OllyDbg создает протокол выполнения и сообщает Вам, когда и сколько раз данная команда была выполнена.
Пошаговая трассировка
Пошаговая трассировка дает Вам возможность отметить, какие части кода были выполнены, а какие нет. Метод, осуществленный в OllyDbg довольно прост. Он устанавливает INT3 брейкпоинт на каждой команде в пределах указанной области. Когда брейкпоинт выполняется, OllyDbg удаляет его и помечает команду как пройденную. Поскольку каждый брейкпоинт трассировки выполняетcя только однажды, этот метод очень быстр.
При использовании пошаговой трассировки, должны быть приняты меры предосторожности, чтобы не установить брейкпоинт на данных, поскольку приложение в этом случае допустит ошибку. По этой причине, Вы должны проанализировать код, чтобы активизировать соответствующие опции меню. Я рекомендую, чтобы Вы выбрали строгое или эвристическое распознавание процедур. Нечеткая опция слишком терпима к ошибкам и часто находит несуществующие процедуры.
Когда Вы устанавливаете брейкпоинт трассировки даже на отдельной команде в пределах модуля, OllyDbg устанавливает буфер трассировки вдвое большего размера по сравнению с разделом кода.
Обратите внимание, что, когда Вы удаляете данные пошаговой трассировки, Вы одновременно удаляете и принудительный запуск трассировки.
Прямая трассировка
Прямая трассировка - способ обратного выполнения программы, который необходим в некоторых случаях. Вы можете также использовать прямую трассировку для простого профилирования. В основном, OllyDbg выполняет отлаживаемую программу пошагово, подобно анимации, но не изменяет окна и - что наиболее важно - сохраняет адреса, содержимое регистров, сообщений и известных операндов в буфере трассировки. Если отлаживаемый код самоизменяющийся, Вы можете сохранить первоначальные команды. Запустите прямую трассировку, нажав Ctrl+F11 (трассировка с входом) или Ctrl+F12 (трассировка с обходом). Остановка трассировки - клавиши F12 или Esc .
Вы можете определить набор условий, которые проверяются на каждом шаге выполнения прямой трассировки (горячая клавиша: Ctrl+T). Прямая трассировка останавливается, когда встречает какое-либо условие. Условия включают:
Конечно, прямая трассировка требует много памяти, в среднем от 16 до 35 байт на команду в зависимости от режима, и выполняется очень медленно. На процессоре 500 MHz под Windows NT этот процесс может трассировать до 5000 команд в секунду. Под Windows 95 медленнее: только 2200 команд в секунду. Но во многих случаях, например, когда в программе есть переходы к несуществующему адресу, это единственный способ найти решение проблемы. Вы можете исключить квазилинейные последовательности команд (с единственным выходом в конце последовательности) из процесса прямой трассировки. Когда OllyDbg сталкивается с исключенной последовательностью, то OllyDbg устанавливает временный брейкпоинт на команде, которая немедленно следует за исключенным блоком и выполняет его сразу. Конечно, любое возвращение или переход к внешнему коду делают правильное рассмотрение невозможным, поэтому OllyDbg проверяет часть кода, которую Вы хотите исключить, и в трудных случаях спрашивает у Вас подтверждение.
В большинстве случаев Вам нет необходимости трассировать системный API код. Опция "Always trace over system DLLs" позволяет Вам трассировать без вхождения в функциональные API при трассировке и анимации с вхождением. OllyDbg предполагает, что модуль системный, если он постоянно находится в системной папке. В окне Modules (Модули) Вы можете отметить любую библиотеку как системную или несистемную.
Чтобы сделать выполнение быстрее, Вы можете ограничить процедуру прямой трассировки выбранными командами или частями кода, устанавливая брейкпоинты на запуск трассировки и запуская программу. Я называю это «forced run trace» (принудительный запуск трассировки). В основном, брейкпоинты на трассировку - это неудаляемые брейкпоинты пошаговой трассировки. Если Вы удаляете пошаговую трассировку, Вы одновременно удаляете и прямую трассировку.
Команды трассировки, упомянутые в начале этого раздела автоматически открывают буфер трассировки. Вы можете определить его размер (до 64 МБ) в Опциях. Этот буфер круговой и, когда он заполняется, переписываются самые старые записи.
Вы можете открыть или очистить буфер прямой трассировки, выбрав «Debug -> Open or clear run trace» (Отладка -> Открыть или очистить буфер трассировки) из главного меню OllyDbg. После того как буфер трассировки открыт, OllyDbg зарегистрирует все паузы в выполнении, даже те, которые не были вызваны прямой трассировкой. Например, Вы можете идти по программе, нажимая F7 или F8 , а затем обратно проходить код, используя клавиши Плюс и Минус. Заметьте, что эти клавиши просматривают историю, когда буфер трассировки закрыт. Если Вы проходите программу с помощью трассировки, Регистры, и Информационные области окна становятся серыми, подчеркивая, что данные регистров, которые они отображают - не фактические. Буфер трассировки не сохраняет вершину стека или содержимое памяти, используемое регистрами. Регистры, Информация и Стек используют фактическое состояние памяти, чтобы интерпретировать регистры из буфера трассировки.
OllyDbg может посчитать, сколько раз каждая команда появляется в буфере прямой трассировки. В окне Дизассемблер выберите «View -> Profile data» (Просмотр -> Профильные данные). Эта команда заменяет столбец Comments (Комментарий) столбцом Profile (Профиль). Или, если отображена панель, щёлкните её несколько раз, пока она не отобразит Profile information. Заметьте, что отображаемый счетчик - динамический и не подсчитывает старые команды, удалённые из буфера трассировки. Вы можете также рассматривать данные профиля для целого модуля, отсортированных несколькими нажатиями, в отдельном окне Profile
Специальная команда в окне Дизассемблера «Runtrace -> Add entries of all procedures» (Прямая трассировка -> Добавить все процедуры), позволяет проверить, насколько часто вызывается каждая распознанная процедура. Другая команда «Runtrace -> Add branches in procedure» (Прямая трассировка -> Добавить ветки в процедуре) принудительно трассирует все распознанные адресаты переходов в пределах процедуры. В этом случае, профиль позволяет находить наиболее часто выполняемые переходы и оптимизировать их для увеличения скорости.
Опция «Search for -> Last record in run trace» (Найти -> Последнюю запись в буфере трассировки) в контекстном меню окна Дизассемблер находит когда была выполнена, и была ли выполнена вообще, отмеченная команда в последний раз.
Окно прямой трассировки отображает содержимое буфера трассировки. Для каждой команды существует определённое содержимое регистров, которые были изменены командой (более точно, изменились между записью в исходнике и обновленной). Если Вы сделаете двойной клик на некоторой команде, всплывающее окно выберет все ссылки на данную команду в буфере трассировки и Вы сможете быстро просмотреть их, нажимая клавиши Плюс или Минус. Если опция «Trace -> Synchronize CPUandRuntrace» (Трассировка -> Синхронизировать окно CPU и окно прямой трассировки) установлена, Дизассемблер перейдёт к окну прямой трассировки.
Заметьте, что, когда Вы удаляете пошаговую трассировку, Вы одновременно удаляете принудительную прямую трассировку.
В основном я всегда для отладки пользовался отладчиком всех времен и народов OllyDbg. Это шикарный деббагер, который очень удобен и прост одновременно обладающий очень мощным функционалом. Но, в последнее время я все больше сталкиваюсь х64 программами, да и домашний компьютер у меня поднят на х64 операционной системе, а OllyDbg версии 1.10 не корректно работает на такой операционной системе, теряет точку входа и вообще печально все. Попытки использовать более новую версию 2.01а тоже не увенчались успехом, так как она виснет в неожиданный момент и перестает отвечать, можно конечно накатить кучу патчей от китайских друзей и более менее оживить дебагер, но все равно огромное количество багов и похоже прекращение разработки(с августа 2011 года никаких подвижек) заставило меня посмотреть в сторону Interactive Disassembler, сокращенно IDA. Это мощнейший инструмент для отладки и исследования программ который обладает кучей нужных и не очень не нужных свистелок и перделок.
Но он тоже обладает некоторыми минусами, которые меня всегда останавливали для изучения сего мощного инструмента:
1.
Мало вменяемой документации, есть конечно книги от уважаемого господина К. Касперски, но они настолько древние, что читать их смысл есть, но в текущих реалиях не шибко большой, в основном для общего развития.
2.
Цена сего продукта у X-Rays - стартовая лицензия более 500 австралийских долларов и это без X-Rays Decompiler, который стоит совсем каких то неадекватных денег.
Но разочарование OllyDbg возобладало над жабой и здравым смыслом и я решил заняться всетаки изучением IDA.
Небольшое отступление - не нада спрашивать меня где скачать на халяву IDA бесплатно и без смс, вернее спросить можно, но я не знаю и отправлю на этот сайт .
Первым делом я поискал информацию об мануалах и был несколько разочарован, информации достаточно мало и она устарела, есть форумы на которых народ обменивается всякими полезностями про IDA, но мне надо было пройти для начала хотя бы курс молодого самца. В этом мне помогло видео руководство от TiGa, взять его можно Потратив почти целые выходные и выпив пол ящика пива я просмотрел все видеоруководства. После чего у меня появилась мысль, а почему бы не попробовать разобраться в IDA при помощи старых добрых статей от Рикардо Наваха под названием "Введение в крекинг с нуля используя OllyDbg", почитать их на русском можно например , может возникнуть вопрос, причем тут OllyDbg и IDA, а потому, что статьи очень подробные и я буду искать похожие элементы в IDA, что даст мне базовые понимания в работе с IDA.
Итак я не буду описывать базовые навыки при работе с ассемблером как в статьях Рикардо Наваха, так как думаю те кто переходят к IDA уже немного понимают что такое стек, регистры, как устроена память и что такое условный и без условный переход, а займемся сразу исследованием программ которые описаны в статьях Рикардо. Я постараюсь пройтись по всем его статьям с разбором crackme которые он упоминает.
Первая статья в которой уже идет разбор crackme, является главой под номером 9 , у меня же она будет первой главой.
Качаем необходимый фаил который будет исследоваться, например с сайта wasm.ru
Запускаем IDA и открываем в нем фаил через File->Open. После чего видим следующую картинку:
Все настройки можно оставить по умолчанию, так как они в принципе в текущий момент ничего мне особа не говорят. Жмем ОК и видим основное окно IDA:
Кружочками с циферками выделены следующие позиции:
1. Информация об базе, точке входа, размере секции кода виртуальной и реальной и прочая полезная информация про секцию.
2. Функции которые обнаружены в программе, розовым обозначены функции которые импортируются из внешних библиотек. start - чаще всего это функция которая идет в точке входа, к стати посмотреть варианты Entery Point можно нажав хоткей CTRL+E.
3. Собственно сам ассемблерный код текущей открытой функции, если не хочется смотреть в графическом режиме то можно переключить в текстовой сплошной простыней по пробелу, обратно в графический переключается пкм на листинге Graph view.
4. Миникарта функций со всеми переходами и прочим, очень полезна для ориентации в коде.
Для того чтобы можно было запускать приложение в отладчике, необходимо выбрать сам отладчик, так как листинг кода это еще не отладка.
Нажимаем F9
или выбираем в верху опцию Debugger
- появиться окно под названием Select a debugger
в котором выбираем Local Win32 debugger
для начала нам хватит этого дебагера, а с остальными будем разбираться позже.
Нажимаем еще раз F9 и программа запускается, не остановишись на Entery Point как в OllyDbg. Это можно исправить, если есть желание постоянно останавливаться в самом начале, идем опять же в закладку Debugger и там выбираем Debugger Options в открывшимся окне можно установить галочку на Stop on process entry point и получим реакцию такуюже как в OllyDbg, при старте отладки останавливаемся на точке входа. Но так же можно сразу установить руками брякпоинт если необходимо посмотрев в ASM листинг и остановиться там.
Теперь рассмотрим окно дебаггера:
Стрелочками показаны основные элементы интерфейса, они не шибко сильно отличаются от тогоже OllyDbg, хотя и есть некоторые дополнения, например отображение не в виде листинга, а в графическом виде, не забываем, что всегда можем переключиться в листинг из графического режима по пробелу и чаще всего также обратно. Есть панель с логом и карта графического отображения.
Что нам здесь еще понадобиться, основные инструменты показаны на следующей картинке:
Disassembly - собственно вызывает окно с дизассемблированной программой.
Hex Dump - открывает окно с дампом.
Pseudocode - эта функция пытается преобразовать ASM код в жалкое подобие C.
Exports - что программа или библиотека экспортирует.
Imports - что программа или библиотека импортирует.
Names - список APIшных имен найденых в данном экзешнике.
Functions - список функций обнаруженных в программе.
Strings - текстовые строки обнаруженные в программе.
Segments - сегменты которые обнаружены в памяти.
Для начала хватит, так как назначение остальных функций пока не очень понятны, а текущее понадобиться для иследования первой программы crackme.
Теперь немного про дебаггер, основные клавиши остались стандартные
F9
- выполнить программу
F8
- трассировать не заходя в функцию
F7
- трассировать заходя в функции
F2
- снять/установить брякпоинт на строке где в текущий момент курсор.
Как в IDA различать где мы сейчас находимся в программе которую отлаживаем или уже шаримся по дллке импорта - можно посмотреть в текстовом виде с лево от номера позиции и увидеть описание, например вот такое:
kernel32.dll
:764FD8F3
mov edi, edi
Ну по слову kernel32. сразу становиться понятно, что сейчас мы находимся в кернеле.
Ну теперь всетаки давайте вернемся нашему многострадальному crackme.
Запустим его и попытаемся ввести какое нибуть имя и серийный номер, вывалиться мессадж бокс, который скажет "No luck there, mate!". Значит мы не угадали имя и пользователя. Давайте попробуем отловить это сообщение и посмотрим как нам заставить выдавать правильное сообщение, что имя и серийник правильные. Известно, что вывод сообщения об неудаче использует стандартную API функцию MessageBoxA
, вот на нее и необходимо нам поставить брякпоинт.
Идем в View
->Open SubViews
->Functions
или нажимам Shift+F3,
а вот там видим все функции которые удалось определить IDA.
Выделяем нужную нам функцию MessageBoxA
и по низпадающему меню от правой мыши ставим брякпоинт на функцию. Както так:
Ок. Поставили, продолжим выполнение программы и попробуем ввести снова неправильное имя и серийник.(к стати вернутся в окно отладки по умолчанию чаще всего можно кнопкой ESC
)
Отладка остановилась на выводе сообщения о неправильном логине и пароле, отлично, смотрим какую полезную информацию мы можем выудить.
Мы находимя на входе в функцию MessageBoxA, сама функция нам не интересна, по этому жмем CTRL+F7
что означает, выполнить код до обнаружения первого ret, тоесть выхода из функции. После всех манипуляций, основное окно дизасемблированного кода выглядит вот так:
Ага! Это процедура которая передает аргументы для MessageBoxA которая выводит сообщение об неправильном серийнике и имени. Так как назначение понятно, то можно переименовать сразу функцию щелкнув ПКМ(правой кнопокй мыши) на sub_401362 и выбрав там пункт Rename или использовав горячую кнопку N. Я назову эту функцию AHTUNG! :)
Посмотрим далее, откуда растут ноги этой процедуры и что же находиться за ней. Нажмем F8 и выйдем на уровень в верх. А там сразу видно некую проверку со стрелочками, одна стрелочка на лево ведет к вредной процедуре AHTUNG , а вот вторая не очень понятно, но там видно CALL и адрес sub_40134D , очень интересно посмотреть, что же там. Варианта 2 в принципе, 1 это щелкнуть 2 раза ЛКМ(левой кнопкой мыши) на sub_40134D и попасть в эту функцию, а второй, это просто навести мышой на туже sub_40134D и подождать пол секунды, что покажет кусок этой функции, както так:
Уже очень интересно, похоже что другой вариант проверки ведет к правильному окошку. Обзовем эту процедурку GOOD
.
Снимаем старый брякпоинт на MessageBoxA
, он нам не нужен уже идем в Debugger->Breakpoints->Breakpoint List
и удаляем старый брякпоинт в открывшемся окне.
Теперь необходимо поставить брякпоинт на проверку jz над этими процедурками AHTUNG
и GOOD
либо по ПКМ и выбором соответсвующей опции или хоткеем F2. Перезапустим программу и осмотримся.
Получится у нас следующее окно:
К сожалению на статичной картинке не видно, но поверьте мне на слово, в текущий момент мигает срелочка которая ведет в сторону процедурки AHTUNG и это есть не очень хорошо. Нам было бы неплохо чтобы мигала зелененькая стрелочка в сторону процедурки которую мы обозвали GOOD. Для этого необходимо поставить флаг ZF в 1. ПКМ на флаге и выбрать опцию Increment Value или выделить флаг и нажать на кнопочку +(плюс) цифровой клавиатуре. Конечно лучше это смотреть в динамике, в статичных картинках плохо видно, но теперь замигала стрелочка в сторону GOOD процедурки в листинге это выглядит вот так:
Тут более наглядно на статике, когда ZF = 0, то переход не совершается и выглядит в виде пунктиной линии, соответсвенно мы попадаем на процедурку AHTUNG, а когда совершается - то видно жирную зеленую стрелочку и ведет он на процедурку GOOD.
Ну чтож, жмем наконец F9
и наслаждаемся результатом: Great work, mate. Now try the next CrackMe.
Правда если закрыть программу и снова открыть в отладчике, флаг конечно пропадет, надо придумать что нибуть, чтобы пропатчить ее и больше не извращаться с флагами, самый простой вариант, это за место JZ
сделать JNZ
, чтобы принимался наоборот любой неправильный серийник, кроме правильного.
Hex код JZ - 74
, а код JNZ - 75,
значит нада поменять байт, встаем на строку которую хочем поменять, идем в Edit
->Patch programm
->Change Byte.
Повяиться панель с набором байтов:
74 07 E8 18 01 00 00 EB 9A E8 FC 00 00 00 EB 93
необходимо поправить первую цифру на 75
, чтобы получилось
75 07 E8 18 01 00 00 EB 9A E8 FC 00 00 00 EB 93
В дизасемблированном коде можно будет увидеть изменения.
Тем самым теперь будет правильно проходить любой серийник кроме правильного, хотя я считаю что это грязным трюком, лучше или знать серийник или сделать безусловный JMP.
Сохраним результат патча, File
->Produce File
, вывалиться куча возможных сохранений, даже в EXE
, но оно почемуто не работает, так что сохраним в банальный DIF.
Посмотрим в файлик что получилось:
То что надо.
Ну вот и все на сегодня, следующая часть я думаю будет через недельку.
OllyDbg это достигший большой популярности 32-х битный отладчик, который используют и новички изучающие ассемблер и лютые хакеры ради идеи и негодяи для создания новых штаммов компьютерных вирусов. Это удобный и многофункциональный инструмент для анализа и модификации скомпилированных в машинный код файлов. С OllyDbg возможен как взлом программы, так и наоборот, - усовершенствование защиты от взлома программного обеспечения. Когда исходник недоступен, можно дизассемблировать и анализировать программу "на лету". Реализованный в отладчике анализатор кода распознает процедуры, константы, циклы, таблицы, текст и ветвления.
Отладчик дизассемблер
OllyDbg распознает и расшифровывает более 2000 функций языка C и Windows API. Отладчик поддерживает подключение дополнительных плагинов, выполняет эвристический анализ стека, работает в режиме пошаговой отладки, поддерживает hex, ASCII, Unicode, 16/32 битные целые числа и 32/64/80 битные числа с плавающей запятой. Отладчик с простым и понятным интерфейсом, подсветкой кода, большими возможностями и с открытым исходным кодом.
Данная статья приведена исключительно в информационно-ознакомительных целях. Коллектив проекта "DAXA" не несет никакой ответственности.
"Урок крэкинга с помощью OllyDbg"
Думаю многих интересует как ломаются программы?, каким образом можно обойти регистрацию или как обойти ограничение работы программы? В данной статье я приведу простой пример обхода регистрации, попытаюсь объяснять все очень просто чтоб все поняли. Желательно иметь хоть приблизительное представление о том что такое ассемблер но если и этого багажа знаний у вас нет нестрашно, думаю после этого опыта, вы обязательно выучите азы ассемблера.
После закачки всего необходимого софта, установите его куда вам угодно. Все программы не требуют установки. Первым делом запускаем наш отладчик OllyDbg , при первом запуске он попросит вас указать пути к UDD и Plugins, поможем ему заходим в Options->Appearance->Directories и прописываем оба пути(просто укажите папку где лежит OllyDbg). Непугайтесь множества окон, для работы нам понадобиться всего 3.
1.CPU
2.Breakpoints
3.Patches
Все остальные окна рекомендую закрыть, чтоб они нам не мешали. Теперь разъясню нашу задачу, нам необходимо либо сделать так чтоб программа принимала любой ключ или вообще не выводила сообщение о регистрации и навсегда забыла о ней:). И так приступим, попробую описать все пошагово.
1.Открываем нашу программу в отладчике. Для этого открываем меню File->Open и выбираем нашу тестовую программу. После загрузки в окне CPU мы увидим вот такую картину.
Это и есть ассемблерный код нашей программы.
Теперь немного объясню некоторые строчки:
PUSH EBP ; Начало другой функции
CALL TestP.00405С60 ; Вызов функции
Этого пока нам будет достаточно.
2.Теперь нам надо найти функцию которая выдает окно с запросом ввода ключа.
Для этого выполняем программу пошагово нажимая клавишу F8 до тех пор пока не появиться окошко с запросом ввода.
После нескольких нажатий появляеться окошко ввода.
Теперь мы знаем что где-то в этой функции (TestP.004523B8) выводиться наше окошко. Нам необходимо докопаться до функции которая выводить окно,для этого надо зайти в эту функцию. Теперь перед этой строкой CALL TestP.004523B8 нам надо поставить точку останова (Breakpoint) для этого выделяем строку перед ней и нажимаем F2 и видим что в окошко Breakpoints добавилась эта строка.
Далее нажимаем на эту кнопку для того чтоб загрузить нашу программу заново. Теперь надо дойди до точки останова для этого нажимаем для того чтоб выполнить нашу программу и видим что выполнение остановилось на нашей точке останова. Для того чтоб зайти в функцию нажимаем клавишу F7. Думаю вы поняли разницу между F8 и F7, первая трассирует программу без захода в функции, вторая с заходом в функции. Видим такую картину.
Нам надо продолжать пока не найдем функцию которая выводит окно и обрабатывает нажатие на кнопку ОК и определяет правильно мы ввели ключ или нет. Продолжим, также нажимаем F8 пока не появиться окно.
Опять перед ней ставим точку останова.
Жмем и опять , видим что выполнение остановилось на нашей первой точке останова, а нам надо ко второй, для этого жмем еще раз , выполнение дойдет до второй точки останова. Заходим в функцию клавишей F7, видим следующее.
Опять ставим точку останова и возвращаемся сюда, заходим в функцию, думаю вы уже поняли как это делается. После захода в функцию видим следующее.
Продолжаем искать нажимая F8. Походу нажатия F8 мы видим что начинают появляться API функции,
Значит мы уже близко. Нажимаем медленно и следим когда появиться окно. Вот что произошло, по ходу трассировки программы в лотке задач появилось наше окно,
Вылезло оно на этой строчке,
Но при нажатии на него мышкой окно не появляется, уряя значит мы там где нам нужно, именно эта функция рисует окно и где-то тут сверяется введенный нами ключ. Продолжаем дальше трассировать программу (F8!) и видим что на этом месте
Какой-то цикл, который постоянно повторяется, у нас уже палец болит держать F8 , а он никак не кончиться, для этого ставим точку останова на первой строке после цикла (MOV DWORD PTR SS:,EAX)
И нажимаем кнопку и видим что окошко полностью нарисовалось, ждет от нас ввода, программа остановилась тут, в цикле. Далее вводим любой ключ, нажимаем ОК.
Окошко закрылось и мы вернулись в окно отладчика, выполнение остановилось на нашей точке останова. Теперь нам надо найти функцию в которой выводит окошко с уведомление что ключ введен неверно. Для этого трассируем (F8) нашу программу до того момента пока не появится окошко с уведомлением.
Тут мы и будем разбираться что к чему. В глаза первым делом кидается строчка это и есть наш правильный ключ, но не надейтесь что в других программах вы так просто его найдете, обычно ключи просто так в памяти не лежат, потому нашей задачей будет сделать так чтоб программа принимала любой ключ! Теперь проанализируем код перед вызовом функции (CALL TestP.00427294) которая выводит окно с уведомлением об ошибке. Первым делом смотрим в окно регистров котрое находиться в окне
И видим что в регистре EAX лежит адрес введенного нами ключа в памяти и соответственно что мы ввели (я ввел 23). Тут все уже немного сложнее и надо иметь хоть небольшие знание основных операторов ассемблера. Думаем так, что программа должна сравнить наш ключ с каким либо еще или проверить его правильность любым другим способом, но для этого она должна вызвать функцию которая это все сделает. Значит ищем приблизительно такую структуру
MOV
EAX, ...  //записывает в EAX адрес нашей строки
...................
CALL
...          //вызов функции которая проверит правильность нашей функции
JNZ
(или JE
) ...// условный переход (почитайте о них!)
Немного об условном переходе, с помощью этого оператора можно переходить к определенной строке кода, адрес указывается после оператора. Значит после вызова функции если ключ был введен верно после вызова этого оператора он перейдет на строку после которой и запуститься наша программа. Если же нет то будет выполняться код после него. Значит ищем, в глаза сразу бросается такой код
MOV
EAX,DWORD PTR SS:
MOV
EDX,TestP.00453BA4
CALL
TestP.00404258
JE
SHORT TestP.00453B4A
Теперь заново пошагово выполните это кусочек кода и вы увидите что этот оператор
JE SHORT TestP.00453B4A
пропускается и никуда нас не перекидывает, значит
это и есть наша функция которая проверила наш код и он оказался неверным потому оператор JE никуда нас и неперекинул.
Я нибуду вам обьяснять как этот оператор проверяет правильность, мы все делаем "жестко" напролом:).
Значит если код будет введен то этот оператор кинет нас по одресу 00453B4A и все будет ок:).
Заменяем этот оператор на безусловный переход (JMP) который в любом случае перекинет нас по этому адресу.
Посмотрите где этот адрес находиться (выделенная строка синим цветом).
Видим что вызов функции которая выводит уведомление о том что ключ неверен, пропускается.
Для того чтоб заменить строку выделяем её и нажимаем пробел(Space) и заменяем это
на это.
Видим что строка JE SHORT TestP.00453B4C
заменилась и в окошке Patches
добавилась строка.
Теперь проверяем или работает. Нажимаем кнопочку , в окне Breakpoints нажимаем правой клавишей мышки и в меню выбираем Disable All.
Далее в окне Patches на нашей строке нажимаем правой и в меню выбираем Apply Patch. После этого жмем кнопку ,
выводиться окошко с запросом ключа, вводим любой ключ, нажимаем ок и наша программа зарегистрирована.
Конкретно эта программа будет всегда спрашивать ключ, так как это просто тест, а реальная программа записала бы себе что вы правильно ввели ключ.
3.Последний шаг, надо зашить патч в программу для этого нам и нужен Hex редактор. Итак открываем его и выбираем нашу программу, откроеться туча шестнадцетиричных цифр. Нам надо найти строку JE SHORT TestP.00453B4A в шестнадцатеричном виде и заметь её на нашу. Я думаю вы заметили что в окне CPU(OllyDbg) напротив каждой строки пишется её шестнадцатеричный вид. Для того чтобы точно найти эту строку ищем так, не просто вводим искать 74 2B , а берем еще предыдущую строку кода и ищем так E8 3B 07 FB FF 74 2B
В exe файле код идет цепочкой, по этому мы и берём предыдущую строку. Для чего же мы это делаем, просто такая маленькая строка как 74 2B может повторяться несколько раз потому мы и берем еще предыдущую строку чтоб найти именно то что нам нужно. Далее смотрим как в шестнадцатеричном коде выглядит наша видоизмененная строка JMP SHORT TestP.00453B4A, выглядит она так EB 2B вот мы и заменяем найденную строку на нашу, для это нажимаем кнопочку и заменяем строки так
Сохраняем изменения, закрываем редактор. Вот и все, данная программа будет принимать любой ключ, что и требовалось сделать. Предлагаю вам попробовать сделать так чтоб программа вообще не выводила запрос на ввод ключа.
ВАЖНО!! Прежде чем приступать к манипуляциям c программами необходимо проверить или *.exe файл небыл запакован. Для этого вам понадобиться утилита PEiD. Как это все делается тема отдельной статьи, предлагаю в этом разобраться вам самим.