- •Основы исследование безопасности программного обеспечения
- •Оглавление
- •Обращение к читателю
- •Введение
- •С чего начать
- •Инструменты исследователя
- •Установка исследуемой программы
- •Типовая защита «Запрос пароля» или «Запрос ввода регистрационного номера»
- •Исследование типовой защиты в отладчике OllyDbg
- •Исследование типовой защиты в дизассемблере ida Pro
- •Типовая защита «Запрос пароля» или «Запрос ввода регистрационного номера» с шифрованием сообщения
- •Технологии защиты программного кода от исследования и отладки
- •Как не надо проектировать защиту программ
- •Как обмануть отладчик и дизассемблер
- •Приложение 1. Ассемблер в Windows
- •О стеке
- •Команды передачи управления
- •Литература для дополнительного изучения
- •Приложение 2. Отладчик OllyDbg
- •Откуда скачать программу
- •Установка и настройка программы
- •Дизассемблированный код (листинг)
- •Регистры
- •Наиболее полезные клавиши в OllyDbg
- •Подключение плагинов в OllyDbg
- •Встроенный язык ida Pro
- •Плагины ida Pro
- •Литература для дополнительного изучения
- •Задание для самостоятельного выполнения
- •Список используемой литературы
Типовая защита «Запрос пароля» или «Запрос ввода регистрационного номера»
Алгоритм работы:
-
программа запрашивает пароль у пользователя;
-
программа что-то делает с паролем (шифрует или получает хеш-функцию);
-
сравнивает полученную функцию с правильным паролем.
Пример программы.
Рис. Пример кода программы, сравнивающей пароли
Для обхода такой защиты злоумышленнику достаточно найти место сравнения паролей и либо переписать пароль, либо изменить программу так, чтобы любой вводимый пароль считался правильным («бит-хак»).
Запустим программу CRACKME1.EXE и проследим за ее выполнением.
Рис. Главное окно программы
Вводим «Приложение 2», нажимаем OK, получаем сообщение о неверном пароле.
Рис. Окно программы с сообщением о неверном пароле
Далее злоумышленнику необходимо определить:
-
зашифрована программа или нет;
-
на каком языке написана программа – эта информация понадобится для определения функций, на которые ставятся точки останова (брейкпоинты).
Воспользуемся утилитой PEiD, http://www.peid.info/ (4 апреля 2011 проект прекратил существование), последняя версия есть на сайте: http://cracklab.ru/download.php?action=list&n=MzU=
Рис. Окно программы PEiD
Откроем исследуемый файл в PEiD.
Рис. Результат анализа исследуемого файла
Видим, что программа написана на С++ фирмы Borland и ничем не запакована. Исследуем программу сначала в отладчике OllyDbg (см. Приложение 2), затем в дизассемблере IDA Pro (см. Приложение 3).
Исследование типовой защиты в отладчике OllyDbg
Воспользуемся отладчиком OllyDbg (см. Приложение 2). Сначала исследуем защиту программы CRACKME1.EXE без применения плагинов, для этого подойдет версия 2.01: http://www.ollydbg.de/odbg201c.zip или более ранняя: http://www.ollydbg.de/odbg110.zip
Рис. Главное окно отладчика OllyDbg после загрузки программы CRACKME1.EXE
OllyDbg остановился на самом начале файла, точнее, на точке входа в программу. Злоумышленник первым делом может попытаться найти строки, которые выводятся программой на экран («password FALSE»). В главном окне кода правой клавишей мыши переходим в контекстное меню.
Рис. Контекстное меню окна дизассемблерного кода
Рис. Строки, которые выводятся в окне программы
Сообщение о неправильном пароле не зашифровано. Можем перейти на код, который обрабатывается в случае неправильного ввода пароля.
Рис. Выбор контекстного меню строк
Рис. Код вывода сообщения о неправильном пароле
Видим вызов стандартной функции MessageBoxA.
Стрелочки, которые находятся левее кода инструкции, показывают направление перехода. Если нажать мышкой на стрелку, то наглядно увидим данный переход.
Рис. Дизассемблерный код вызова функции MessageBoxA
Видим, что переход на сообщение о неверном пароле осуществляется со строки:
00401C58 74 1D JE SHORT 00401C77
Функция JE осуществляет условный переход, т.е. некоторая функция проверяет пароль на правильность и, если он верен, переходит на строку:
00401C5A 6A 00 PUSH 0
Таким образом, функция проверки правильности пароля находится выше строки:
00401C58 74 1D JE SHORT 00401C77
Пролистав код немного вверх, обратим внимание на функцию ассемблера CMP, которая выполняет сравнение, а после – осуществляет переход.
Рис. Дизассемблерный код функции сравнения CMP
Поставим точку останова (клавиша F2) на строке, содержащей CMP, и запустим программу в отладчике (клавиша F9). Вводим любой пароль в появившемся окне программы и нажимаем OK. Мы перешли в отладчик и после этого видим строку, похожую на пароль.
Рис. Окно дизассемблерного кода, содержащего строку пароля
Проверяем полученный пароль.
Рис. Окно с сообщением о вводе правильного пароля