Несколько дней новогоднего волшебства:
Успейте начать обучение в 2018-ом году со скидкой до 30%!
Выбрать курс

X-files в Java: обфускация и виды шифраторов

Java_Deep_12-5020-17c8a3.10_site.png

Вы же знаете, что jar-файл это zip-архив? То есть, его можно unzip -d target my.jar распаковать и достать все class-файлы. А каждый class-файл это bytecode, который легко-легко можно декомпилировать и получить весь ваш проект с именами всех ваших классов и их переменных и методов. И кодом методов. То есть, совсем всё можно из jar-файла получить. Если, конечно, он не обфусцирован.

Давайте рассмотрим базовые способы обфускации

источник

Первый вид шифраторов изменяет структуру программы переименовыванием идентификаторов или удалением информации отладчика. При чём изменение идентификаторов имеет место при работе как с исходным кодом программы, так и с Java байт-кодом. В случае с изменением байткода необходимо запустить некоторую утилиту, которая изменит папку со скомпилированными классами либо jar-файл.

А вот добиться изменения исходного кода можно даже простым рефакторингом в IDE. Например, двумя переименованиями можно превратить понятный класс:

public class Configuration {
    public String getHttpPort() {
        ...
    {
}

...
// место вызова
Configuration c = new Configuration();
String port = c.getHttpPort();

в следующую непонятную писанину:

public class a {
    public String b() {
        ...
    }
}

...
// место вызова
a c = new a();
String port = c.b();

При компиляции java-классов компилятор может сохранять отладочную информацию, которую можно использовать, например, для удалённой отладки приложения. По-умолчанию javac сохраняет информацию о номерах строк исходного файла и самом исходном файле, а имена локальных переменных не сохраняются.

Отключить сохранение debug-информации можно с помощью опции -g:none. Пример:

javac -g:none MyClass.java

Вы, наверное, уже догадались: перечисленные выше способы, объеденённые вместе, — это самый простой способ шифровки. Он во многом затрудняет понимание кода взломщиком, но логика работы приложения абсолютно никак не скрывается.

Продвинутые способы обфускации

Второй вид шифраторов изменяет ход выполнения программы (flow obfuscation). Чаще всего при этом «страдают» конструкции выбора (например, if и switch) и циклов (например, for и while). Байткод стараются изменить так, чтобы он не имел прямых аналогов в языке Java, что значительно усложняет работу взломщиков.

Наконец, третий вид шифраторов изменяет структуры данных (structural obfuscators). Добиться этого можно изменением принципов наследования. Например, в иерархии можно создать несколько промежуточных классов. Популярным является разбиение классов на несколько частей. Кстати, разбиение на части можно применить и для массивов. В добавок можно кодировать символы строковых констант и переменных, чтоб уже наверняка всех запутать.

Шифраторы структур данных — наиболее надёжный вид шифраторов. Использование второго и третьего способа шифрования вместе настолько усложняет код программы, что восстановление оригинального кода становится практически невозможным.

На заметку

Кстати, обфускацию любят не только секретные службы, но и разработчики мобильных приложений. Казалось бы, а им зачем? Просто jar-файл после обфускации становится меньше в размере, ведь длинных имён классов и методов в нём нет.

А чем ещё может быть полезна обфускация? Пишите в комментариях!

Автор
0 комментариев
Для комментирования необходимо авторизоваться