Как быстро запутать код Java? - PullRequest
18 голосов
/ 23 января 2010

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

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

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

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

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

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

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

Ответы [ 8 ]

34 голосов
/ 23 января 2010

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

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

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

Не нужно ИМХО (даже не упоминая, что вы не можете).

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

Я бы предпочел использовать Ant Task или proguard-maven-plugin . См. этот вопрос о плагине maven, если требуется.

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

Да, чтобы "перевести" трассировку стека.

12 голосов
/ 23 января 2010

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

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

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);
        }
    }

}

Я создал Example.jar. Я скопировал файл 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, который содержит ту же функциональность и запутывается (проверено с помощью JAD). Обратите внимание, что я не использовал манифест, поэтому для проверки работоспособности я разобрал и протестировал класс. Точки входа в фляги оставлены читателю.

В разделе использования .

есть еще много опций хранения, перечисленных .
4 голосов
/ 23 января 2010

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

1 голос
/ 28 апреля 2012

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

Попробуйте: 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)

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

РЕДАКТИРОВАТЬ: следующий фрагмент кода использует простой 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();
}
1 голос
/ 23 января 2010

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

1 голос
/ 23 января 2010

Просто отвечаю на Q4…

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

1 голос
/ 23 января 2010

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

0 голосов
/ 23 января 2010

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

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

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

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

...