在混淆的 Java 字节码中重命名实体

逆向工程 反编译 安卓 爪哇 去混淆
2021-07-08 23:39:36

我正在使用 SDK 来开发作为 AAR 分发的应用程序,并且已经使用 ProGuard 进行了混淆。我只是想扭转它所做的一些事情。类、方法和变量已被混淆,我很确定 ProGuard。我一直在寻找一种工具链,它可以为我提供比当前更好的工作流程,但找不到我需要的东西。

这是我现在正在做的事情:

  • 在Android Studio中创建了一个示例应用,调用SDK中我关心的东西
  • 设置断点并进入我感兴趣的代码
  • 使用 Android Studio 反编译(我没想到它会这样,太棒了!),开始计算不同的变量、方法和类的用途,并为它们命名。
  • 将这些名称写在 ASCII 注释文件中以供参考
  • 在我的笔记和代码之间来回切换,当我的大脑失去对我试图保留在脑海中的所有映射的控制时尖叫

这是我想要做的:

  • 在 Android Studio 中运行我的示例应用程序,像以前一样进入混淆的字节码
  • 当我找出一个方法时,在代码浏览器中重新标记它,让重新标记传播到该方法的所有调用,类似于许多 IDE 中的“重构”操作
  • 恢复理智,看看我的家人,取得进步

我认为某种 baksmali / smali 解析器 / smali 汇编器过程应该可以实现这一点,但我还找不到任何可以做到的东西。 Virtuous Ten可能能够做到,但它以不清楚的方式试图在我的 SDK jar 上生成 smali。当我在我的 jar 上运行它时,我得到零 smali 或 java。

有任何想法吗?

2个回答

您可能想尝试jadx,它从 v0.6.1 开始支持反编译 *.aar。您可以将反编译的代码保存为 Gradle 项目,然后您可以在 Android Studio 中打开它并进行重构。


或者,请注意*.aar基本上是捆绑在一起的 *.jar 和 Android 资源。你不能使用 baksmali,*.jar 仍然包含 JVM 字节码并且没有转换为 dex!你只需要:

  1. 将 *.aar 重命名为 *.zip 并解压
  2. 反编译 classes.jar
  3. 使用反编译的 *.java 文件创建一个项目
  4. 使用“重构”重命名等。

这两种方法都只支持静态分析,你不能使用反编译结果来调试应用程序。除非实际上可以编译反编译结果,否则您可以将示例代码与其链接而不是库。

此外,如果真正的代码是用 NDK 编译的,这些也无济于事(在解压 *.aar 时检查是否有任何 *.so 文件)。

当我找出一个方法时,在代码浏览器中重新标记它,让重新标记传播到该方法的所有调用,类似于许多 IDE 中的“重构”操作

虽然我的项目没有 IDE 集成,但我认为我完全符合您的要求。主要是因为我出于类似的原因制作了它

它是一个使用 CFR 反编译代码但将类和成员名称链接到反编译文本的 GUI。要重命名它们,您只需单击名称或成员,输入新名称并按 Enter。您可以将更改导出为文本文件或更新的 jar 文件。