Javenue logo

Javenue

Программирование на Java

Информационные технологии

Обфускация Java кода - обзор шифраторов байт-кода

Шифратор, на наглийском - obfuscator, - это программа, которая в большей или меньшей мере изменяет байт-код или исходный код Java приложения. В этой статье:


Декомпиляция Java класса

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

Наверное, самый известный декомпилятор - это JAD. С его помощью можно быстро получить исходный код достаточно крупных приложений, написанных на Java. Чтобы усложнить reverse engineering ваших классов необходимо воспользоваться программой-обфускатором.

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

  • базовая обфускация;
  • обфускация хода выполнения программы;
  • структурная обфускация;

Базовые способы обфускации

Первый вид шифраторов изменяет структуру программы следующими способами: переименовыванием идентификаторов и удалением информации отладчика. При чем изменение идентификаторов имеет место при работе как с исходным кодом программы, так и с 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). Добиться этого можно изменением принципов наследования. Например, в иерархии можно создать несколько промежуточных классов. Популярным является разбиение классов на несколько частей.

Кстати, разбиение на части можно применить и для массивов. В добавок можно кодировать символы строковых констант и переменных, чтоб уже наверняка всех запутать :).

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

Обфускатор ProGuard

Одним из самых известных обфускаторов является ProGuard. Изначально это была библиотека для оптимизации кода, поэтому он не настолько мощный как некоторые платные обфускаторы на подобии Stringer. Но в сочетании с тем же Stringer'ом благодаря ProGuard можно добиться просто нереально крутых результатов.

ProGuard позволяет делать следующее:

  • минификация и сжатие скомпилированного кода;
  • непосредственно обфускация;
  • обнаружение и удаление ненужного кода;
  • оптимизация кода.

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

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


Комментариев: 0

  Выйти

  * для публикации комментариев нужно