Uploaded by maksim.troshin.8

практические работы 6-8

advertisement
Практическая работа № 6
«Защита программ от дисассемблирования»
Задание 1. Изучить и законспектировать следующий теоретический материал:
Дисассемблирование – это уже не грубый взлом, а ювелирная работа
отмычкой. Пропустив программу через дизассемблер, хакер преобразует
исполняемые модули в запись команд на понятном человеку языке – ассемблере.
По полученной последовательности действий, выполняемых программой, он
определяет точки, в которых происходит проверка ключа. Остальное – дело
техники. Остается лишь отключить проверку, и программа будет работать без
ключей.
Универсальным
методом
противодействия
дисассемблированию
программы является шифрование. Очевидно, что дисассемблирование
зашифрованного кода бесполезно.
Применяя шифрование кода программы для противодействия
дисассемблированию, следует учитывать распространенные ошибки реализации
данного метода. Напомним их. Во-первых, неэффективной является такая
реализация, когда исполняемый код в полном объеме и однократно шифруется /
дешифруется (так как легко найти момент после дешифрования). Во-вторых,
необходимо осуществить выбор эффективного ключа и, если необходимо,
надежно хранить ключ. И в-третьих, следует учесть, что для защиты программ
от дисассемблирования, не рекомендуется использование симметричных
криптографических алгоритмов.
Рекомендуется использовать шифрование с открытым ключом (алгоритм
RSA, шифр Эль-Гамаля и др.). В этом случае возможная удачная попытка
расшифровать код и понять логику работы защитного механизма не позволит
внести изменения в защищенный код, так как для полноценной последующей
работы программы эти изменения необходимо внедрить в код в зашифрованном
виде. А нарушителю доступен лишь ключ для расшифровки. Возможная атака в
данном случае - нахождение «секретного» ключа с помощью трудоемких
математических вычислений в зависимости от используемого алгоритма
шифрования.
Усиливает защиту
расшифровка кода.
динамическое
шифрование
и
многопроходная
На практике неплохо зарекомендовали себя и методы, использующие
вместе с шифрованием архивирование программного кода. К достоинствам
данного метода относят и уменьшение размера исполняемого файла. Однако
1
следует учитывать, что алгоритмы работы широко используемых архиваторов
известны многим взломщикам.
Широко распространены на практике методы, основанные на динамическом
изменении кода программы в процессе выполнения. Суть этих методов сводится
к получению истинных исполнимых команд на этапе выполнения программы
путем некоторого преобразования первоначальных кодов. Часто этот способ
защиты называют самогенерируемыми, или самомодифицирующимися кодами.
Авторы предлагают различные преобразования, например,
 перемещения участков кода;
 всевозможные функции от истинного кода (контрольной суммы
истинного кода);
 или для генерации кода одного участка используют коды предыдущего
(или какого-нибудь другого) участка программы (так называемая
обратная связь).
Интересный прием защиты от дисассемблирования – использование
нестандартной структуры программы. В этом случае дисассемблер «не
поймет» нестандартную сегментацию программы.
Шифрование методом замены (подстановки)
Наиболее простой метод шифрования. Символы шифруемого текста
заменяются другими символами, взятыми из одного алфавита (одноалфавитная
замена) или нескольких алфавитов (многоалфавитная подстановка).
Одноалфавитная подстановка
Простейшая подстановка - прямая замена символов шифруемого
сообщения другими буквами того же самого или другого алфавита.
Примеры таблиц замены:
АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЬЫЪЭЮЯ
МЛДОТВАЧКЕЖХЩФЦЭГБЯЪШЫЗИЬНЮУПСРЙ
АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЬЫЪЭЮЯ
Q W E R T Y U I O P [ ] A S D FG H J K L Z X C V B NM < > @ %
Стойкость метода простой замены низкая. Зашифрованный текст имеет те
же самые статистические характеристики, что и исходный, поэтому зная
стандартные частоты появления символов в том языке, на котором написано
сообщение, и подбирая по частотам появления символы в зашифрованном
сообщении, можно восстановить таблицу замены. Для этого требуется лишь
достаточно длинный зашифрованный текст, для того, чтобы получить
достоверные оценки частот появления символов. Поэтому простую замену
2
используют лишь в том случае, когда шифруемое сообщение достаточно
коротко!
Стойкость метода равна 20 – 30, трудоемкость определяется поиском
символа в таблице замены. Для снижения трудоемкости при шифровании
таблица замены сортируется по шифруемым символам, а для расшифровки
формируется таблица дешифрования, которая получается из таблицы замены
сортировкой по заменяющим символам.
Задание №2. Используя приведенные выше таблицы замены, зашифровать
фразу «Это есть наш последний и решительный бой»
Задание №3. Составить свою таблицу замены и зашифровать с ее
помощью фразу «На всякого мудреца довольно простоты»
Многоалфавитная замена повышает стойкость шифра.
Многоалфавитная одноконтурная обыкновенная подстановка
Для замены символов используются несколько алфавитов, причем смена
алфавитов проводится последовательно и циклически: первый символ
заменяется на соответствующий символ первого алфавита, второй - из второго
алфавита, и т.д. пока не будут исчерпаны все алфавиты. После этого
использование алфавитов повторяется.
Рассмотрим шифрование с помощью таблицы Вижинера - квадратной
матрицы с n2 элементами, где n - число символов используемого алфавита. В
первой строке матрицы содержится исходный алфавит, каждая следующая
строка получается из предыдущего циклического сдвига влево на один символ.
3
Таблица Вижинера для русского алфавита:
АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЬЫЪЭЮЯ
БВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЬЫЪЭЮЯА
ВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЬЫЪЭЮЯАБ
ГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЬЫЪЭЮЯАБВ
ДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЬЫЪЭЮЯАБВГ
ЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЬЫЪЭЮЯАБВГД
ЖЗИЙКЛМНОПРСТУФХЦЧШЩЬЫЪЭЮЯАБВГДЕ
ЗИЙКЛМНОПРСТУФХЦЧШЩЬЫЪЭЮЯАБВГДЕЖ
ИЙКЛМНОПРСТУФХЦЧШЩЬЫЪЭЮЯАБВГДЕЖЗ
ЙКЛМНОПРСТУФХЦЧШЩЬЫЪЭЮЯАБВГДЕЖЗИ
КЛМНОПРСТУФХЦЧШЩЬЫЪЭЮЯАБВГДЕЖЗИЙ
ЛМНОПРСТУФХЦЧШЩЬЫЪЭЮЯАБВГДЕЖЗИЙК
МНОПРСТУФХЦЧШЩЬЫЪЭЮЯАБВГДЕЖЗИЙКЛ
НОПРСТУФХЦЧШЩЬЫЪЭЮЯАБВГДЕЖЗИЙКЛМ
ОПРСТУФХЦЧШЩЬЫЪЭЮЯАБВГДЕЖЗИЙКЛМН
ПРСТУФХЦЧШЩЬЫЪЭЮЯАБВГДЕЖЗИЙКЛМНО
РСТУФХЦЧШЩЬЫЪЭЮЯАБВГДЕЖЗИЙКЛМНОП
СТУФХЦЧШЩЬЫЪЭЮЯАБВГДЕЖЗИЙКЛМНОПР
ТУФХЦЧШЩЬЫЪЭЮЯАБВГДЕЖЗИЙКЛМНОПРС
УФХЦЧШЩЬЫЪЭЮЯАБВГДЕЖЗИЙКЛМНОПРСТ
ФХЦЧШЩЬЫЪЭЮЯАБВГДЕЖЗИЙКЛМНОПРСТУ
ХЦЧШЩЬЫЪЭЮЯАБВГДЕЖЗИЙКЛМНОПРСТУФ
ЦЧШЩЬЫЪЭЮЯАБВГДЕЖЗИЙКЛМНОПРСТУФХ
ЧШЩЬЫЪЭЮЯАБВГДЕЖЗИЙКЛМНОПРСТУФХЦ
ШЩЬЫЪЭЮЯАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧ
ЩЬЫЪЭЮЯАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШ
ЬЫЪЭЮЯАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩ
ЫЪЭЮЯАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЬ
ЪЭЮЯАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЬЫ
ЭЮЯАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЬЫЪ
ЮЯАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЬЫЪЭ
ЯАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЬЫЪЭЮ
Для шифрования необходимо задать ключ - слово с неповторяющимися
символами. Таблицу замены получают следующим образом: строку "Символы
шифруемого текста" формируют из первой строки матрицы Вижинера, а строки
из раздела "Заменяющие символы" образуются из строк матрицы Вижинера,
первые символы которых совпадают с символами ключевого слова.
При шифровании и дешифровании нет необходимости держать в памяти
всю матрицу Вижинера, поскольку, используя свойства циклического сдвига,
можно легко вычислить любую строку матрицы по ее номеру и первой строке.
Стойкость метода равна стойкости метода подстановки, умноженной на
количество используемых при шифровании алфавитов, т.е. на длину ключевого
слова и равна 20*L, где L - длина ключевого слова.
С целью повышения стойкости шифрования предлагаются следующие
усовершенствования таблицы Вижинера:
4
1.
Во всех (кроме первой) строках таблицы буквы располагаются в
произвольном порядке.
2.
В качестве ключа используются случайные последовательности
чисел, которые задают номера используемых строк матрицы Вижинера для
шифрования.
Задание 4. Зашифруйте произвольное сообщение (не менее 40 знаков) с
помощью шифра Вижинера. Ключевым словом является ваша фамилия в
именительном падеже.
Задание 5. Расшифруйте сообщение соседа!!
5
Практическая работа № 7
«Защита программ в оперативной памяти»
Цель работы: Научиться планировать создание новых учётных записей,
создавать локальные учётные записи.
Оказывается, при помощи незатейливого программного инструментария,
имеющегося в арсенале любого запасливого компьютерщика, можно прятать
практически любые файлы внутри обычных изображений формата JPEG. На
языке профессионалов такой способ сокрытия данных называется
стеганографией и является весьма интересной дисциплиной, изучающей технику
скрытой передачи информации путём сохранения в тайне самого факта
передачи.
Для того чтобы приступить к "упаковке" скрываемых данных в недрах
фотоизображений, потребуется операционная система Windows, архиватор
Winrar и, конечно, стойкое желание что-нибудь спрятать. Мы в данной заметке
ограничимся сокрытием двух вордовских документов (Document1.doc и
Document2.doc) в графическом файле с таким же незамысловатым названием
cat.jpg. Приступаем!
Лёгким движением мыши и контекстного меню Windows отправляем
героев дня - Document1.doc и Document2.doc - в архив формата RAR. Например,
в Documents.rar. Для полной надёжности его можно ещё и запаролить, выставив
соответствующую галочку в настройках архиватора.
6
Далее открываем консоль Windows, отыскиваем директорию с
вышеупомянутыми документами, архивом и картинкой, после чего выполняем
объединение файлов cat.jpg и Documents.rar, используя командную инструкцию
copy /b cat.jpg + Documents.rar cat_new.jpg.
Получившийся
графический
файл cat_new.jpg
будет
вполне
работоспособным (в чём можно убедиться лично). Его можно копировать,
отправлять по почте и записывать на компакт-диск - вряд ли кто-то из
посторонних догадается, что в картинке помимо графической информации
скрыта пара документов государственной важности. Единственное, чего не
допускается делать, так это обрабатывать изображение в графическом редакторе,
и всё по той простой причине, что любое вмешательство в файл приведёт к
потере спрятанной информации.
7
Как потом извлечь скрытую информацию? Проще простого: нужно лишь
открыть "засекреченную" фотографию архиватором Winrar и распаковать
спрятанные документы.
Зачет: Предоставить графический файл с присоединенным к нему
текстом.
8
Практическая работа № 8
«Приёмы работы с защищёнными программами»
Цель работы: Научиться планировать создание новых учётных записей,
создавать локальные учётные записи.
Задание 1. Изучить и законспектировать следующий теоретический
материал:
Код Хэмминга
В исходное сообщение добавляется избыточность – контрольные биты
(обозначаются как ε), которые будут контролировать правильность передачи
каждого символа в сообщении. Место расположение контрольных бит в
исходном определяется по формуле
№ ε = 2i , где i = 0,1,2,3,4 и т.д. тогда № ε = 1,2,4,8,16,32,64,128,256 и т.д.
1
2 3 4
5 6 7
8 9 10 11 12 13 14 15 16 17 18
Формула кодового слова такова:
ε0 ε1 а1 ε2 а2 а3 а4 ε3 а5 а6 а7 а8 а9 а10 а11 ε4
Понятно, что количество ε в кодовой последовательности зависит от
количества символов в исходной.
Для построения кодовой последовательности (определения значений
контрольных бит), а также для проверки на стороне получателя используется
проверочная матрица Хэмминга. Матрицы применяются различные, выбор
зависит от количества символов в исходном сообщении.
Например, если у нас исходная последовательность из 4 символов, то ε
будет в количестве 3 и матрица будет (7х3) – высоту матрицы определяет
количество ε.
Н=
0 0 0 1 1 1 1 h0
0 1 1 0 0 1 1 h1
1 0 1 0 1 0 1 h2
ε0 ε1 а1 ε2 а2 а3 а4
1) Построение кодового слова: Рассмотрим на примере
9
Пусть дано информационное слово а = (1 0 0 1)
12 3 4
То предварительно кодовое слово будет выглядеть:
ε0 ε1 1 ε2 0 0 1
Далее определяем значение контрольных бит по формулам (XOR):
ε0 = а1 (+) а2 (+) а4 = 1 (+) 0 (+) 1 = 0
ε1 = а1 (+) а3 (+) а4 = 1 (+) 0 (+) 1 = 0
ε2 = а2 (+) а3 (+) а4 = 0 (+) 0 (+) 1 = 1
Составляем кодовое слово, оно будет называться транспонированное
кодовое слово:
Rt= 0 0 1 1 0 0 1 которое будем передавать
2) На приёмной стороне:
Синдром ошибки вычисляется по формуле:
S = H x Rt , где S- это синдром, H – проверочная матрица Хэмминга, Rt –
принятое транспонированное кодовое слово.
Итак, для того чтобы определить есть ли в принятой последовательности
ошибка мы:
Умножаем матрицу на строку:
h0 0 0 0 1 1 1 1
Н = h1 0 1 1 0 0 1 1 х (0 0 1 1 0 0 1)
h2 1 0 1 0 1 0 1
ε0 ε1 а1 ε2 а2 а3 а4
0*0(+) 0*0 (+)0*1(+) 1*1(+) 1*0(+) 1*0(+) 1*1 = 0
0*0(+) 1*0 (+)1*1(+) 0*1(+) 0*0(+) 1*0(+) 1*1 = 0
1*0(+) 0*0 (+)1*1(+) 0*1(+) 1*0(+) 1*0(+) 1*1 = 0
S = (000) -> Значит
ошибок нет
А если бы нам передали вместо 0011001 что-то вроде 0001001
У нас синдром бы получился:
0*0(+) 0*0 (+)0*0(+) 1*1(+) 1*0(+) 1*0(+) 1*1 = 0
0*0(+) 1*0 (+)1*0(+) 0*1(+) 0*0(+) 1*0(+) 1*1 = 1
1*0(+) 0*0 (+)1*0(+) 0*1(+) 1*0(+) 1*0(+) 1*1 = 1
10
S = (011) -> Значит
есть ошибка
А чтобы определить в каком из символов произошло искажение,
необходимо воспользоваться проверочной матрицей Хэмминга:
Найдём вычисленную комбинацию синдрома (011) в матрице – это третий
символ или а1. 0001001 Можем исправить: так код двоичный то меняем на
противоположное значение 0 -> 1 и получаем верную комбинацию 0011001 .
Итак, кодирование может использоваться для выявления ошибок (для
контроля за целостностью передаваемого сообщения) – помехоустойчивое
кодирование.
Задание 5.:
1. Закодируйте слово 1101 (0010, 1010, 1011, 1001). Запишите решение в
отдельном файле под пунктом 1.
2. Проверьте соответствует ли закодированное слово 1010111 исходному
1101. Запишите решение с помощью матрицы в этом же файле под
пунктом 2.
3. Закодируйте любое слово из 4 символов. Запишите решение в отдельном
файле под пунктом 3.
4. Умышленно сделайте одну ошибку. Передайте слово соседу для
нахождения ошибки.
11
Download