Как быстро запутать Java-код?
Как быстро запутать код. У меня очень маленькое приложение Java, и я хочу доставить обфускационный код моему клиенту. Я много слышал о ProGuard, чтобы обфускать код и загрузить его, но не знает, как обфускать мой "abc.jar".
Я проверил его сайт, но он содержит много материала для чтения. Мне не нужна тяжелая обфускация. Мне просто нужно запутать, что просто изменяет имя переменных, методов и классов на некоторые нечитаемые. Я знаю, что ProGuard предоставляет все это тонну других функций.
Q1. Так может кто-нибудь сказать мне, пожалуйста, какие-то простые обфускаторы или некоторые простые шаги для использования proguard, чтобы я мог просто ввести "abc.jar", и он выводит "obfuscate_abc.jar" или что-то простое как это.
Q2. Еще одна вещь, так как моя Java-программа использует внешние библиотеки, так что мне также нужно обфускать эти библиотеки?
Q3. Есть ли доступ к плагину Eclipse или NetBeans для этой обфускации?
Я также слышал, что мы должны сохранить файл таблицы сопоставления с нами, чтобы в будущем мы могли отлаживать или редактировать этот обфускационный код с помощью первого de-obfuscating с помощью этой таблицы отображения, которая была создана во время обфускации.
Q4. Итак, еще один вопрос: зачем нам хранить таблицу сопоставлений с нами? Мы можем просто сохранить копию un-obfuscated приложения, чтобы внести изменения в это (если это необходимо в будущем). Есть ли какая-нибудь причина для сохранения файла таблицы сопоставления с нами?
Ответы
Ответ 1
Q1. Так может кто-нибудь сказать мне, пожалуйста, некоторые простые обфускаторы или некоторые простые шаги для использования proguard, чтобы я мог просто ввести "abc.jar", и он выводит "obfuscate_abc.jar" или что-то простое.
Просто пойдите для ProGuard, это определенно хороший инструмент (рекомендуется во многих ответах здесь, на SO, например этот, this один и этот.
Q2. Еще одна вещь, так как моя java-программа использует внешние библиотеки, так что мне также нужно обфускать эти библиотеки?
Нет необходимости ИМХО (даже не упоминая, что вы не можете).
Q3. Есть ли какие-либо плагины затмения или netbeans для этой обфускации?
Я предпочел бы использовать Ant Task или proguard-maven-plugin. См. этот вопрос о плагине maven, если это необходимо.
Q4. Итак, еще один вопрос: зачем нам хранить эту таблицу сопоставлений с нами. Мы можем просто сохранить копию un-obfuscated приложения, чтобы внести изменения в это (если это необходимо в будущем). Есть ли какая-нибудь причина для сохранения файла таблицы сопоставления с нами?
Да, чтобы "перевести" stacktrace.
Ответ 2
Я пробовал это с нуля. Это должно заставить вас начать. Я думаю, что ключ будет заключаться в том, чтобы понять "сохранить параметры" в файле конфигурации.
Используя этот код:
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). Обратите внимание, что я не использовал манифест, поэтому для проверки функциональности я открепил и протестировал класс. Входные точки выполнения внутри банки оставляются читателю.
В разделе "Использование" есть несколько опций сохранения .
Ответ 3
Вам нужно только обфускать другие библиотеки в том случае, если вам нужно защитить их от того, что вы думаете о запутывании для вашего кода. Однако вы должны прочитать лицензии для этих других библиотек, чтобы узнать, не ограничивают ли вы распространение распространенных версий.
Ответ 4
относительно Q4: сопоставление используется, когда пользователи отправляют вам отчеты об ошибках, содержащие стеки стека исключений из обфускационного кода. ProGuard позволяет перевести эти стеки в исходные имена классов и номера строк, если у вас есть сопоставление.
Ответ 5
Просто отвечая Q4...
Существует хорошая причина сохранить отображение. Если клиент когда-либо посылает вам стек, это может быть очень полезно знать, где в коде, из которого был получен стек. Цель обфускатора - избавиться от этой информации;-) Сохраняя отображение, вы включаете преобразование stacktrace в место возникновения проблемы в исходном коде.
Ответ 6
Я могу ответить на вопрос 4. Вы должны сохранить его для отладки. Скажем, у вас есть ошибка в функции "printTheAlphabet()" в строке 23, после обфускации трассировки стека может сказать что-то вроде "Ошибка в j6z9r() в строке 27", что делает невозможным обнаружение ошибки в исходном коде.
Ответ 7
Как обфускать код быстро и грязно:
Попробуйте: http://www.daftlogic.com/projects-online-javascript-obfuscator.htm или он: http://javascriptobfuscator.com/default.aspx или Google "javascript obfuscator онлайн".
Я знаю, что это для Javascript, но вы можете получить
результат функции с использованием Javascript eval для Java (посмотрите: fooobar.com/questions/28242/...)
Это не лучший пример, но это может быть полезно, если вы действительно спешите, и вы не параноичны по поводу безопасности.
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();
}
Ответ 8
Я быстро просмотрел yGuard и понравился тот факт, что вы можете интегрировать шаги обфускации в Ant script. Это позволяет легко использовать его в Eclipse и т.д., Если вы хотите.
В документации, прилагаемой к нему, предоставляется несколько готовых сценариев Ant, чтобы вы начали. Это просто нужно изменить для работы с макетом ваших проектов, то есть установить правильные имена пакетов и т.д.
Если вы не знаете, как получить Ant в Eclipse, вам просто нужно добавить файл build.xml в проект, скопируйте пример script, который поставляется вместе с yGuard, измените script для работы с вашим проектом и запуска задачи yGuard из представления Ant.
Что касается вашего вопроса таблицы сопоставлений. Единственная причина, по которой я могу думать, что вам может понадобиться что-то вроде этого, было бы, если бы вы не смогли воспроизвести ошибку, которую вы обнаружили на обфускации, из вашего исходного кода. На этом этапе вам может потребоваться работать с запутанной версией, возможно, чтобы определить, вызвала ли запутывание проблему.