Диплом: Алгоритмы упаковки и шифрования исполняемого кода

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам
52
Лист. 7. Исходный код с добавлением ранее неиспользуемых секций и переменных
Непрерывное преображение исходного кода программы не позволяет создать
универсальную сигнатуру для данного образца ПО в целях, например, антивирусной
защиты [18]. На сегодняшний день самой популярной стратегией противодействия
полиморфизму исходного кода являются эвристический анализ и эмуляция [19].
Однако эвристический анализ и эмуляция не могут гарантировать 100%
Start:
GOTO Decryption_Code
Encrypted:
...
lots of encrypted code
...
Decryption_Code:
C = C + 1
A = Encrypted
Loop:
B = *A
C = 3214 * A
B = B XOR CryptoKey
*A = B
C = 1
C = A + B
A = A + 1
GOTO Loop IF NOT A = Decryption_Code
C = C^2
GOTO Encrypted
CryptoKey:
some_random_number
53
обнаружения полиморфных вредоносных программ, в связи с чем рекомендуется
использование HIPS (Host-based Intrusion Prevention System) проактивных
технологий защиты, построенных на анализе поведения.
2.2.3. Обфускация
Обфускацией называют процесс применения ряда преобразований над
исходным текстом или кодом к виду, сохраняющему всю его функциональность, но
затрудняющему его анализ, понимание переменных, механизмов работы, обратную
разработку и модификацию при декомпиляции. Обфускация может производиться
на уровне алгоритма, исходного текста или ассемблерного кода (с помощью
специализированных компиляторов, использующих неочевидные или
недокументированные возможности среди выполнения).
Среди предпосылок к появлению обфускации можно отметить существование
декомпиляторов на разных платформах (например, Java, Android или .NET), которые
могут производить обратную разработку исполняемого кода или библиотеки [20].
Главным преимуществом обфускации в этой ситуации является запутанность
декомпилированного кода, что позволяет защищать коммерческие тайны, усложняя
дальнейшую обратную разработку и делая ее экономически невыгодной. Иногда
обфускация помогает уменьшить размер финального исполняемого кода.
Среди основных недостатков обфускации стоит отметить тот факт, что она не
обязательно делает невозможными возможности прочтения, изменения или
обратной разработки кода. К другим недостаткам можно отнести:
потерю гибкости кода – после обфускации он может стать более
зависимым от платформы или компилятора
трудности отладки. Обфускаторы не только не дают постороннему
выяснить, что делает код, но и не дает самому разработчику его
54
отлаживать, поэтому при отладке кода обфускаторы часто
выключают.
недостаточная безопасность. Несмотря на то, что обфускация
помогает сделать распределенную систему более безопасной, она
лишь декларирует принцип «безопасность через неясность».
Обфускаторы не гарантируют сложности декомпиляции и не
обеспечивают безопасность на уровне криптографических систем.
ошибки в обфускаторах. Как и в любой другой сложный
программный комплекс, несмотря на проектирование и тестирование,
в обфускаторах могут содержаться ошибки такие, что пропущенный
через них код вообще не будет работать.
вызов класса по имени – большинство современных языков с
промежуточным кодом могут вызывать или создавать объекты по
именам их классов. Обфускаторы позволяют сохранить указанные
классы от переименования, однако подобные ограничения сокращают
гибкость программ.
Обфусцирующие преобразования приведены в Табл. 2.
замена названий переменных и
функций, например:
final_cost[positions] 
f5rq[zlp],
также приведено на Лист. 8 и Лист. 9
включает в себя изменение и создание
новых типов данных, и применение к
ним комбинаторики. Например, число 9
можно представить, как 10000000001
55
(количество нулей), 210019 (двоичное
число между идентификаторами начала
и конца), 32 (
) и так далее.
Нарушение естественного хода
программы, для чего используются
непрозрачные предикаты. Результат
исполняемых действий трудно
предугадать в ходе заданной процедуры.
Это может быть создание
дополнительных блоков кода: в одном
выполняются вычисления, в другом
происходит наследование, а в каком-то
общем — несколько ложных операций,
лишь одна из которых действительная.
Защищает код от деобфускации
специальными программами-
деобфускаторами. Они основываются
на обнаружении неиспользуемых
кусков кода, нахождении наиболее
сложных структур (фрагментов
максимальной важности) и анализе
статистических и динамических
данных.
Табл. 2. Виды обфусцирующих преобразований
56
Лист. 8. Код до лексической обфускации
Лист. 9. Код после лексической обфускации
2.2.4. Самомодифицирующийся код
Самомодифицирующийся код – программный приём, при котором приложение
самостоятельно создает (кодогенерация) или изменяет часть своего программного
кода во время выполнения [21]. Методология существует в двух вариантах:
модификация при инициализации проводится один раз, перед
запуском изменяемого кода
модификация кода «на лету» подразумевает изменение состояния
программы по время исполнения.
int counter;
bool alarm;
for (counter = 0; counter < 100; counter++)
{
if (counter == 99)
{
alarm = true;
}
}
int plf5ojvb; bool jht4hnv; for(plf5ojvb=0; plf5ojvb<100;
plf5ojvb++){if(plf5ojvb==99) jht4hnv=true;)
57
В обоих случаях изменение проходит непосредственно в машинном коде, когда
новые инструкции перезаписывают старые. Самомодифицирующийся код можно
применять:
в критичных к безопасности местах для усложнения исследования
кода (полиморфные вирусы, некоторые типы защиты от
копирования, упаковщики и т. д.).
в критичных к скорости местах для ускорения работы. Так,
например, во время исполнения можно уменьшить длину
критического пути исполнения.
для включения/отключения во время исполнения некоторой
функциональности для тестирования или отладки. Например, в ОС
Linux при использовании отладочных инструментов в некоторые
места кода ядра или программ вставляются последовательности
инструкций nop. При включении инструмента некоторые из этих
последовательностей заменяются на безусловный переход на
процедуру отладки.
в ядре Linux для отключения частей ядра, не нужных в данном
окружении. При загрузке Linux определяет, исполняется ли он на
SMP или на однопроцессорной машине. Во втором случае часть
примитивов синхронизации удаляется из кода ядра.
2.3. «Ненормальное» программирование
Помимо «стандартных» методов изменения исходного кода, можно
использовать менее традиционные, такие как каррирование, перегрузка операторов
и другие.
58
Каррированием называется преобразование функции от многих аргументов в
функцию, принимающую свои аргументы по одному.
Лист. 10. Функция на языке Python, реализующая суммирование через анонимную
функцию
Лист. 11. Каррированная функция на языке Python
На Лист. 10 и Лист. 11 показаны каррированная и некаррированная функции
суммирования на языке Python. С точки зрения того, что в языке Python любая
функция является объектом, это позволяет написать универсальную функцию
высшего порядка (т.е. принимающую на вход и возвращающую другие функции) для
генерации каррирующих функций из обычных [22].
Стандартная «перегрузка» операторов предполагает предсказуемую логику
поведения, но использование нестандартных типов аргументов (Лист. 12) [23].
Однако ничто не мешает «перегрузить» оператор «++» для вычитания, а «--» — для
сложения, а также использовать более сложные преобразования и подмены чтобы
запутать специалиста, читающего этот код впервые.
sum_x_y = lambda x, y: x + y
print(sum_x_y(1, 2)) # 3
sum_x_y_carry = lambda x: lambda y: sum_x_y(x, y)
print(sum_x_y_carry(5)(12)) # 17
59
Лист. 12. Стандартная перегрузка оператора "++" в C++ для класса Point
В Глава 2. приведен обзор современных методологий упаковки и шифрования
исполняемого кода.
Метод сжатия может быть или статистическим, или трансформирующим и
обрабатывать данные либо поточно, либо блоками, причем:
чем больше и однороднее данные и память1, тем эффективнее
блочные методы;
чем меньше и неоднороднее данные и память, тем эффективнее
поточные методы;
чем сложнее источник, тем сильнее улучшит сжатие оптимальная
преобразование;
class Point
{
int x, y;
public:
Point(int x, int xx): x(x), y(xx) {};
}
Point& Point::operator++() { // префиксный
x++;
y++;
return *this;
}
Point Point::operator++(int) { // постфиксный
Point tmp(x,y);
++(*this);
return tmp;
}
60
чем проще источник, тем эффективнее прямолинейное
статистическое решение (математические модели "источник
Бернулли" и "источник Маркова").
В основе всех методов сжатия лежит простая идея: если представлять часто
используемые элементы короткими кодами, а редко используемые - длинными
кодами, то для хранения блока данных требуется меньший объем памяти, чем если
бы все элементы представлялись кодами одинаковой длины. Методы сжатия могут
строить модель источника адаптивно по мере обработки потока данных или
использовать фиксированную модель, созданную на основе априорных
представлений о природе типовых данных, требующих сжатия.
Ни один компрессор не может сжать любой файл. После обработки любым
компрессором размер части файлов уменьшится, а оставшейся части - увеличится
или останется неизменным.
Шифрование применяется для хранения и передачи важной информации в
ненадежной и/или небезопасной среде. Принимающей стороне необходимы ключ и
дешифратор, чтобы узнать зашифрованную информацию. Преобразования
исходного кода с помощью обфускации, мутации и других приемов могут быть
ненадежными или затруднять разработку продукта программисту.
В Глава 2. проанализированы методы упаковки кода, введена классификация
алгоритмов сжатия. Рассмотрена история технологии и приведены примеры
современных инструментов.
Дан обзор классических методов шифрования и их классификация, приведены
нестандартные стратегии «запутывания» кода. Проанализирована применимость тех
или иных стратегий на практике.
61
ГЛАВА 3. РАЗРАБОТКА ПО ДЛЯ ШИФРОВАНИЯ И
УПАКОВКИ ИСХОДНОГО КОДА
3.1. Выбор инструментов
Основной задачей целевого программного обеспечения является обработка и
процессинг текстовой информации, поэтому главный инструмент (язык разработки)
должен хорошо справляться со своей задачей. Целевой код должен быть:
легко читаемым
поддерживаемым
тестируемым
интерпретируемым
написан на современном языке с использованием современных
библиотек
Все эти свойства в себе сочетает язык Python версии 3.5 и выше. Python – это
высокоуровневый интерпретируемый динамический язык общего назначения [24].
Одним из ориентиров этого языка является прозрачность и понятность кода. Также
в языке Python большая стандартная библиотека, что позволяет в большинстве
случаев не использовать сторонние библиотеки. Для многих задач, связанных с
обработкой текста, классификацией объектов или машинным обучением, Python
является наиболее оптимальным выбором, так как для этих задач код на языке Python
выглядит гораздо компактнее, чем на C++ или Java. Python – кросс-платформенный
язык, что означает, что большинство библиотек (за исключением тех, которые
используют специфические особенности определенных операционных систем), а
значит, и большинство программ, написанных на этом языке будут работать с
одинаковым успехом и на Unix-подобных системах (Linux, MacOS и другие), и на
Windows [25].

Смотрите также:

"Автоматизация обработки заявок ООО "Проектно-Строительная Компания"
"Автоматизация процесса аттестации персонала для ООО "Нэт Бай Нэт Холдинг"
"Анализ интернет-активности конкурентов ( на примере конкурентов "Газпром нефть")
"Бухгалтерский учёт и аудит расчётов с подотчётними лицами в организации на примере ООО "ЛОЦ 10""
«Психологическое сопровождение персонала в организации на примере ООО «Крокус»
Cовершенствование деловой оценки персонала в организации (на примере ООО "Даймонд кейтеринг развитие")
IPO - инструмент финансирования деятельности организации. На примере ПАО «Нефтяная компания «Лукойл»
PR как средство продвижения организации (на примере ПАО "Тамбовский завод "Комсомолец им. Н.С. Артемова")
PR-коммуникации в сфере общественного питания (на примере кафе-кондитерской «Cream Cheese»)
SMM как средство повышения эффективности работы учреждений социокультурной сферы (на примере Малого театра)