21

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

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

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

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

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

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

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

4

9 回答 9

41

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

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

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

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

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

我宁愿建议使用Ant Taskproguard-maven-plugin。如果需要,请参阅有关 maven 插件的这个问题。

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

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

于 2010-01-23T18:28:17.180 回答
15

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

使用此代码:

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 中的执行入口点留给读者。

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

于 2010-01-23T18:46:09.820 回答
4

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

于 2010-01-23T18:12:08.547 回答
1

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

于 2010-01-23T18:22:03.270 回答
1

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

于 2010-01-23T18:20:36.433 回答
1

刚刚回答 Q4……</p>

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

于 2010-01-23T18:20:49.217 回答
1

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

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

我知道它适用于 Javascript,但您可以使用 Java 的 Javascript eval 获得函数结果(查看: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();
}
于 2012-04-28T18:06:49.470 回答
0

我之前快速浏览过yGuard,并且喜欢您可以将混淆步骤集成到 Ant 脚本中的事实。如果需要,这允许您在 Eclipse 等中非常轻松地使用它。

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

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

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

于 2010-01-23T19:01:19.307 回答
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规则中,然后保存并java -jar proguard.jar @myconfig.pro在 cmd 上运行命令

proguard.jarhttps://sourceforge.net/projects/proguard/下载

于 2020-09-07T13:07:09.890 回答