Как быстро запутать Java-код?

Как быстро запутать код. У меня очень маленький Java Приложение и я хочу доставить запутанный код моему клиенту. Я много слышал о ProGuard чтобы запутать код и загрузить его, но не знает, как запутать мою "abc.файл jar.

Я проверил свой сайт, но он содержит много материала для чтения. Мне не нужна тяжелая путаница. Мне просто нужен обфускат, который просто меняет имя переменных, методов и занятия с некоторыми нечитаемыми. Я знаю, что ProGuard предоставляет все это с тонной других функций.

Q1. Так может кто-нибудь сказать мне, пожалуйста, некоторые простые обфускаторы или некоторые простые шаги для использования proguard, чтобы я мог просто ввести "abc.jar "и выводит" obfuscate_abc.jar " или что-то в этом роде.

Q2. еще одна вещь, так как моя программа Java использует внешние библиотеки, поэтому мне нужно запутать эти библиотеки тоже?

Q3. есть ли плагин Eclipse или NetBeans, доступный для этого запутывания?

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

Q4. Итак, еще один вопрос: почему нам нужно держать эту таблицу отображения с нами? Мы можем просто сохраните копию незамутненного приложения, чтобы внести в него изменения (если это потребуется в будущем). Есть ли причина сохранить этот файл mapping-table у нас?

8 ответов


Q1. Так может ли кто-нибудь сказать мне, пожалуйста, некоторые простые обфускаторы или некоторые простые шаги для использования proguard, чтобы я мог просто ввести "abc.jar "и выводит" obfuscate_abc.jar " или что-то в этом роде.

просто перейдите на ProGuard, это определенно хороший инструмент (рекомендуется во многих ответах здесь, так как этот, этот и этот).

Q2. Еще одна вещь, поскольку моя программа java использует внешние библиотеки, так что мне тоже нужно запутать эти библиотеки?

нет необходимости имхо (даже не упоминая, что вы не можете).

Q3. Есть ли плагин eclipse или netbeans, доступный для этого запутывания?

Я бы предложил использовать Задач АНТ или proguard-maven-плагин. См.этот вопрос о плагине maven, если требуется.

Q4. Итак, еще один вопрос в том, почему мы должны держать эту таблицу карт с нами. Мы можем просто сохранить копию незамутненного приложения, чтобы внести в него изменения (если это потребуется в будущем). Есть ли причина сохранить этот файл mapping-table у нас?

да, чтобы "перевести" stacktrace.


я попробовал это с нуля. Это должно помочь тебе начать. Я думаю, что ключом будет понять "параметры сохранения" в файле конфигурации.

используя этот код:

import java.util.*;

public class Example {

    public static void main(String... args) {
        Example ex = new Example();
        ex.go();
    }

    public void go() {
        String[] strings = { "abc", "def", "ijk" };
        for (String s : strings) {
            System.out.println(s);
        }
    }

}

Я создал пример.сосуд. Я скопировал proguard.jar из каталога ProGuard lib и запустил эту командную строку

java -jar proguard.jar @myconfig.pro

где myconfig.Pro содержит:

-injars Example.jar
-outjars ExampleOut.jar
-libraryjars <java.home>/lib/rt.jar

-keep public class Example {
    public static void main(java.lang.String[]);
}

это производит ExampleOut.jar, который содержит ту же функциональность и запутан (проверен с Джадом). Обратите внимание, что я не использовать манифест, чтобы проверить функциональность, я unjarred и протестировал класса. Точки входа выполнения внутри jars оставлены читателю.

есть еще много вариантов keep listed в разделе использование.


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


Что касается Q4: отображение используется, когда пользователи отправляют вам отчеты об ошибках, которые содержат стеки исключений из запутанного кода. ProGuard позволяет перевести эти stacktraces обратно в исходные имена классов и номера строк, если у вас есть отображение.


просто отвечая на Q4...

есть веская причина, чтобы сохранить отображение. Если клиент когда-либо отправляет вам stacktrace, может быть очень полезно знать, откуда в коде появился stacktrace. Цель обфускатора-избавиться от этой информации ;-) сохраняя отображение, вы включаете преобразование stacktrace в то место, где возникла проблема в исходном коде.


Я могу ответить на вопрос 4. Вы должны сохранить его для отладки. Скажем, у вас есть ошибка в функции "printTheAlphabet()" в строке 23, после запутывания трассировки стека может сказать что-то вроде "ошибка в j6z9r() в строке 27", что делает довольно невозможным найти ошибку в исходном коде.


Как запутать код быстро и грязно:

попробуйте:http://www.daftlogic.com/projects-online-javascript-obfuscator.htm или это:http://javascriptobfuscator.com/default.aspx или Google "javascript obfuscator online".

Я знаю, что это JavaScript, но вы можете получить результат функции с использованием JavaScript eval для Java (посмотрите:https://stackoverflow.com/a/2605051/450148)

Это не самое лучшее aprouch, но это может быть полезно, если вы действительно спешите, и вы не параноик о безопасности.

EDIT: следующий фрагмент кода использует простой ROT13, чтобы не подвергать непосредственно ваш пароль. Хорошо, что "хакер" не знает, какой алгоритм вы используете (вы можете заменить ROT13, для которого алгоритм вам нравится), но его все равно очень легко сломать:

static String password;

static {
    password = a("NXVNWQX5CHXRWTKGDMHD");
}

private static String a(String b) {
    String c = "eval(function(p,a,c,k,e,d){e=function(c){return c.toString(36)};if(!''.replace(/^/,String)){while(c--){d[c.toString(a)]=k[c]||c.toString(a)}k=[function(e){return d[e]}];e=function(){return'\\w+'};c=1};while(c--){if(k[c]){p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c])}}return p}('k a(b){2 5=\'\';o(2 i=0;i<b.e;i++){2 c=b.g(i);2 1=b.f(i);4(c>=\'a\'&&c<=\'m\')1+=3;6 4(c>=\'n\'&&c<=\'9\')1-=3;6 4(c>=\'7\'&&c<=\'h\')1+=3;6 4(c>=\'7\'&&c<=\'p\')1-=3;2 d=8.l(1);5+=d}j 5}',26,26,'|charcode|var|13|if|sb|else|A|String|z|||||length|charCodeAt|charAt|M||return|function|fromCharCode|||for|Z'.split('|'),0,{}));";

    ScriptEngineManager manager = new ScriptEngineManager();
    ScriptEngine engine = manager.getEngineByName("js");
    Object z = "";

    //noinspection EmptyCatchBlock
    try {
        z = engine.eval(c + " a('" + b + "');");
    } catch (ScriptException e) {}

    return z.toString();
}

Я быстро взглянул на yGuard раньше и понравилось, что вы можете интегрировать шаги обфускации в сценарий Ant. Это позволяет использовать его очень легко в Eclipse и т. д., Если вы хотите.

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

Если вы не ясно, как получить Ant собирается в Eclipse, вы просто должны добавить сборку.xml-файл в проект, скопируйте в него пример сценария, который поставляется с yGuard, измените сценарий для работы с проектом и запустите задачу yGuard из представления Ant.

Что касается вашего вопроса таблицы сопоставления. Единственная причина, по которой я могу думать, что вам может понадобиться что-то вроде этого, это если вы не можете воспроизвести ошибку, которую ваши запутанные экспонаты jar, из вашего исходного кода. На этом этапе вам, возможно, придется работать с obfuscated версия, возможно, чтобы определить, если обфускация вызвала проблему.