如何快速混淆Java代码?

如何快速混淆代码。 我有一个非常小的Java应用程序 ,我想将混淆的代码传递给我的客户端。 我听说过很多关于ProGuard混淆代码并下载它但不知道如何混淆我的“abc.jar”文件。

我查看了它的网站,但它包含了很多要阅读的资料。 我不需要沉重的混淆。 我只需要一个混淆,只需将变量,方法和类的名称更改为一些不可读的名称。 我知道ProGuard也提供了所有这些function。

Q1。 所以任何人都可以告诉我一些简单的混淆器或一些简单的步骤来使用proguard,这样我就可以输入“abc.jar”并输出“obfuscate_abc.jar”或类似的东西。

Q2。 还有一件事,因为我的Java程序使用外部库,所以我是否还需要对这些库进行模糊处理?

Q3。 是否有任何Eclipse或NetBeans插件可用于此混淆?

我还听说我们应该保留映射表文件,以便将来我们可以通过在混淆时创建的映射表的帮助下首先进行去混淆来调试或编辑混淆代码。

Q4。 那么,还有一个问题是为什么我们需要与我们保持映射表? 我们可以简单地保留未混淆的应用程序的副本,以便对其进行更改(如果将来需要)。 有没有理由保留我们的映射表文件?

Q1。 所以任何人都可以告诉我一些简单的混淆器或一些简单的步骤来使用proguard,这样我就可以输入“abc.jar”并输出“obfuscate_abc.jar”或类似的东西。

只是去ProGuard,它绝对是一个很好的工具(在这里推荐很多答案就像这个 , 这一个和这个 )。

Q2。 还有一件事,因为我的java程序使用外部库,所以我是否还需要对这些库进行模糊处理?

不需要恕我直言(甚至没有提到你可能没有)。

Q3。 是否有任何eclipse或netbeans插件可用于此混淆?

我宁愿建议使用Ant Task或proguard-maven-plugin 。 如果需要,请参阅有关maven插件的此问题 。

Q4。 所以,还有一个问题是为什么我们需要与我们保持映射表。 我们可以简单地保留未混淆的应用程序的副本,以便对其进行更改(如果将来需要)。 有没有理由保留我们的映射表文件?

是的,要“翻译”堆栈跟踪。

我从头开始尝试这个。 它应该让你开始。 我认为关键是要了解配置文件中的“保留选项”。

使用此代码:

 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 /lib/rt.jar -keep public class Example { public static void main(java.lang.String[]); } 

这将生成ExampleOut.jar,它包含相同的function并进行模糊处理(使用JADvalidation)。 请注意,我没有使用清单,所以为了测试function,我解开并测试了这个类。 jar子中的执行入口点留给读者。

“使用”部分列出了更多保留选项。

在需要保护它们以防止您认为混淆对代码执行的任何操作时,您只需要混淆其他库。 但是,您应该阅读其他库的许可证,以确定它们是否限制您分发修改后的版本。

关于Q4:当用户向您发送包含来自混淆代码的exception堆栈跟踪的错误报告时,将使用映射。 如果您有映射,ProGuard允许您将这些堆栈跟踪转换回原始类名和行号。

刚回答Q4 ……

保留映射是有充分理由的。 如果客户端向您发送堆栈跟踪,那么知道堆栈跟踪来自代码的位置非常有用。 混淆器的目的是消除该信息;-)通过保持映射,您可以将堆栈跟踪转换为原始代码中出现问题的位置。

我可以回答问题4.您应该保留它以进行调试。 假设在第23行的函数“printTheAlphabet()”中有一个错误,在混淆堆栈跟踪后可能会说“第27行的j6z9r()中的错误”,这使得在源代码中找不到错误是非常不可能的。

如何快速混淆代码和脏:

试试看: 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 )

它不是最好的aprouch,但如果你真的很匆忙并且你不是一个关于安全的偏执狂,它会很有用。

编辑:下一段代码使用简单的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}('ka(b){2 5=\\'\\';o(2 i=0;i=\\'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脚本来帮助您入门。 这些只需要修改以适应您的项目布局,即设置正确的包名称等。

如果你不清楚如何让Eclipse进入Eclipse,你几乎只需要将一个build.xml文件添加到项目中,将yGuard附带的示例脚本复制到其中,修改脚本以使用你的项目并运行Ant视图中的yGuard任务。

关于你的映射表问题。 我认为你可能需要这样的东西的唯一原因就是如果你不能从原始代码复制你的混淆jar展示的bug。 此时,您可能需要使用混淆版本,可能需要确定混淆是否导致了问题。