HTML Diff
0 added 0 removed
Original 2026-01-01
Modified 2026-03-10
1 <p>Теги: java, zip, jar, bytecode, flow obfuscation, structural obfuscators, обфускация, шифраторы, javac, шифраторы структур данных</p>
1 <p>Теги: java, zip, jar, bytecode, flow obfuscation, structural obfuscators, обфускация, шифраторы, javac, шифраторы структур данных</p>
2 <p>Вы же знаете, что<strong>jar</strong>-файл это<strong>zip</strong>-архив? То есть, его можно unzip -d target my.jar распаковать и достать все<strong>class</strong>-файлы. А каждый<strong>class</strong>-файл это<strong>bytecode</strong>, который легко-легко можно декомпилировать и получить весь ваш проект с именами всех ваших классов и их переменных и методов. И кодом методов. То есть, совсем всё можно из<strong>jar</strong>-файла получить. Если, конечно, он не обфусцирован.</p>
2 <p>Вы же знаете, что<strong>jar</strong>-файл это<strong>zip</strong>-архив? То есть, его можно unzip -d target my.jar распаковать и достать все<strong>class</strong>-файлы. А каждый<strong>class</strong>-файл это<strong>bytecode</strong>, который легко-легко можно декомпилировать и получить весь ваш проект с именами всех ваших классов и их переменных и методов. И кодом методов. То есть, совсем всё можно из<strong>jar</strong>-файла получить. Если, конечно, он не обфусцирован.</p>
3 <h2>Давайте рассмотрим базовые способы обфускации</h2>
3 <h2>Давайте рассмотрим базовые способы обфускации</h2>
4 <p><em><a>источник</a></em></p>
4 <p><em><a>источник</a></em></p>
5 <p>Первый вид шифраторов изменяет структуру программы переименовыванием идентификаторов или удалением информации отладчика. При чём изменение идентификаторов имеет место при работе как с исходным кодом программы, так и с Java байт-кодом. В случае с изменением байткода необходимо запустить некоторую утилиту, которая изменит папку со скомпилированными классами либо<strong>jar</strong>-файл.</p>
5 <p>Первый вид шифраторов изменяет структуру программы переименовыванием идентификаторов или удалением информации отладчика. При чём изменение идентификаторов имеет место при работе как с исходным кодом программы, так и с Java байт-кодом. В случае с изменением байткода необходимо запустить некоторую утилиту, которая изменит папку со скомпилированными классами либо<strong>jar</strong>-файл.</p>
6 <p>А вот добиться изменения исходного кода можно даже простым рефакторингом в IDE. Например, двумя переименованиями можно превратить понятный класс:</p>
6 <p>А вот добиться изменения исходного кода можно даже простым рефакторингом в IDE. Например, двумя переименованиями можно превратить понятный класс:</p>
7 public class Configuration { public String getHttpPort() { ... { } ... // место вызова Configuration c = new Configuration(); String port = c.getHttpPort();<p>в следующую непонятную писанину:</p>
7 public class Configuration { public String getHttpPort() { ... { } ... // место вызова Configuration c = new Configuration(); String port = c.getHttpPort();<p>в следующую непонятную писанину:</p>
8 public class a { public String b() { ... } } ... // место вызова a c = new a(); String port = c.b();<p>При компиляции java-классов компилятор может сохранять отладочную информацию, которую можно использовать, например, для удалённой отладки приложения. По-умолчанию<strong>javac</strong>сохраняет информацию о номерах строк исходного файла и самом исходном файле, а имена локальных переменных не сохраняются.</p>
8 public class a { public String b() { ... } } ... // место вызова a c = new a(); String port = c.b();<p>При компиляции java-классов компилятор может сохранять отладочную информацию, которую можно использовать, например, для удалённой отладки приложения. По-умолчанию<strong>javac</strong>сохраняет информацию о номерах строк исходного файла и самом исходном файле, а имена локальных переменных не сохраняются.</p>
9 <p>Отключить сохранение<strong>debug</strong>-информации можно с помощью опции -g:none. Пример:</p>
9 <p>Отключить сохранение<strong>debug</strong>-информации можно с помощью опции -g:none. Пример:</p>
10 javac -g:none MyClass.java<p>Вы, наверное, уже догадались: перечисленные выше способы, объеденённые вместе, - это самый простой способ шифровки. Он во многом затрудняет понимание кода взломщиком, но логика работы приложения абсолютно никак не скрывается.</p>
10 javac -g:none MyClass.java<p>Вы, наверное, уже догадались: перечисленные выше способы, объеденённые вместе, - это самый простой способ шифровки. Он во многом затрудняет понимание кода взломщиком, но логика работы приложения абсолютно никак не скрывается.</p>
11 <h2>Продвинутые способы обфускации</h2>
11 <h2>Продвинутые способы обфускации</h2>
12 <p>Второй вид шифраторов изменяет ход выполнения программы (<strong>flow obfuscation</strong>). Чаще всего при этом "страдают" конструкции выбора (например,<strong>if</strong>и<strong>switch</strong>) и циклов (например,<strong>for</strong>и<strong>while</strong>). Байткод стараются изменить так, чтобы он не имел прямых аналогов в языке Java, что значительно усложняет работу взломщиков.</p>
12 <p>Второй вид шифраторов изменяет ход выполнения программы (<strong>flow obfuscation</strong>). Чаще всего при этом "страдают" конструкции выбора (например,<strong>if</strong>и<strong>switch</strong>) и циклов (например,<strong>for</strong>и<strong>while</strong>). Байткод стараются изменить так, чтобы он не имел прямых аналогов в языке Java, что значительно усложняет работу взломщиков.</p>
13 <p>Наконец, третий вид шифраторов изменяет структуры данных (<strong>structural obfuscators</strong>). Добиться этого можно изменением принципов наследования. Например, в иерархии можно создать несколько промежуточных классов. Популярным является разбиение классов на несколько частей. Кстати, разбиение на части можно применить и для массивов. В добавок можно кодировать символы строковых констант и переменных, чтоб уже наверняка всех запутать.</p>
13 <p>Наконец, третий вид шифраторов изменяет структуры данных (<strong>structural obfuscators</strong>). Добиться этого можно изменением принципов наследования. Например, в иерархии можно создать несколько промежуточных классов. Популярным является разбиение классов на несколько частей. Кстати, разбиение на части можно применить и для массивов. В добавок можно кодировать символы строковых констант и переменных, чтоб уже наверняка всех запутать.</p>
14 <p><strong>Шифраторы структур данных</strong>- наиболее надёжный вид шифраторов. Использование второго и третьего способа шифрования вместе настолько усложняет код программы, что восстановление оригинального кода становится практически невозможным.</p>
14 <p><strong>Шифраторы структур данных</strong>- наиболее надёжный вид шифраторов. Использование второго и третьего способа шифрования вместе настолько усложняет код программы, что восстановление оригинального кода становится практически невозможным.</p>
15 <h2>На заметку</h2>
15 <h2>На заметку</h2>
16 <p>Кстати, обфускацию любят не только секретные службы, но и разработчики мобильных приложений. Казалось бы, а им зачем? Просто<strong>jar</strong>-файл после обфускации становится меньше в размере, ведь длинных имён классов и методов в нём нет.</p>
16 <p>Кстати, обфускацию любят не только секретные службы, но и разработчики мобильных приложений. Казалось бы, а им зачем? Просто<strong>jar</strong>-файл после обфускации становится меньше в размере, ведь длинных имён классов и методов в нём нет.</p>
17 <p>А чем ещё может быть полезна обфускация? Пишите в комментариях!</p>
17 <p>А чем ещё может быть полезна обфускация? Пишите в комментариях!</p>
18  
18