Если вы разрабатываете приложение Java, важно понимать, что файлы классов Java могут быть легко перепроектированы с использованием декомпиляторов Java. В этой статье мы рассмотрим, как файл класса Java подвергается обратному проектированию и как защитить исходный код от этого.
Исходный код Java скомпилирован в файл класса, который содержит байт-код. Виртуальная машина Java требует только файл класса для выполнения. Проблема в том, что файл класса можно легко декомпилировать в исходный код с помощью инструментов декомпиляции Java. Лучшее решение для предотвращения реверс-инжиниринга — это запутать файл класса, так что его будет очень сложно реверс-инжинировать. Согласно словарю, Obfuscate означает «сделать неясным или неясным». Это именно то, что делают многие инструменты Java-обфускатора, как описано ниже.
Декомпилируйте файл класса Java.
Прежде чем понять, как запутать Java-код, давайте сначала попытаемся понять, как кто-то может реконструировать ваше Java-приложение. Следующие 3 шага объясняют, как файл класса был обратно преобразован в исходный код Java.
1. Создайте HelloWorld.java, как показано ниже.
public class HelloWorld { public static void main (String args[]) { String userMessage = “Hello World!”; int userCount = 100; userCount = userCount + 1; System.out.println(userMessage); System.out.println(userCount); } }
2. Скомпилируйте программу HelloWorld.java и выполните ее, чтобы убедиться, что она работает правильно.
$ javac HelloWorld.java $ java HelloWorld Hello World! 101
Файл класса Java содержит только байт-код. Если вы попытаетесь просмотреть файл класса, он будет недоступен для чтения, как показано ниже.
$ vi HelloWorld.class Ãþº¾^@^@^@2^@ ^@^G^@^P^H^@^Q ^@^R^@^S ^@^T^@^V^G^@^W^G^@^X^A^@^F<init>^A^@^C()V^A^@^DCode^A^@^OLineNumberTable ^A^@^Dmain^A^@^V([Ljava/lang/String;)V^A^@ SourceFile^A^@^OHelloWorld.java^L^@^H^@ ^A^@^LHello World!^G^@^Y^L^@^Z^@^[^G^@^\^L^@^]^@^^^L^@^]^@^_^A^@ HelloWorld^A^@^Pjava/lang/Object^A^@^Pjava/lang/System^A^@^Cout^A^@^ULjava/io/PrintStream;^A ^@^Sjava/io/PrintStream^A^@^Gprintln^A^@^U(Ljava/lang/String;)V^A^@^D(I)V^@!^@^F^@^G^@^@^@^@^@^B^@^A^@^H^@ ^@^A^@
3. Декомпилируйте файл HelloWorld.class и просмотрите исходный код.
Для этой демонстрации давайте используем Jad- декомпилятор, который является бесплатным для некоммерческого использования. Загрузите соответствующий jad для вашей платформы. Используйте jad для обратной разработки файла HelloWorld.class, чтобы получить исходный код, как показано ниже.
$ unzip jadls158.zip
$ ./jad HelloWorld.class
Parsing HelloWorld.class...
Generating HelloWorld.jad
$ vi HelloWorld.jad <This will show the reverse engineered original source code>
Запутать ваше Java-приложение
Давайте рассмотрим, как запутать и защитить ваш исходный код от обратного инжиниринга, используя ProGuard, бесплатное лицензионное программное обеспечение GPL.
1. Загрузите и установите ProGuard
$ cd /home/jsmith $ unzip proguard4.2.zip
2. Создайте файл конфигурации Proguard
Создайте myconfig.pro, который содержит всю информацию о вашем Java-приложении.
- -injar: укажите местоположение вашего файла jar. т.е. скомпилированное Java-приложение, которое содержит файлы классов
- -outjar: Это файл jar, который Proguard создаст после запутывания. Это будет содержать все искаженное, неясное соглашение об именах методов и переменных в файле класса, если кто-то попытается выполнить обратный инжиниринг.
- -printmapping: ProGurad выводит всю информацию о сопоставлении в этом файле для вашей справки.
- -keep: указать файлы классов или методы, которые вы не хотите, чтобы ProGuard запутывал. Например, mypkg.MainAppFrame содержит точку входа для приложения с основным классом, который не будет запутан в этом примере.
$ cat myconfig.pro -injars /home/jsmith/myapp.jar -outjars /home/jsmith/myapp-obfuscated.jar This is the obfuscated jar file -libraryjars /usr/java/jdk1.5.0_14/jre/lib/rt.jar -printmapping proguard.map -verbose -keep public class mypkg.MainAppFrame
3. Запустите ProGuard.
$ cd /home/jsmith/proguard4.2/lib $ java -jar proguard.jar @myconfig.pro
Это создает следующие два файла:
- myapp-obfuscated.jar: содержит зашифрованные файлы классов вашего приложения. Вы можете распространять это, не беспокоясь о том, что кто-то может легко перестроить ваше приложение.
- proguard.map: этот файл содержит информацию об отображении для вашей ссылки.
4. Пример файла proguard.map
Это образец файла proguard.map, в котором указано исходное имя исходных объектов Java (файл классов, методы, переменная и т. Д.) И новое обфусцированное имя.
myapp.AppToolBar -> myapp.ae: javax.swing.JButton btnNew -> d javax.swing.JButton btnOpen -> e
5. Образец исходного кода Java (myapp.AppToolBar) перед запутыванием.
btnNew = changeButtonLabel(btnNew, language.getText("new")); btnOpen = changeButtonLabel(btnOpen, language.getText("open"));
6. Пример исходного кода Java, который был декомпилирован из файла класса (myapp.ae) после обфускации.
d = a(d, n.a("new")); e = a(e, n.a("open"));Вы можете видеть, что строка « btnNew = changeButtonLabel (btnNew, language.getText (« new »)); »Переведено как« d = a (d, na («новый»)); ProGuard, который не будет иметь никакого смысла для тех, кто использует инструменты декомпилятора Java для обратного инжиниринга файла класса.