如何快速混淆Java代码?

如何快速混淆Java代码?,java,obfuscation,proguard,Java,Obfuscation,Proguard,如何快速混淆代码。我有一个非常小的Java应用程序,我想将模糊代码交付给我的客户机。我听说过很多关于混淆代码的事情,并且已经下载了它,但不知道如何混淆我的“abc.jar”文件 我查看了它的网站,但里面有很多资料要读。我不需要太多的困惑。我只需要一个模糊的,只是改变了一些不可读的变量,方法和类的名称。我知道ProGuard还提供了大量其他功能 问题1。有谁能告诉我一些简单的模糊处理程序或者使用proguard的简单步骤,这样我就可以输入“abc.jar”,然后它输出“obfuscate_abc.

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

我查看了它的网站,但里面有很多资料要读。我不需要太多的困惑。我只需要一个模糊的,只是改变了一些不可读的变量,方法和类的名称。我知道ProGuard还提供了大量其他功能

问题1。有谁能告诉我一些简单的模糊处理程序或者使用proguard的简单步骤,这样我就可以输入“abc.jar”,然后它输出“obfuscate_abc.jar”或者类似的简单内容

问题2。还有一件事,因为我的Java程序使用外部库,所以我也需要混淆这些库吗

第三季度。是否有任何Eclipse或NetBeans插件可用于此混淆

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


第四季度。所以,还有一个问题是,为什么我们需要保留映射表?我们可以简单地保留一个未模糊化应用程序的副本,以便对其进行更改(如果将来需要)。是否有任何理由将该映射表文件保留在我们这里?

您只需要对其他库进行模糊处理,以防您认为模糊处理会对代码造成任何影响。但是,您应该阅读这些其他库的许可证,看看它们是否限制您分发修改后的版本。

关于第4个问题:当用户向您发送包含模糊代码异常堆栈跟踪的错误报告时,将使用映射。ProGuard允许您将这些StackTrace转换回原始类名和行号(如果您有映射)。

仅回答第4季度


有一个很好的理由保留映射。如果客户机曾经向您发送stacktrace,了解stacktrace来自代码中的什么地方会非常有用。模糊处理程序的目的是去除这些信息;-)通过保持映射,可以将stacktrace转换为原始代码中出现问题的位置。

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

问题1。有谁能告诉我一些简单的模糊处理程序或者使用proguard的简单步骤,这样我就可以输入“abc.jar”,然后它输出“obfuscate_abc.jar”或者类似的简单内容

只需使用ProGuard,它绝对是一个很好的工具(在这里的许多答案中都有推荐,等等)

问题2。还有一件事,因为我的java程序使用外部库,所以我也需要混淆这些库吗

不需要IMHO(甚至不提你可能不需要)

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

我宁愿建议使用或。如果需要,请参阅maven插件

第四季度。所以,还有一个问题是,为什么我们需要保留映射表呢。我们可以简单地保留一个未模糊化应用程序的副本,以便对其进行更改(如果将来需要)。是否有任何理由保留映射表文件


是的,要“翻译”stacktrace。

我从头开始就试过了。这应该让你开始。我认为关键在于理解配置文件中的“保留选项”

使用此代码:

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[]);
}
-injars Example.jar
-outjars ExampleOut.jar
-libraryjars/lib/rt.jar
-保持公共课的榜样{
公共静态void main(java.lang.String[]);
}
这将生成ExampleOut.jar,它包含相同的功能,并且被混淆(用JAD验证)。请注意,我没有使用清单,所以为了测试功能,我取消了类的清单并对其进行了测试。JAR中的执行入口点留给读者


还有更多的保留选项。

我之前已经快速查看过,并且喜欢将模糊处理步骤集成到Ant脚本中。如果您愿意,这允许您在Eclipse等中非常轻松地使用它

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

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


关于映射表问题。我认为您可能需要这样的东西的唯一原因是,如果您无法从原始代码中复制模糊化jar显示的bug。此时,您可能需要使用模糊处理版本,以确定模糊处理是否导致了问题。

如何快速模糊代码:

试试它:或者它:或者谷歌的“javascript在线混淆器”

我知道它是用于Javascript的,但您可以获得 使用JavaScriptEval for Java的函数结果(请看:)

这并不是最好的方法,但如果你真的很匆忙,而且你对安全问题不是偏执狂,那么它会很有用

编辑:下一段代码使用简单的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();
}
-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{ *; }