Zelix KlassMaster - дорогой обфускатор для Java-приложений. Но действительно ли это стоит своей цены?

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

Я решил скрыть пример класса с настройками обфускации потока, установленными на «extraAggressive», и впоследствии проанализировать изменения.

Теперь давайте подробнее рассмотрим байт-код. Я использую графическое представление потока управления JByteMod для анализа изменений, внесенных ZKM.

Как видите, ZKM добавил в код переходы, которые усложнили структуру графа. Он также создал нежелательное поле в ExampleClass.class (boolean a.b) и еще одно в основном классе (int MainMethod.f).

Каждый отдельный переход, который ZKM добавляет в байт-код, использует операцию if, которая никогда не приводит к переходу. Другими словами, ребра графа, которые никогда не используются.

iload 1 - load local variable 1 (false)
ifne ? - if not equals zero, jump

Довольно простая концепция, но, тем не менее, очень эффективная.

Наконец, ZKM добавляет код перед кодом операции возврата, который изменяет значение поля нежелательной почты (a.b), но также окружает его оператором if, который никогда не является истинным (если f! = 0). Чего этим хочет добиться ZKM? Вы можете легко проверить поля, которые никогда не меняются, и встроить их в код, и большинство декомпиляторов автоматически удалит возникающие избыточные переходы.

После удаления вручную всех ненужных тегов ifne декомпилятор снова может выводить его в удобочитаемом виде.

Как видите, код снова выглядит почти так же, как и исходный код.

Спасибо за чтение!