1.2.1. Специфика атак на модули проверки корректности ключевой информации
Для вскрытия данного типа защит в первую очередь необходимо найти в коде программы код модуля защиты и, а в нем – процедуру данной проверки.
В большинстве программных продуктов, проверка корректности ключевой информации выполняется непосредственным образом. При этом, исходный текст программы выглядит, приблизительно, следующим образом.
If (!ValidUser())
{
Message (“Неверный пользователь”);
Abort;
}
Здесь, ValidUser() – базовая процедура проверки. Ключевая информация может вводиться пользователем как в данной процедуре, так и ранее. Данный исходный текст компилируется компиляторами в код, аналогичный следующему:
PUSH AX
CALL IsValidUser;
POP AX
OR AX, AX
JZ continue
PUSH offset str_invalid_user
CALL Message
CALL Abort
Continue:……
В данном коде команда CALL IsValidUser осуществляет вызов процедуры IsValidUser. Передача в данную процедуру параметров (например, ссылки на ключевую информацию) осуществляется через стек командами PUSH (занесение параметра в стек) до команды CALL и POP (вызов из стека результата, возвращенного процедурой IsValidUser) после команды CALL.
В представленном примере результат выполнения процедуры IsValidUser заносится в регистр AX. В дальнейшем производится проверка на равенство нулю возвращенного результата (команды OR AX,AX). Если AX=0, то ключевая информация верна, производится ее регистрация и дальнейшее продолжение работы (JZ continue). В ином случае выводится сообщение о невозможности продолжения работы (PUSH offset str_invalid_user; CALL Message) и завершение работы программы (CALL Abort).
В данной ситуации, после обнаружения представленного выше программного кода модуля защиты, взломщик может осуществить атаку следующим образом.
Заменить команду условного перехода JZ continue на команду безусловного перехода JMP continue. В данном случае, регистрация программы будет осуществляться в любом случае, вне зависимости от правильности ввода ключевой информации.
Изменить в процессе работы программы содержимое регистра AX после команды POP AX, либо значение регистра флагов после команды OR AX,AX. В данном случае, злоумышленник вынужденно заставляет модуль защиты работать по нужной ветке.
Исследовать работу процедуры IsValidUser вручную с целью выяснения ключевой информации.
Реализация первых двух типов атак называются «жестким» взломом программного продукта, так как он требует модификации кода программы. Реализация третьего типа атак называется «мягким» взломом программного продукта и во многих случаях является более предпочтительной для злоумышленника, хотя и требует от него несколько больших временных затрат.
Первые два типа взлома позволяют осуществить взлом программного продукта в достаточно короткие сроки, не прилагая к этому слишком больших усилий (одна из таких защит была взломана в течение 10 секунд). Достоинством для злоумышленника третьего типа взлома заключается в том, что иногда исследовав логику работы процедуры IsValidUser, можно не только вычислить ключевую информацию, но также написать и генератор ключевой информации для последующего использования другими пользователями. Это возможно сделать, если разработчик вложил в модуль защиты непосредственную связь между идентификатором пользователя и его аутентификатором (ключевой информацией). Кроме этого, достоинством третьего типа взлома является то, что получив ключевую информацию, злоумышленник снимает все проблемы, тогда как «жесткий» взлом иногда для злоумышленника затруднителен в силу того, что проверка корректности осуществляется в нескольких местах программы и различными способами.
В процессе анализа процедуры IsValidUser особое внимание уделяется следующим элементам.
1.Информации, передаваемой в процедуру IsValidUser в качестве параметров и возвращаемой из нее.
2.Содержимому регистров, передаваемых в другие процедуры, вызываемые из процедуры IsValidUser.
Содержимому памяти по адресам, передаваемым в процедуру IsValidUser и процедуры, вызываемые из нее.
Содержимому памяти по адресам, в которые заносятся идентификатор пользователя и введенная им ключевая информация (например, пароль), а также обращение к данным адресам из функции IsValidUser. Отслеживание обращений к этим адресам позволит более локализовать код, отвечающий за проверку адекватности ключевой информации.
Довольно часто злоумышленником производится исследование содержимого ОЗУ на осмысленные последовательности символов, а также отслеживание обращений к адресам, по которым хранятся эти последовательности (например, “Invalid Registration”, “Password Fail” и т.д.). Как правило, эти сообщения находятся недалеко от модулей защиты, отвечающих за проверку корректности ключевой информации. По обращению к адресам, хранящим данные сообщения также можно локализовать код проверки адекватности ключевой информации.
Как правило, передача параметров в функции и их возврат осуществляется через 32-битные регистры EAX,EBX, а также используя регистры ESI и EDI для указания на используемые данные.
- Модульная архитектура технических средств защиты по от несанкционированного использования
- Функционирование подсистем и модулей системы защиты по от несанкционированного использования
- Электронные ключи hasp
- Глава 1. Методы и средства обратного проектирования.
- 1.1. Понятие обратного проектирования
- 1.2. Основные приемы, используемые злоумышленником при отладке и дизассемблировании программного обеспечения
- 1.2.1. Специфика атак на модули проверки корректности ключевой информации
- 1.2.2. Специфика атак на модули проверки истечения временного срока работы программы или ограничения по количеству ее запусков
- 1.2.3. Отлов злоумышленником вызова WinApi функций при взломе по
- 1.3. Мониторинг событий
- Глава 2. Методы противодействия обратному проектированию
- 2.1. Методы противодействия отладчикам
- 2.1.1. Защита от отладчиков реального режима
- 2.1.2. Защита от отладчиков защищенного режима
- 2.1.3. Методы, основанные на невозможности полного эмулирования отладчиком среды загрузки программы
- 2.2. Методы противодействия дизассемблированию программного обеспечения
- 2.3. Защита, основанная на человеческом факторе злоумышленника
- Глава 3. Общие методы защиты программ от отладки и дизассемблирования
- 3.1. Использование недокументированных команд и недокументированных возможностей процессора
- 3.2. Шифрование кода программы
- Глава 4. Эмуляторы процессоров. Использование эмуляторов для взлома и защиты программного обеспечения.
- Глава 5. Защита исходных текстов программного обеспечения
- Глава 6. Идентификация и аутентификация субъектов
- 6.1. Идентификация и аутентификация пользователей с использованием технических устройств
- 6.2. Идентификация и аутентификация с использованием индивидуальных биометрических характеристик пользователя
- 7. Защита от разрушающих программных воздействий
- 7.1. Понятие разрушающего программного воздействия
- 7.2 Модели взаимодействия прикладной программы и рпв
- 7.3 Компьютерные вирусы как класс рпв
- 7.4. Защита от рпв. Изолированная программная среда
- Глава 8. Руководящие документы России
- Приложение
- 6.1. Отладка программ в отладчике SoftIce
- 6.2. Дизассемблирование программ с помощью интерактивного дизассемблера Ida Pro
- 6.3. Редактор кода hiew
- Лабораторные работы