Слайд 3Декомпиляция
Трансляция исполняемого кода в исходный.
Возможна благодаря:
Массе лишней информации об оригинальном коде в
скомпилированной проге
Однотипности языков в\у
Информации о компиляторе
Наличию промежуточных кодов
Слайд 4Цели декомпиляции
- Поддержка кода
- Обеспечение безопасности
- Обратная разработка
Слайд 5Декомпиляторы Java
“Jad” Java-декомпилятор
“Cavaj” Java-декомпилятор
“Mocha” Java-декомпилятор
“DeCafePro” от DeCafe, Франция
“SourceTech Java-декомпилятор” от SourceTech Corp
“SourceAgain” от Ahpah Сorp
“Class Cracker” от Mayon Software, Австралия
“IceBreaker” от BreakerTech corp, Великобритания
“NMI Java-декомпилятор” от NMI
DJ Java Decompiler - декомпилятор Java-классов.
Слайд 6Обфускация
Запутывание кода программы с целью осложнения декомпиляции.
Возможна на уровнях:
Алгоритма
Исходного текста
Машинных кодов
Слайд 7Обоснованность обфускации
Время на понимание > времени актуальности алгоритма
Цена обфускации > цены продукта
Слайд 8Методы обфускации
- Переименование методов, переменных и т.д. в набор бессмысленных символов.
Например: метод
GetPassword() после обфускации будет иметь имя KJHS92DSLKaf().
Проблема: многие декомпиляторы, встречая на своем пути подобного рода имена, заменяют их наболее осмысленные (method_1, method_2), тем самым сводя всю работу обфускатора на нет.
Слайд 9- Переименование в более краткие имена или использование порядковых номеров вместо имён
Например:
метод GetConnectionString() -> 0().
- Использование для имен переменных нечитаемых символов.
- Использование имен, меняющих смысл.
Например, класс SecurityInformation с методом GetInformation станет классом Car с методом Wash.
Слайд 10- Изменение местоположения данных: объединение нескольких сущностей в одну или разделение одной
сущности на несколько. Например: две строки могут быть объединены в массив строк.
- Замена статических членов на вызовы методов.
- Добавление неиспользуемых данных.
- Изменение способа хранения данных.
- Выполнение финализации (finalization).
Слайд 11- Преобразование вычислений, вставка в алгоритмы ложных условий.
- Удаление или добавление абстракций
кода
Например: замена вызова какой-либо функции непосредственно телом функции, или наоборот – замена одной функции на несколько маленьких функций.
- Перемешивание случайным образом линейных участков.
Таким образом, обфускатор часто является оптимизирующим компилятором.