Статьи

Защитите свой Java-код от обратного проектирования

Если вы разрабатываете приложение 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 для обратного инжиниринга файла класса.

С http://www.thegeekstuff.com