Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ОИБ Lab2.doc
Скачиваний:
5
Добавлен:
24.09.2019
Размер:
416.77 Кб
Скачать

Санкт-Петербургский государственный политехнический университет

Факультет технической кибернетики

—————————

Кафедра информационной безопасности компьютерных систем

ОТЧЕТ

по лабораторной работе №2

«Защита коммерческого ПО»

по курсу «Основы информационной безопасности»

Студент:

Виноградова М.М.

гр. 1088/4

Преподаватель:

Калинин М.О.

Санкт-Петербург

2011

1. Формулировка задания

Ознакомление с простейшими методами защиты программ от использования их незарегистрированными пользователями, приобретение практических навыков по анализу исполняемого кода без исходных текстов, исследование способов защиты программ от дизассемблирования и отладки.

2. Использованные теоретические сведения

Простейшим способом проверки легальности копии программного

обеспечения является запрос пароля y пользователя. Функция проверки

пароля разрешает пользователю продолжить работу с программой, если введен правильный пароль:

if(!Password(}) /* Ввод и проверка пароля*/

{

pError("Access defied!"); abort();

}

Этот фрагмент кода транслируется в следующий набор

ассемблерных инструкций:

CALL Password OR AX,AX

JZ continue

PUSH offset str access denied

CALL pError

. . . .

Continue:

. . . .

Ветвь кода после метки "continue" — ветвь нормального продолжения работы программы. Такой защитный механизм может быть легко взломан заменой одного байта. Поменяв JZ на JUMP, злоумышленник получает работоспособную копию программы. Независимо от алгоритма функции Password совершается безусловный переход на ветку нормального выполнения программы.

Вторым способом защиты программы от взлома является запрет на открытое хранение пароля во внешнем файле. Пример — хранение паролей в операционных системах семейства UNIX. B таком случае доступ к файлу паролей не дает никакой информации о самих паролях. Пароли хранятся в зашифрованном виде, а знание алгоритма шифрования и самого пароля не дает предположений об исходном пароле.

Наиболее часто используемая функция при шифровании пароля —логическая функция "исключающее ИЛЬИ", или XOR. Таблица истинности ХОД имеет вид: 0 XOR 0 = 1 XOR 1 = 0, 0 XOR 1 = 1 XOR 0 = 1. Основное свойство XOR: a ХОД b XOR a = b. Таким образом, шифратор и дешифратор имеют одно строение. шифрования с применением XOR часто применяется для сокрытия собственного кода программ в целях затруднения анализа и модификации кода.

Более совершенным способом защиты программного обеспечения представляется применение всплывающих окон (от англ. "nag sсrеen"). На языке высокого уровня чрезвычайно трудно создать что-нибудь устойчивое к взлому, поэтому в большинстве коммерческих приложений часто применяется подобный механизм. Всплывающие окна могут активизироваться в любой момент работы программы. B них часто выводится приглашение к регистрации. Окно может содержать рекламу или просьбу нажать некоторую клавишу. "Nag" с англ. — "назойливей", что отражает характер поведения данного механизма защиты программного обеспечения, рассчитанного на психологическое давление. Постоянное напоминание максимально затрудняет нормальную работу с программой и подталкивает пользователя к приобретению лицензионной копии, в которой данный механизм выключен.

Основным методом анализа и обхода таких механизмов защиты является использование программ-дизассемблеров и отладчиков (например, IDA, W32Dasm, ollyDBG, SoftICE, Periscope, Buble Chamber, Sourcer). B простейшем случае, как и при проверке пароля, необходимо исправить байт, что свидетельствует o чрезвычайной ненадежности такого способа защиты программ. Для того, чтобы противодействовать модификации исполняемого файла разработчики используют проверку целостности программ (например, с помощью контрольного суммирования).

Существует множество методов по усложнению дизассемблирования и понимания алгоритмов программ. Самым простым методом защиты от дизассемблирования является применение оптимизирующего компилятора. B оптимизированном исполняемом файле с целью повышения быстродействия программы или сокращения объема исполняемого файла нарушается прямой ("логичный") порядок вызова команд и использования регистров. Это несколько усложняет процесс анализа функций и передачи управления внутри кода программы.

Традиционный способ защиты программ — применение шифрованная или упаковки распространяемого программного обеспечения. B этом случае собственно исполняемый код не соответствует тексту программы в открытом виде. Однако если программа во время исполнения сама себя дешифрует или распаковывает, то она же содержит код, выполняющий действия по дешифрации или распаковке. Причем это код доступен, и, следовательно, выполнив его, можно получить в памяти исходный исполняемый код. Поэтому в программах, требующих хорошего уровня защиты от дизассемблирования, используется метод неполного динамического шифрования/дешифрования, таким образом, программа никогда не содержится в памяти расшифрованной целиком.

В большинстве случаев получение исходного ассемблерного кода не дает достаточно информации o механизме защиты. Тогда с помощью специальных yтилит-отладчиков можно запустить анализируемую исполняемую программу в режиме отгадки. Простейшим методом защиты от запуска в режиме отгадки является проверка наличия отладчика (например, функция isDebugPresent).

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]