Skip to content

Latest commit

 

History

History
56 lines (48 loc) · 3.3 KB

README.md

File metadata and controls

56 lines (48 loc) · 3.3 KB

Лабораторная работа №3. Использование автоматических генераторов анализаторов Bison и ANTLR

Вариант 6. Обфускация [Java, ANTLR]

Илья Бизяев, курс «Методы трансляции», ИТМО, 2019

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

Выберите подмножества языка C++, Java или Pascal и напишите обфускатор для программ данного подмножества. Обфускатор должен заменять имена переменных на случайные строки из символов I, 1, O и 0, которые являются корректными идентификаторами и в случае одинаково выглядящих символов I – 1 и O – 0, соответственно, выглядеть одинаково. Также обфускатор должен вставлять в различные места программы незначащие действия с переменными, которые затрудняют понимание программы, в том числе добавлять новые переменные. Пример:

var
    a, b : integer;
begin
    read(a, b);
    writeln(a + b);
end.

Вывод:

var
    I010, IOI0 : integer;
    I01O : integer;
begin
    read(I010, IOI0);
    I01O := IOI0;
    writeln(I010 + IOI0);
end.

Решение

Данное решение представляет собой обфускатор подмножества языка Java. Поддерживается базовый синтаксис объявлений, инициализация массивов, доступ к методам и полям классов, унарные и бинарные операторы, строковые и десятичные числовые литералы, ветвление с помощью if/else, циклы while.

Сборка и использование программы

Структура программы

  • Main.java — точка входа программы. Принимает 2 аргумента командной строки: путь к исходному файлу и путь для записи результата обфускации.
  • JavaObfuscatingVisitor.java — собственно обфускатор, реализованный в виде шаблона visitor. Заменяет имена локальных переменных, добавляет лишние переменные и операции над ними; попутно форматирует код.
  • JavaBasic.g4 — грамматика указанного подмножества Java. Корневое правило — compilationUnit.

Перед сборкой необходимо сгенерировать лексер, парсер и интерфейс visitor с помощью ANTLR.

Зависимости
Решение использует только стандартную библиотеку Java и ANTLR 4, протестировано с Java 11 и ANTLR 4.8.