
- •Модульная архитектура технических средств защиты по от несанкционированного использования
- •Функционирование подсистем и модулей системы защиты по от несанкционированного использования
- •Электронные ключи 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
- •Лабораторные работы
2.3. Защита, основанная на человеческом факторе злоумышленника
Как было показано выше, одна из целей разработчиков защиты ПО от отладки и дизассемблирования – как можно сильнее затруднить данный процесс, чтобы он отнимал у злоумышленника большое количество времени, либо отбить желание у злоумышленника исследовать программу под отладчиком и анализировать дизассемблированный текст. Одна из методологий осуществления этого – атака на человеческий фактор взломщика (взломщик атакует защиту, а разработчик защиты атакует взломщика). Данная атака заключается в атаке на психику и психологию взломщика, на то, чтобы как можно больше раздражать его исследованием кода программы. Ниже приведено несколько подходов к осуществлению такой атаки.
1. Перемешивание кода программы.
В данном случае пишется специальный модуль, перемешивающий инструкции кода программы. Если первую инструкцию оставить на месте, другие разбросать в разные области, и перед каждой следующей инструкцией вставить команду перехода на нее, то общая последовательность выполнения инструкций программы не изменится и код будет иметь тот же семантический смысл.
Пример 2.5. Пусть оригинальный код выглядит следующим образом:
start:
Инструкция 1
Инструкция 2
Инструкция 3
Инструкция 4
end:
Тогда, данный код может быть, например, перемешан следующим образом:
start:
jmp @@1
@@4:
instruction 4
jmp end
@@2:
instruction 2
jmp @@3
@@1:
instruction 1
jmp @@2
@@3:
instruction 3
jmp @@4
end:
Допустим, что в тексте программы находится типичный кусок какой-либо классической защиты, например,
0000000: 16 push ss
0000001: 17 pop ss
0000002: 9C pushf
0000003: 58 pop ax
0000004: A90001 test ax
0000007: 740C je DebuggerDetected
Суть происходящего в этом примере очевидна: вся последовательность команд у злоумышленника перед глазами и ничто не составляет для него труда проанализировать эту последовательность и обойти ее. Если же перемешать данный участок кода, то провести анализ кода будет уже гораздо сложнее: в отладчике злоумышленник будет наблюдать постоянные прыжки с места на место, причем отследить, откуда была сделана очередная команда перехода, будет весьма проблематично (не все отладчики имеют подобные функции). Если дизассемблировать такой исполняемый файл, то мы получим листинг, который придется постоянно листать взад - вперед, отслеживая выполнение программы. Перемешанный код может в результате выглядеть, например, следующим образом.
00000000: 16 push ss
00000001: EB07 jmps 00000000A
00000003: 58 pop ax
00000004: EB08 jmps 00000000E
00000006: 740B je RealModeDebuggerDetected
00000008: EB09 jmps 000000013
0000000A: 17 pop ss
0000000B: 9C pushf
0000000C: EBF5 jmps 000000003
0000000E: A96400 test ax,00064
00000011: EBF3 jmps 000000006
Если таким образом обработать достаточно большой участок кода, то разобраться в результатах обработки будет в практически невозможно. Данную обработку можно выполнять последовательно несколько раз.
Для восстановления исходной последовательности команд придется писать раскодировщик результата перемешивания путем сохранения реальных инструкций без сохранения прыжков, однако, написание такого раскодировщика сопровождается рядом трудностей (например, собственно трудоемкость написания раскодировщика, трудность восстановления команд с относительной адресацией и т.д.).
2. Задача анализа кода взломщиком намного усложнится, если в некоторых случаях команду безусловного перехода заменить на команду условного (в данном случае, мы должны быть точно уверены в содержимом регистра флагов). Например, в следующем случае, переход будет осуществляться всегда:
Xor ax,ax
Je 000000025