Илья Бизяев, курс «Методы трансляции», ИТМО, 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.