Глава 4. Основные программы для обратной инженерии

Отладчики

Отладчик DEBUG

Запуск отладчика производится с помощью системной команды DEBUG . После ввода этой команды, на экране появляется приглашение в виде дефиса. Если ввести символ ?, то появится список допустимых команд. Рассмотрим некоторые из них.
Дамп памяти. Для просмотра содержимого ячейки памяти следует ввести команду D SiM

где s- адрес сегмента, делённый на 16 , M-смещение. Например, серийный номер компьютера находится в памяти ROM, по адресу FE000h. Значит, чтобы его увидеть, следует ввести

D FE00:0

Выход. Для окончания работы с отладчиком следует ввести команду

Q

Вывод данных. Данные вводятся в оперативную память с помощью команды

E SiM XX XX . . . XX

где s-адрес сегмента, делённый на 16 ( s может быть именем сегментного регистра), а м- смещение, хх хх . . . хх - данные в шестнадцатеричной форме. Например, команда

E CS:100 CB 20

вводит инстукциюб состоящую из единого оператора int 20 h ( возврат в DOS).
Ввод команд. Ввод команд ассемблера производится с помощью нажатия клавиши <A>, например: A CS:100 int 20
вводит команду int 20h.

Трассировка. Трассировка производится нажатием клавиши <T>. Выполняется одна команда, которая находится по адресу CS:IP. Выводится содержимое регистров. Вывод содержимого регистров можно сделать также нажатием клавиши <R>.
Дизаассемблирование. Если нажать на клавишу <U> или ввести команду

U диапазон
то на экран будут выведены машинные команды на ассемблере, соответствующие кодам, находящимся в данном диапазоне.

Отладка программы. Производится вводом команды
DEBUG имя_программы

Например, чтобы отладить программу TEXT.EXE, надо ввести комаду
DEBUG TEXT.EXE


Рисунок 8. Исполнение команды "?".


Рисунок 9. Исполнение команды "D".

4.2 Отладчик Turbo Debugger

Отладчик Turbo Debugger (TD) фирмы Borland является, на мой взгляд, самым удобным для изучения программ для ОС MS-DOS.
Некоторые его возможности:
-выполнение отслеживаемой программы по шагам или с точками останова;
-трассировка программы в прямом и обратном направлении;
-вывод на экран содержимого регистров и областей памяти;
-изменение программы, загруженной в память;
-принудительное изменение содержимого регистров;
-другие действия, позволяющие в наглядной и удобной форме контролировать выполнения программы.

Сразу после старта вы видите окно процессора (рис. 10).

Рисунок 10. Окно процессора.

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

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

В отладчике можно выполнять программу несколькими способами:
-по частям до местоположения курсора( клавиша <F4>);
-команда за командой с заходом в процедуру (клавиша <F7>);
-команда за командой без захода в процедуру (клавиша <F8>).

Загрузим для примера нашу программу в отладчик. Это делается так: td password.exe
Введя эту команду, мы увидим окно отладчика. Выполним трассировку программы (клавиша <F8>) до строки, показанной на рисунке 11.

Команды
mov AH, 09h
lea DX, string
int 21h

выводят сообщение на экран (рис.12) .

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


Рисунок 11. Трассировка программы.


Рисунок 12. Вывод сообщения.


Рисунок 13. Запрос пароля.


Рисунок 14. Ввод пароля.


Рисунок 15. Проверка пароля.


Рисунок 16. Просмотр данных.

Запрос пароля организован в трёх строках программы:

lea DX, string2-2

mov AH,0Ah

int 21h

Если нажать клавишу <F8>, то программа будет запрашивать пароль (рис. 13). Так как мы не знаем правильного пароля, введём любое символы, например , 1234 и нажмём <Enter> (рис. 14). После этого нажимаем клавишу трассировки и доходим до места в программе, показанного на рисунке 15.
Тут происходит сравнение введённой строки со строкой пароля. Чуть выше в тексте программы видно, что в регистры SI и DI помещаются две строки.
Переместимся в окно данных (рис.16) и нажмём комбинацию клавиш <Ctrl>+<G> , а на запросе адреса введём string1, а следующая строка- это введённый нами пароль.

4.3 Отладчик SoftICE

Наиболее важным его отличием является то, что SoftICE работает в нулевом кольце защиты.
В архитектуре 32-разрядных процессоров фирмы Intel есть три кольца защиты. Они предназначены для ограничения взаимодействия выполняющихся программ между собой и с операционной системой. Обычно ОС имеет права полного доступа ко всем остальным выполняемым программам, так как она работает в нулевом кольце защиты( наиболее привилегированном), системны задачи выполняются в первом и втором кольцах, а приложения- в третьем. Частично управлять запущенными приложениями можно из первого и второго колец защиты; именно так работает большинство отладчиков для разработки программ.
SoftICE работает в нулевом кольце защиты и позволяет полностью контролировать не только все выполняемые системой задачи, но и саму ОС Windows. Таким образом, с его помощью можно отлаживать всё что можно.


Рисунок 17. Рабочее окно отладчика.

Окно регистров

Главным свойством окна регистров, расположенного в верхней части главного окна отладчика, является то, что содержимое всех регистров, а также состояние флагов, можно изменять " на ленту".
Чтобы изменить содержимое регистра, нужно щёлкнуть левой кнопкой мыши на значение соответствующего регистра и внести с клавиатуры необходимые изменения. Значения флагов изменяются несколько иначе: надо щёлкнуть на букву обозначающей флаг, а затем изменить значение флага при помощи <Insert>. Смена регистра буквы означает, что флаг успешно изменён.

Окно данных

Прежде всего, обратим внимание на заголовок окна данных, расположенного под окном регистров. Первым в заголовке обычно указывается имя модуля, которому принадлежат данные (это важно, так как нам необходимо знать в каком модуле мы сейчас находимся), а затем формат отображения данных - byte, word, dword и так далее. если потребуется заменить формат отображения данных, для этого надо всего лишь щёлкнуть на нём мышкой. Таким образом, мы сможем видеть одни и те же данные в любом предусмотренном SoftICE формате. К сожалению, в SoftICE отсутствует поддержка просмотра в формате Unicode, а это значит, что мы не увидим русский шрифт.
Можно добавить, что в SoftICE имеется 4 окна данных, пронумерованных от 0 до 3. И хотя перед глазами находится только одно из них, м можем легко переключиться между ними; для этого надо сделать щелчок на номере окна( справа, в скобках) - оно должно измениться. Это позволяет следить за несколькими участками памяти. Можно также переключаться между окнами данных с помощью вводимой с клавиатуры команды:

DATA [номер_окна]

Окно кода

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

Окно команд

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

Точки останова

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

4.4 Интерактивный дизассемблер IDA.

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

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

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


Текстовый фрагмент 1. Дизассемблер IDA.

4.5 Отладчик OllyDbg

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

- "узнавание" более 2 300 стандартных API функций и функций языка С;
-автоматическое информирование по API из внешнего файла помощи;
-показ изменений в коде;
-поиск выборочных команд и бинарного кода по маске;
-поиск в памяти;
-поиск вызовов констант или чтение адресного пространства;
... и многое другое.

Главное окно программы

На рисунке 18 показано главное окно программы. Оно содержит:
-окно CPU ( главное для взломщика);
-окно информации;
-окно регистров;
-панель стека;
-меню.
Рассмотрим их подробнее.


Рисунок 18. Главное окно отладчика OllyDbg.

Окно CPU

Это самое важное окно отладчика, так как в нём ведётся собственно отладка исследуемой программы. В нём есть 4 столбца : адрес, HEX-дамп, дизассемблерные команды и комментарии. Последний столбец может также отображать связанный код или профиль выполнения.
Как видим, все инструкции в этом окне приведены в дизассемблерном виде. Можно перемещать указательную строку с помощью мыши или клавиш перемещения курсора. Можно выбрать данные, которые надо скопировать , команду, которую надо изменить, место установки брекпойнта и т. д. Слева красной стрелкой указан адрес следующей выполняемой команды.

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

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

Окно регистров

В окне регистров отображаются все регистры процессора - регистр флагов и др. Эти регистры можно изменять прямо " на лету" . Для того чтобы изменить регистр, надо щёлчком выделить его и щёлкнуть на нём ещё раз. На экране появится окно, показанное на рисунке 19. В этом окне можно ввести новое значение, и оно тут же будет применено.


Рисунок 19. Окно изменения регистра.

Панель стека

Панель стека ( расположена в левой нижней части главного окна программы) тоже очень важна. Она отображает содержимое памяти или файла. Можно выбрать один из нескольких предопределённых форматов отображения: byte, text, integer, float, address, disassembly или PE Header. В этой панели мы можем изменять значения нужных байт в памяти, ставить брекпоинты и т.д.

Меню

Значимым все же является вкладка Debug. Содержит следующие команды.
-Run- запускает отлаживаемую программу на исполнение;
-Pause - приостанавливает исполнение программы;
-Restart- перезапускает отлаживаемую программу;
-C0lose-завершает работу с отлаживаемой программой;
-Step into(<F7>)-запускает пошаговое выполнение программы с заходом в процедуру;
-Step over(<F8>)- запускает пошаговое выполнение программы без заходом в процедуру;
-Animate into-эквивалент постоянно нажатой клавиши <F7>;
-Animate over- эквивалент постоянно нажатой клавиши <F8>;
-Execute till return- предписывает выполнить программу до выхода из подпрограммы;
-Trace into-автотрассировка с заходом в подпрограммы;
-Trace over- автотрассировка без заходом в подпрограммы;
-Set condition- позволяет назначить условие для автотрассировки;
-Close run trace-выполняет останов автотрассировки;
-Hardware brearpoints-позволяет просмотреть немаскируемые брекпоинты.

Глава 5. Вывод.

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

Кроме того, реверс-инжиниринг используется в антивирусной индустрии, трудящейся на благо пользователей Windows иMac OS. Специалисты по компьютерной заразе пытаются понять структуру вредоносного софта с целью создания лекарств — тех самых обновлений, которые загружаются антивирусами практически каждый день.

Да, это ежедневный каторжный труд, для которого со временем всё сильнее подходит эпитет «сизифов».

Специалисты вылавливают файлы в сети, получают их из «карантина» антивирусных приложений, открывают файлы в шестнадцатеричных редакторах, всматриваются в байты... В общем, стараются в поте лица, чтобы защитить планету от новой ужасной напасти, плодящейся с неимоверной скоростью. (Правда, в качестве избавления они не рекомендуют безопасные бесплатные ОС на основе GNU/Linux, поскольку сие сделает их безработными.)

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

Глава 8. Литература.

· Денис Юричев «Reverse Engineering для начинающих» 2013

· Проскурин В. Г. П824 Защита программ и данных: учеб. пособие для студ. Учреждений высш. проф. образования / В. Г. Проскурин. 2-с изд., стер. — М. : Издательский центр «Академия», 2012. 208 с. — (Сер. Бакалавриат) ISBN 978-5-7695-9288-1

· Панов А. С. П16 Реверсинг и защита программ от взлома. – СПб.: БХВ-Петербург, 2006.-256 с.: ил.

· Гошко С.В. Энциклопедия по защите от вирусов.-М.:СОЛОН-Пресс, 2004

· Панов А. С. Assembler: Экспресс-курс.-СПб.:БХВ-Петербург, 2006

· Айрфпетян Р.А. Отладчик SoftICE: Подробный справочник. - М.: Солон-Прессб 2004.

А так же ссылки на источники в интернете:

  • http://xbb.uz/IT/Chto-takoe-revers-inzhiniring
  • http://www.copyprotection.ru/press/articles/?news=2772
  • https://ru.wikipedia.org/wiki/обратная разработка

Наши рекомендации