如何快速混淆 Java 代码?

Posted

技术标签:

【中文标题】如何快速混淆 Java 代码?【英文标题】:How to obfuscate Java code quickly? 【发布时间】:2011-01-08 14:37:05 【问题描述】:

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

我查看了它的网站,但它包含很多可供阅读的材料。我不需要重度混淆。我只需要一个混淆器,它只是将变量、方法和类的名称更改为一些不可读的名称。我知道 ProGuard 还为所有这些提供了大量其他功能。

Q1.所以谁能告诉我一些简单的混淆器或一些使用proguard的简单步骤,这样我就可以输入“abc.jar”并输出“obfuscate_abc.jar”或一些简单的东西像这样。

Q2.还有一件事,因为我的 Java 程序使用外部库,所以我是否也需要混淆这些库?

Q3. 是否有任何 Eclipse 或 NetBeans 插件可用于这种混淆?

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

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

【问题讨论】:

还要记住,如果你使用反射和/或按名称加载,混淆会破坏你的程序。 正如 Christopher 所说,有手册,我们不能(也不会为您阅读) 为什么不看看proguard.sourceforge.net/manual/examples.html 上的完整示例,然后就您遇到的任何具体问题提出问题? 当 OP 阅读(并 +1 )所有回复时,他可能已经“阅读了网站”并混淆了他的代码 在将未经测试的技术的代码交付给客户之前两秒钟,我会三思而后行引入新技术。 【参考方案1】:

第一季度。所以谁能告诉我一些简单的混淆器或一些使用proguard的简单步骤,这样我就可以输入“abc.jar”并输出“obfuscate_abc.jar”或类似的简单内容。

选择 ProGuard,它绝对是一个很好的工具(在 SO 上的许多答案中推荐,例如 this one、this one 和 this one)。

第二季度。还有一件事,因为我的 java 程序使用外部库,所以我也需要混淆这些库吗?

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

第三季度。是否有任何 eclipse 或 netbeans 插件可用于这种混淆?

我宁愿建议使用Ant Task 或proguard-maven-plugin。如果需要,请参阅this question 了解有关 maven 插件的信息。

第四季度。因此,还有一个问题是为什么我们需要随身携带该映射表。我们可以简单地保留一份未混淆的应用程序副本,以便对其进行更改(如果将来需要)。我们有什么理由保留那个映射表文件吗?

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

【讨论】:

轻微的拼写错误,但ProGard 让我浪费了我不知道看了枪架多久。您的答案还不如开具利他林处方。【参考方案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 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 验证)。请注意,我没有使用清单,因此为了测试功能,我解压缩并测试了该类。 jar 中的执行入口点留给读者。

列出了更多保留选项in the Usage section。

【讨论】:

显示Warning: scraper.Main: can't find referenced class com.gargoylesoftware.htmlunit.html.HtmlTableCell 表示找不到com.garg ... lib 但它在同一个文件夹中。我是否还需要在 .pro 文件中提及外部库【参考方案3】:

您只需在需要保护它们免受您认为混淆对您的代码所做的任何事情的情况下对其他库进行混淆。但是,您应该阅读其他库的许可,看看它们是否限制您分发修改后的版本。

【讨论】:

+1 建议我检查这些库的许可证。【参考方案4】:

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

【讨论】:

【参考方案5】:

刚刚回答 Q4……

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

【讨论】:

【参考方案6】:

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

【讨论】:

【参考方案7】:

如何快速和肮脏地混淆代码:

试试看:http://www.daftlogic.com/projects-online-javascript-obfuscator.htm 或它:http://javascriptobfuscator.com/default.aspx 或谷歌“javascript obfuscator online”。

我知道它是针对 Javascript 的,但你可以得到 使用 Java 的 Javascript eval 的函数结果(查看:https://***.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+=dj 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 脚本中的事实。如果需要,这允许您在 Eclipse 等中非常轻松地使用它。

它附带的文档提供了许多现成的 Ant 脚本来帮助您入门。这些只需要修改以与您的项目布局一起使用,即设置正确的包名称等。

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

关于您的映射表问题。我认为您可能需要这样的唯一原因是,如果您无法从原始代码中复制混淆的 jar 展示的错误。此时您可能需要使用经过混淆处理的版本,也许是为了确定混淆处理是否导致了问题。

【讨论】:

【参考方案9】:
-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

【讨论】:

以上是关于如何快速混淆 Java 代码?的主要内容,如果未能解决你的问题,请参考以下文章

快速混淆 NSString 顺序的方法?

Java培训分享5个常用Java代码混淆器

如何防止代码被反编译

如何准确解码 ProGuard 的混淆代码?

maven混淆Java代码

Android 编程下的代码混淆