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

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам
62
В языке Python удобно организована работа со строками. Во-первых, благодаря
тому, что он позволяет выбрать сразу из трех стратегий:
1. Использовать существующую библиотеку, поддерживающую
специфический язык. Этот вариант подходит для широко
распространенных языков, например, XML. Хорошая библиотека
обычно включается в себя API, позволяющий создавать и изменять
содержимое исходных документов.
2. Создать собственный парсер. Обычно эту стратегию выбирают, если
существуют какие-либо потребности, которые не могут
удовлетворить стандартные решения (низкая скорость обработки,
недостатки реализации, утечки памяти и т.д.) или язык не является
широко распространенным.
3. Использовать инструмент или библиотеку, позволяющую
генерировать парсер. Например, библиотека ANTLR позволяет
создавать парсеры для любого языка [26]. Этот вариант является
наиболее гибким и минимальным по времени, затраченном на
разработку инструмента.
Во-вторых, при обработке текста неизбежно происходит много выделений
памяти, ее переадресаций и так далее. За счет того, что Python является
динамическим языком программирования, про сложности с управлением памятью
можно забыть. В-третьих, в Python существуют генераторы, которые удобно
использовать на больших объемах информации. Генератор – это функция, которая
ведет себя как итератор, т.е. возвращает только один элемент в каждый момент
времени. Это позволяет повысить производительность при обработке обширной
исходной информации.
Следующим шагом стоит выбор инструмента для токенизации текста. Из
описанных выше стратегий для данной задачи больше всего подходит комбинация
63
второго и третьего подхода: синтаксис языка достаточно хорошо стандартизирован,
а вот преобразования будут написаны самостоятельно [27]. Токенизатор (tokenizer)
или лексер (lexer) – это программа, которая принимает на вход строку символов и
разделяет ее на токены. Токен – это подстрока, которая имеет какое-либо
семантическое значение в рамках грамматики языка. Токенами могут являться:
скобки
строки
операторы
ключевые слова
названия переменных
Токен – это инструмент низкого уровня абстракции. Один и тот же токен может
иметь разные значения в разных контекстах. Например, в строке “[1]” “[“ является
частью объявления списка, в то время как в строке “a[1]” “[“ является частью т.н.
«среза» (slice).
В качестве токенизаторов в языке Python можно использовать:
регулярные выражения с захватами групп
абстрактные синтаксические деревья
лексические токенизаторы (например, tokenize).
Рассмотрим каждую из стратегий подробнее.
В общем случае, написание корректных регулярных выражений [28] для
токенизации такой информации, как исходный код, является достаточно сложной
задачей. На Лист. 13 приведен пример регулярного выражения, которое находит все
строки, содержащие текст “def ”, который является идентификатором начала тела
функции в языке Python. Однако это же регулярное выражение отметит как начало
функции строку “undef + 1”, хотя оно таковым не является. Еще одной сложностью
являются проверки на корректность открывающих и закрывающих скобок и
шаблоны для генерирования функций внутри строк (регулярные выражения сложно
64
настроить так, чтобы они учитывали предыдущий контекст, и такие случаи
использования языка они буду считать не шаблонами, а полноценными функциями)
Лист. 13. Пример регулярного выражения для определения начала тела функции
языка Python
Абстрактные синтаксические деревья, на примере библиотеки ast языка Python
[29], отлично справляются с определением корректности скобочных структур, но
требуют за это достаточно высокую плату: код, принимающийся на вход, обязан
быть корректным в рамках синтаксиса языка Python. Незаконченный или
синтаксически неправильный код вызовет ошибки. Это, как и в случае с
регулярными выражениями, накладывает запрет на использование в коде строк-
шаблонов для динамической генерации кода.
Также в модуле ast существует особенность: если парсер находит избыточные
скобочные структуры, например, выражение, завернутое в два уровня круглых
скобок, на выходе он оставит только один уровень. Это кажется логичным, но только
до тех пор, пока такое выражение не является необходимым.
Лексические токенизаторы, такие как tokenize [30], справляются со всеми
вышеперечисленными случаями. Они не проверяют валидность кода для
кодогенерации, воспринимая его исключительно как отдельную строку. Также
tokenize может обрабатывать незаконченный или синтаксически некорректный код.
В качестве инструмента для сжатия выбрана библиотека zlib, позволяющая
сжимать данные с помощью gzip [31]. Согласно независимому бенчмаркам [32] [33]
[34], сжатие с помощью gzip занимает как минимум в два раза меньше времени, чем
с помощью других популярных алгоритмы, а распаковка занимает до десяти раз
меньше времени.
>>> import re
>>> FUNCTION = re.compile(r'def ')
65
Защита ПО выполняется с помощью библиотек PyСrypto и Cython. PyСrypto [35]
предоставляет набор криптографических модулей, реализующих различные
алгоритмы и протоколы. Cython это оптимизированный статический компилятор
[36] , который принимает на вход модули на языке Python и транслирует их в
высокопроизводительные файлы на языке C. Получившиеся файлы могут быть легко
скомпилированы в бинарные библиотеки. Когда код скомпилирован, нет ни одного
способа транслировать получившиеся файлы в читаемый код на языке Python.
Python
Высокоуровневый интерпретируемый динамический
язык общего назначения. Популярное решение для
NLP-подобных задач (задач по обработке текста)
PyCrypto
Набор криптографических модулей, реализующих
различные алгоритмы и протоколы шифрования.
Используется для шифрования текста
Cython
Оптимизированный статический компилятор
модулей языка Python в файлы на языке C, которые в
свою очередь могут быть скомпилированы в
бинарные библиотеки
tokenize
Лексический анализатор. Может корректно
воспринимать и обрабатывать текст, который
является незаконченным или синтаксически
некорректным кодом
shutil
Модуль языка Python, предоставляющий ряд
высокоуровневых операций над файлами или их
коллекциями, такие как копирование, удаление и т.д.
66
argparse
Модуль языка Python, упрощающий разработку
консольных интерфейсов (Command-line-interfaces,
CLI). Программа определяет, какие аргументы
обязательны для запуска, argparse определяет, как их
распознать в переменной sys.argv. Модуль также
может автоматически создавать подсказки (help, man)
и другие сообщения для пользователя и показывать
ошибки при использовании некорректных
аргументов запуска
base64
Предоставляет набор функций для кодирования и
декодирования информации в кодировках,
специфицированных RFC 3548 (Base16, Base32,
Base64, Ascii85, Base85)
green
Модуль языка Python, контролирующий работу
тестов
zlib
Библиотека языка Python, предоставляющая набор
инструментов для сжатия и декомпрессии данных
Табл. 3. Список основных инструментов, используемых в проекте
Комбинация представленных в Табл. 3 инструментов позволит создать систему,
сжимающую и шифрующую исходный код с последующей упаковкой его в
исполняемые файлы, значительно затрудняющие обратную разработку исходного
программного обеспечения.
67
3.2. Практическая реализация
3.2.1. Структура ПО
Созданное ПО состоит из нескольких модулей:
1. обфускатор
2. минификатор
3. инструмент для сжатия
4. шифратор
5. упаковщик.
На вход программе подается файл с исходным кодом на языке Python, который
в последствие проходит через все эти модули. На Рис. 12 наглядно показан цикл
работы программного обеспечения по преобразованию исходного кода.
Сначала исходный код попадает в обфускатор, который заменяет названия
переменных, классов и функции на не имеющие смысловой нагрузки.
Затем полученный текст попадает в минификатор, который редуцирует
многострочные конструкции, такие как ветвление, некоторые функции и
многострочные литералы. Также этот модуль удаляет строки с документацией и
прочие объекты, не относящиеся напрямую к выполнению кода.
Далее текст попадает в инструмент для сжатия: здесь код программы сжимается
архивирующим удалением, и наконец пакуется в файл упаковщиком.
68
Рис. 12. Цикл преобразования кода в созданном программном обеспечении
Исходный код
Обфускатор
Минификатор
Инструмент для
сжатия
Упаковщик
Упакованные и
зашифрованные
бинарные файлы
69
3.2.2. Особенности реализации
Спецификой обфускации и минификации обусловлено предварительная
токенизация исходного кода. Для этого написан метод, принимающий на вход текст,
преобразующий его в многоуровневый список токенов (Лист. 14):
Лист. 14. Преобразование исходного кода в многоуровневый список токенов
Это сделано для того, чтобы всегда иметь ввиду не только соседние токены, но
и контекст предыдущих строк, что важно при использовании таких синтаксических
конструкций как многострочные строки, комментарии, объявления переменных и
функций.
Обфускация реализована классом с набором методов, специфичных для разных
типов токенов и хранилищем подстановок (Рис. 13).
def listified_tokenizer(source):
io_obj = io.StringIO(source)
return [
list(a) for a in
tokenize.generate_tokens(io_obj.readline)]
70
Рис. 13. Три типа обфускаций, используемых в работе
Благодаря этому модуль обфускации:
легко расширяем и изменяем (в любой момент можно добавить
новые типы обфускаций)
сохраняет свою прозрачность
имеет общую базу подстановок, чтобы избежать коллизий в
переименованиях
Минификация тоже достигается за счет гранулированных преобразований (Рис.
14):
Обфускация
Хранилище подстановок
Обфускация переменных
Обфускация классов
Обфускация функций
71
Рис. 14. Минификация реализована поэтапно
Удаление комментариев
Удаление строк документации
Редуцирование многострочных конструкций языка
Сокращение пустых методов
Объединение многострочных объявлений в одно
Удаление пустых строк
Редуцирование операторов

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

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