- •Основы исследование безопасности программного обеспечения
- •Оглавление
- •Обращение к читателю
- •Введение
- •С чего начать
- •Инструменты исследователя
- •Установка исследуемой программы
- •Типовая защита «Запрос пароля» или «Запрос ввода регистрационного номера»
- •Исследование типовой защиты в отладчике OllyDbg
- •Исследование типовой защиты в дизассемблере ida Pro
- •Типовая защита «Запрос пароля» или «Запрос ввода регистрационного номера» с шифрованием сообщения
- •Технологии защиты программного кода от исследования и отладки
- •Как не надо проектировать защиту программ
- •Как обмануть отладчик и дизассемблер
- •Приложение 1. Ассемблер в Windows
- •О стеке
- •Команды передачи управления
- •Литература для дополнительного изучения
- •Приложение 2. Отладчик OllyDbg
- •Откуда скачать программу
- •Установка и настройка программы
- •Дизассемблированный код (листинг)
- •Регистры
- •Наиболее полезные клавиши в OllyDbg
- •Подключение плагинов в OllyDbg
- •Встроенный язык ida Pro
- •Плагины ida Pro
- •Литература для дополнительного изучения
- •Задание для самостоятельного выполнения
- •Список используемой литературы
Исследование типовой защиты в дизассемблере ida Pro
Откроем исследуемый файл CRACKME1.EXE в интерактивном дизассемблере IDA Pro (см. Приложение 3).
Рис. Дизассемблерный код программы CRACKME1.EXE
Переходим на вкладку Functions и начинаем набирать на клавиатуре название нужной нам функции MessageBoxA.
Рис. Список функций, определенных IDA Pro
Через контекстное меню устанавливаем точку останова на функции.
Рис. Установка точки останова на вызов функции MessageBoxA
В нижней части видим информационное сообщение о добавлении точки останова.
Рис. Вывод информации о добавлении точки останова в информационном окне
Запускаем процесс отладки (F9).
Рис. Запуск процесса отладки из меню
Появляется окно с предупреждением: отладка предполагает запуск программы, поэтому исследование вредоносного ПО может повредить компьютеру. Нажимаем Yes.
Рис. Окно с предупреждением
Сработала точка останова.
Рис. Окно с информацией о сработавшей точке останова
Мы оказались в ntdll.dll. Нажимаем F4, чтобы перейти к следующему шагу выполнения программы с выходом из библиотеки.
Произошло исключение. Нажимаем Yes.
Рис. Окно с информацией об исключении
Появилось окно исследуемой программы, вводим произвольные числа, например, «Приложение 2». Нажимаем OK.
Рис. Окно исследуемой программы
Смотрим содержимое стека. Нажимаем на стрелочку напротив значения регистра EAX.
Рис. Значения регистров
Открывается окно содержимого стека, где мы видим, что один из параметров очень похож на пароль.
Рис. Содержимое стека
Слабым местом в защите программы оказался пароль, который хранился открытым текстом.
Типовая защита «Запрос пароля» или «Запрос ввода регистрационного номера» с шифрованием сообщения
Запустим программу CRACKME2.EXE.
Рис. Диалоговое окно исследуемой программы
Получим окно сообщения. Запакована (см. Приложение 3) программа или нет? Проверить можно с помощью PEiD.
Рис. Результаты анализа исследуемого файла, выполненного программой PEiD
Программа не запакована и не зашифрована. Воспользуемся отладчиком OllyDbg: http://www.ollydbg.de/odbg110.zip
Рис. Главное окно отладчика OllyDbg
По аналогии, попытаемся найти текстовые строки.
Рис. Меню поиска строки
Отсутствуют текстовые строки с описанием ошибки, т.е. использовалась защита.
Рис. Строка дизассемблированного кода
Упростим исследование. С помощью интерактивного дизассемблера IDA Pro (см. Приложение 3) создадим MAP-файл и загрузим этот файл в OllyDbg. Это позволит улучшить читаемость имен функций, меток, комментариев.
Рис. Сохранение в IDA Pro MAP-файла
Сохраним MAP файл в той же папке, где находится исследуемый файл.
Рис. Окно параметров MAP-файла
IDA Pro можно закрывать.
Воспользуемся плагином GoDup: http://www.openrce.org/downloads/details/103/GoDup
Установим плагин и перезапустим OllyDbg. Загрузим MAP-файл.
Рис. Плагин загрузки MAP-файлов в OllyDbg
Рис. Окно с результатами загрузки MAP-файла
Функции преобразились, читать их стало приятнее.
Рис. Дизассемблерный код после загрузки MAP-файла
Теперь надо сказать отладчику, чтобы он остановился в момент ввода пароля или его проверки. Установим точки останова на нужную функцию. Как ее найти? Программа написана на Borland C++ 1999, поэтому можно использовать все функции из этого компилятора. Попробуем поставить точку останова на функцию MessageBoxA (вывод окна).
Воспользуемся еще одним плагином:
http://www.openrce.org/downloads/details/105/CommandBar
После установки увидим командную строку.
Рис. Плагин CommandBar
Для установки точки останова на вызов функции MessageBoxA, в командной строке необходимо ввести команду:
bpx MessageBoxA
Рис. Пример установки точки останова с помощью плагина CommandBar
Запускаем отладку (F9), вводим произвольный пароль в появившееся окно.
Рис. Отладка исследуемой программы
Остановились на вызове функции вывода MessageBoxA.
Рис. Содержимое регистров в процессе отладки программы
В регистре EAX строки текста о неправильном пароле. Пролистаем дизассемблированный текст выше. Видим функцию, похожу на сравнение двух строк.
Рис. Дизассемблированный код вызова функции сравнения строк
Перезапустим программу и установим точку останова по адресу 00401DC6.
В командной строке можно указать команду:
bp 401DC6
Рис. Установка точки останова с помощью плагина CommandBar
Переходим на список точек останова (B) и проверяем правильность.
Рис. Список установленных точек останова
Запускаем отладчик (F9), вводим пароль и попадаем на точку останова.
Рис. Остановка отладчика на точке останова
Теперь необходимо зайти внутрь функции (F7) и посмотреть, что сравнивает программа. Доходим до функции сравнения.
Рис. Дизассемблерный код функции сравнения строк
Обратимся к окну регистров. В регистре EAX находится введенная строка, в регистре EDX – строка, с которой сравнивается введенная.
Рис. Содержимое регистров
Проверим в качестве пароля строку «KEYmyOK».
Рис. Окно, подтверждающее правильность введенного пароля
Слабым местом защиты оказалось то, что окно с сообщением выводилось сразу после проверки пароля.