如何正确反编译Java代码?

问题描述

我正在尝试反编译此Java源代码,但是它始终带有我不理解的语法。

我尝试使用Procyon v0.5.36对其进行反编译,但我得到的文件如下:

do.java
case.java
if.java
.
.
...

这些文件包含的语法我是无法理解的,以前是这样的:

public class if implements do
{
    public static volatile int if;
    public static volatile int for;
    public static volatile boolean int;
    private static final int try = 5;
    private static final int byte = 5;
    private static final int case = 8;
    public static final int new = 50;
    
    public for do() {
        case case1 = null;
        try {
            final tech.platform.this.do int1 = tech.platform.this.do.int();
            if (int1 == null) {
                throw new tech.platform.char.do("Page not found !");
            }
            case1 = new case(int1.break().getInt("processNum"));
            if (case1.protected()) {
                throw new tech.platform.char.do("No ID found !");
            }
            case1.for = tech.platform.this.do.int().case() + "_" + tech.platform.this.do.int().char() + "_" + tech.platform.this.do.int().else();
            case1.class = new Timestamp(Calendar.getInstance(TimeZone.getTimeZone("GMT")).getTimeInMillis());
            case1.if = "In Progress";
            case1.void = "0%";
            case1.break = 0;
            case1.catch = 0;
            case1.boolean();
            default default1 = (default)tech.platform.const.do.if(default.class,"name = ?",new Object[] { "SERVICE" });
            if (default1 == null || default1.protected()) {
                default1 = new default();
                default1.for = "SERVICE";
                default1.if = "Activated";
                default1.int = tech.platform.this.do.int().goto().byte;
                default1.try = new Date(System.currentTimeMillis());
                default1.new = tech.platform.this.do.int().goto().byte;
                default1.byte = new Date(System.currentTimeMillis());
                default1.do = default1.throws();
            }
...

这是我获取的源代码一个示例,如您所见,有关键字用作变量和函数名称。我猜想这可能是一种源代码加密和保护。

那是什么样的加密/保护?

解决方法

那是什么样的加密/保护?

这称为混淆。有商业工具可以做这种事情。出售或分发专有软件的人在不希望您对代码进行反向工程时会使用这种工具。

被混淆的软件通常包含在软件许可协议中;例如点击后的EULA。如果您检查软件许可证,您将最有可能发现禁止反向工程。

如何正确反编译Java代码?

嗯。这取决于您的正确意思。

很显然,此处使用的混淆器所做的一件事是使用Java关键字替换字节码文件中某些Java标识符的名称。只是很难!可以通过使用其他反编译器来解决该问题,但我不推荐这样做。

但是即使您解决了这个问题,混淆器也将使用其他技术来使代码难以理解。当然,您将无法恢复原始源代码。


两个月前,我在一个网站上发现了jar文件,如果能找到所有者,我会很高兴,但是我似乎无法做到这一点。

那是不幸的。我的建议是停止尝试使用此代码!

这就是问题:如果您使用的是在某个网站上找到的某些JAR文件,并且无法跟踪作者,则可能从至少两个角度使自己面临风险:

  1. 您没有真正的方法来知道在运行计算机时代码实际上将对您的计算机执行的操作。它可能会安装后门。它可能会寻找并窃取信用卡详细信息。它可能会加密您的所有文件,并要求赎金解密。

  2. 这可能是版权巨魔;参见https://en.wikipedia.org/wiki/Copyright_troll