反编译的 Java 类跨越多个文件

逆向工程 反编译 爪哇 去混淆
2021-07-01 00:03:04

我一直在尝试将 Android 应用程序从 dex/jar 文件反编译为 java 源代码,并取得了不同程度的成功。我已经尝试了常见的嫌疑犯 - JD-GUI、procyon、cfr、krakatau 和 jadx。我在一个特定的应用程序上遇到了一个特定的问题,因为它被混淆了,而且许多类似乎被分成多个文件。AFAIK,这在 Java 中是不允许的。

此外,这些类似乎扩展了多个基类,例如 a 类扩展了 Activity,而 a 类(或重命名为其他东西,但我知道实际上是 a 类,因为它试图直接访问 a 的私有成员变量)扩展 BroadcastReceiver。AFAIK,这在 Java 中也是不允许的。

结果,反编译出来的代码错误百出,难以理解。我不期望从反编译代码中得到可编译的代码,但我确实希望至少能够执行有意义的静态分析,当反编译的源代码不遵循 Java 约定时,这很难做到。

有关如何解决此反编译问题的任何帮助?

谢谢。

1个回答

Krakatau 不可能生成这样的 java 文件,我想其他反编译器也是如此。但是,我可以想到一些可能会导致您困惑的事情。

首先,Java 中的嵌套类和内部类被认为是独立的类并被编译成单独的类文件。即使对于匿名类也是如此,例如每次使用双括号初始化模式时。根据反编译器和设置,这些类可能会被独立反编译或合并回一个文件。这是我能想到的唯一可以被描述为“分成多个文件”的类。

对于一个类扩展多个超类,这显然也是不可能的(虽然一个接口可以扩展多个超接口)。最有可能发生的事情是你混淆了一个类和它的嵌套类。

例如,您可以拥有主类 A,它是 Activity 的子类。然后 A 有一个嵌套类,比如说 A$1,它是 BroadcastReceiver 的子类。作为嵌套类,A$1 当然可以访问 A 的私有成员。(请注意,这在字节码级别从技术上讲是不正确的。私有成员由编译器生成的包装器间接访问,根据您使用的反编译器,可能会或可能不会显示)。

或者,您可能会混淆具有相似名称的不相关类,例如 A 和 a。

PS Krakatau 是显式显示编译器生成的访问器的反编译器之一,因此您绝对不应该看到对其他类的私有成员的直接访问。如果您提供正在分析的应用程序和相关课程,我可以尝试弄清楚发生了什么。