如何快速混淆代码。我有一个非常小的 Java App ,我想将混淆的代码传递给我的客户端。我听过很多关于ProGuard来混淆代码并下载它但却不知道如何模糊我的“abc.jar”文件。
我查看了它的网站,但它包含了很多要阅读的资料。我不需要沉重的混淆。我只需要一个混淆,只需将变量,方法和类的名称更改为一些不可读的名称。我知道ProGuard也提供了大量其他功能。
Q1。所以有人可以告诉我一些简单的混淆器或一些简单的步骤来使用proguard,这样我就可以输入“abc.jar”并输出“obfuscate_abc.jar”或简单的东西那样的。
Q2。还有一件事,因为我的Java程序使用外部库,所以我是否还需要对这些库进行模糊处理?
Q3。这种混淆是否有可用的Eclipse或NetBeans插件?
我还听说我们应该保留映射表文件,以便将来我们可以通过在混淆时创建的映射表的帮助下首先进行去混淆来调试或编辑混淆代码。
Q4。所以,还有一个问题是为什么我们需要与我们保持该映射表?我们可以简单地保留未混淆的应用程序的副本,以便对其进行更改(如果将来需要)。有没有理由与我们一起保留该映射表文件?
答案 0 :(得分:33)
Q1。所以有人可以告诉我一些简单的混淆器或一些简单的步骤来使用proguard,这样我就可以输入“abc.jar”并输出“obfuscate_abc.jar”或类似的东西。
只需使用ProGuard,它绝对是一个很好的工具(在this one,this one和this one这样的很多答案中推荐使用。
Q2。还有一件事,因为我的java程序使用外部库,所以我是否还需要对这些库进行模糊处理?
不需要恕我直言(甚至没有提到你可能没有)。
Q3。这个混淆是否有可用的eclipse或netbeans插件?
我建议您使用Ant Task或proguard-maven-plugin。如果需要,请参阅this question有关maven插件的信息。
Q4。所以,还有一个问题是为什么我们需要与我们保持映射表。我们可以简单地保留未混淆的应用程序的副本,以便对其进行更改(如果将来需要)。有没有理由与我们一起保留该映射表文件?
是的,要“翻译”stacktrace。
答案 1 :(得分:12)
我从头开始尝试这个。它应该让你开始。我认为关键是要了解配置文件中的“保留选项”。
使用此代码:
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 lib目录复制了proguard.jar,并运行了这个命令行
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验证)。请注意,我没有使用清单,因此为了测试功能,我解开并测试了该类。罐子里的执行入口点留给读者。
列出了更多保留选项in the Usage section。
答案 2 :(得分:4)
在需要保护它们的情况下,您只需要对其他库进行模糊处理,以防止您认为模糊处理对代码的影响。但是,您应该阅读其他库的许可证,以确定它们是否限制您分发修改版本。
答案 3 :(得分:1)
关于Q4:当用户向您发送包含来自混淆代码的异常堆栈跟踪的错误报告时,将使用映射。如果您有映射,ProGuard允许您将这些堆栈跟踪转换回原始类名和行号。
答案 4 :(得分:1)
刚回答Q4 ......
有充分的理由保持映射。如果客户端向您发送堆栈跟踪,那么知道堆栈跟踪来自代码的位置非常有用。混淆器的目的是消除该信息;-)通过保持映射,您可以将堆栈跟踪转换为原始代码中出现问题的位置。
答案 5 :(得分:1)
我可以回答问题4.您应该保留它以进行调试。假设你在第23行的函数“printTheAlphabet()”中有一个错误,在混淆堆栈跟踪之后可能会说“第27行的j6z9r()中的错误”,这使得很难在源代码中找到错误。< / p>
答案 6 :(得分:1)
如何快速混淆代码&amp;脏:
试一试:http://www.daftlogic.com/projects-online-javascript-obfuscator.htm或它:http://javascriptobfuscator.com/default.aspx或Google“javascript obfuscator online”。
我知道它适用于Javascript,但你可以获得 函数结果使用Javascript eval for 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();
}
答案 7 :(得分:0)
我之前已经快速查看了yGuard并且喜欢您可以将混淆步骤集成到Ant脚本中。如果需要,这允许您在Eclipse等中非常容易地使用它。
它附带的文档提供了许多现成的Ant脚本来帮助您入门。这些只需要修改以适应您的项目布局,即设置正确的包名等。
如果你不清楚如何让Eclipse进入Eclipse,你几乎只需要将一个build.xml文件添加到项目中,将yGuard附带的示例脚本复制到其中,修改脚本以使用你的从Ant视图中生成并运行yGuard任务。
关于您的映射表问题。我认为你可能需要这样的东西的唯一原因就是如果你不能从原始代码复制你的混淆jar展示的bug。此时,您可能需要使用混淆版本,可能需要确定混淆是否导致了问题。
答案 8 :(得分:0)
-injars Decryption.jar (input .jar file that you want to obfuscate)
-outjars DecryptionOut.jar (output .jar file that you get after obfuscate)
-libraryjars '<java.home>\lib\rt.jar'
#-dontwarn javax.crypto.** only if it gives any warnings in import
-dontshrink
-keep class Decryption{ *; }
尝试将这些规则复制到myconfig.pro
规则中,然后保存并在cmd上运行命令java -jar proguard.jar @myconfig.pro
从https://sourceforge.net/projects/proguard/下载proguard.jar