УДК 004.056.53

Разработка метода защиты JavaScript кода на основе рекурсивного прохода АСД

Лейман Александр Константинович – магистрант Алтайского государственного технического университета им. И.И. Ползунова

Гребеньков Александр Александрович – кандидат физико-математических наук, доцент Алтайского государственного технического университета им. И.И. Ползунова

Аннотация: Показана актуальность методов обфускации в целях защиты и оптимизации кода. Приведен алгоритм преобразования исходного кода, который представлен в виде абстрактного синтаксического дерева, позволяющий за один проход такого дерева произвести требуемые преобразования.

Ключевые слова: JavaScript, защита кода от анализа, запутывать, обфускация, абстрактное синтаксическое дерево.

С развитием сети Интернет в определенный момент появилась необходимость его «оживления», обретения им интерактивности. JavaScript зародился в середине 90-х годов прошлого века как ответ на возникшую необходимость. Первой средой размещения для него был веб-браузер, и он по-прежнему является самой распространенной средой. На сегодняшний день JavaScript может обращаться к операционной системе, работать с файлами, отправлять и обслуживать HTTP-запросы, а также включает в себя синтаксис классов и модулей. Этот широкий диапазон возможностей позволяет реализовывать веб-сервисы с большим и сложным объемом функционала. Описанные выше возможности применения JavaScript делают его, пожалуй, самым распространенным языком программирования [3, с. 177].

Важной чертой JavaScript является то, что это – интерпретируемый язык программирования. Это означает, что итоговый программный продукт представляется в виде открытых исходных текстов на стороне клиента, что делает его доступным для любого пользователя. Кроме того, JavaScript код может быть легко прочитан и изменен с помощью инструментов для разработки, таких как браузерные консоли и отладчики. Очевидной является проблема защиты авторских прав владельцев ПО.

На данный момент наиболее актуальными методами защиты js-скриптов от анализа и модификации являются те, которые основаны на преобразовании программного кода к трудночитаемому виду без потери его функциональности, так как они позволяют усложнить процесс реверсивной инженерии кода защищаемого программного продукта. Такой подход называют обфускацией.

Обфускация может применяться на нескольких уровнях [1, с. 23]. Для скриптовых языков с открытым исходным кодом эффективен и наиболее применяем уровень исходных текстов программы.

Основных видов алгоритмов обфускации не так уж много, они подразделяются на [2, с. 60]:

  • лексическую обфускацию;
  • обфускацию данных;
  • обфускацию управления;
  • превентивную обфускацию.

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

Большее количество алгоритмов работы обфускаторов основываются на двух основополагающих алгоритмах. Одним из них является алгоритм Колберга, который определяет последовательность преобразований, но не то, как реализовывать тот или иной метод обфускации. Вторым является алгоритм Chenxi Wang, который строится вокруг графа потока, в который последовательно передаются функциональные блоки.

За основу проектируемого алгоритма был выбран алгоритм Колберга, так как он является более общим, гибким и устойчивым.

Вначале будет получено абстрактное синтаксическое дерево (АСД) исходного кода, которое будет представлять из себя объект в формате JSON.

Корневой узел – это тело программы (body). Каждый его дочерний узел является каким-то кусочком исходного кода с очень подробным описанием. Например, сначала будет идти объявление переменной, тип которой хранится в узле «kind», а значение равно строке и хранится в узле «StringLiteral». Затем оператор выражения, который является строкой. Затем идет объявление функции, имя которой находится в узле «Identifier» → «name», внутри также могут быть различные выражения, например, вызов метода у объекта или, например, конструкция switch case (рисунок 1).

Далее все преобразования будут производиться с узлами данного дерева.

Для работы с данным АСД была разработана функция рекурсивного прохода. Данная функция позволяет произвести все преобразования за один проход в глубину (Depth First Search).

Такой подход позволяет сделать JavaScript код непонятным для человека и затруднить его чтение и изменение злоумышленником. Кроме того, он не нарушает функциональность кода и не вызывает ошибок при выполнении.

image001

Рисунок 1. Структура АСД программы.

Алгоритм обфускации АСД:

  1. Начать обход дерева с корневого узла.
  2. Для каждого узла дерева проверить, является ли он переменной или функцией.
  3. Если узел является переменной или функцией, то заменить его имя на результат хеширования текущего имени.
  4. Если узел является строковым литералом, то произвести кодировку его значения;
  5. Если узел является оператором, то рекурсивно обойти его потомков и повторить шаги 2-4 для каждого из них.
  6. Если узел является литералом (кроме строкового), то пропустить его и перейти к следующему узлу.
  7. После завершения обхода дерева, полученный обфусцированный код вернуть в качестве результата.

Данный алгоритм отражен в виде UML диаграммы ниже (рисунок 2).

image002

Рисунок 2. Алгоритм прохода по дереву.

Следующим логичным шагом будет являться реализация разработанного алгоритма преобразования АСД. А также разработка пользовательского интерфейса в виде веб-сервиса.

Список литературы

  1. Ивченкова Ю. С. Виды и способы обфускации / Ю. С. Ивченкова, М. К. Савкин // Электронный журнал: наука, техника и образование, 2016. – № 2 (6). – С. 60-66.
  2. Казанцева А. И. Методы обфускации программного кода / А. И. Казанцева, Т. А. Маркина // Сборник трудов VIII научно-практической Конференции молодых ученых «вычислительные системы и сети (майоровские чтения)». – Санкт-Петербург: Университет ИТМО, 2017. – С. 39-42.
  3. Флэнаган Д. JavaScript. Полное руководство, 7-е изд.: Пер. с англ. – СПб. : ООО “Диалектика”, 2021. – 720 с .: ил. – Парал. тит. англ.

Интересная статья? Поделись ей с другими: