Java - 解密 jar 文件中的加密类

逆向工程 加密 爪哇 字节码
2021-07-01 21:51:09

我有几个加密的类。类加载器必须在 JVM 中执行之前解密它们。

问题是,如何以及在哪里?

我该怎么做才能了解谁负责在部署之前解密这些类?

2个回答

找出哪些可见类实现了java.lang.ClassLoader.

然后你可以看看它findClassfindResource实现。

我也有这个问题,我试图反编译一些 java 类,但它们都被加密了,我认为在我描述如何实际进行解密之前,我想提到一个不明显的解决方案,那就是:

(1) 尝试找到不包含加密类的旧版本软件。如果它是一个公共应用程序,您可能可以在 archive.org 上找到旧版本,并且很可能这些类在旧版本中没有加密。


但是,如果您被加密的 jar 或从本机应用程序加载的 Java 应用程序困住,那么有一种非常明显的解密方法,并且在这篇 infoworld 文章中描述了如何执行此操作的原理但这些只是原则,你如何在实践中做到这一点?

我发现的最明显的方法是转储 jvm 加载的类。这篇文章描述了对 .class 文件进行的编辑,这几乎完全可以做到这一点,但是如果您的类文件是由 .exe 或其他东西加载的,则很难做到这一点。无论您是试图解密由 .exe/.dmg/.jar 加载的 java 类,它都必须在某个时候触及 jvm - 我认为。知道了这一点,我们可以使用外部工具进行转储,而不是编辑java程序来转储自己的文件。

在高层次上,这样做的方法是:

  1. 下载dumpclass.jar - 这是外部工具,可以查看 jvm 并转储我们关心的类。

  2. 设置 dumpclass.jar - 这一步有点烦人,因为 dumpclass.jar 需要在运行加密 java 类的同一个 jvm 上运行。更难的是 dumpclass.jar 依赖于 jdk 的某些部分,如果您的应用程序使用 .exe 来启动自己,那么使用特定的 jvm(如 jdk 中的那个)来启动可能会非常困难它。此外,如果您的 java 应用程序仅在不支持 dumpclass.jar 的旧版本 jvm 上运行,或者仅/jre/在您的计算机上找到文件夹时才认为安装了 java,则可能会很困难,尽管您设置了JVM_HOME环境变量到。这一步实际上很烦人,而且很难给出一步一步的描述,因为它在很大程度上取决于你试图逆向工程的内容。但是,假设您的 java 应用程序可以在高于 1.6 的 jvm 上运行,因为在此之前 dumpclass 的一个依赖项以一种奇怪的方式工作,那么理想情况下您将: (1a) 安装您选择的 jdk(!)。(1b) 使用 jdk 中的 jvm 运行您的 java 应用程序...

  3. 使用 jdk 中的 jvm 运行 dumpclass.jar 并确保它可以显示使用消息

  4. 然后你可以用你想要解密的java类获取java应用程序的进程,如果这是一个exe,你将使用exe进程ID。

  5. 对进程 id 运行 dumpclass.jar 命令,稍作修改。原始命令要求您提供一个过滤器,以便您不会获得 jvm 上的每个类。但是,我认为在 jvm 中获取每个类并在它们被转储后浏览到您正在寻找的类要简单得多。具体来说,虽然 dumpclass 文档说你应该这样做java -jar dumpclass.jar -p 4345 *StringUtils而不是这样做java -jar dumpclass.jar -p 4345- 文件应该全部转储在 dumpclass jar 的位置旁边。然后您可以浏览它们以找到您关心的应用程序的解密 .class 文件。

注意:如果 dumpclass 在您运行后显示 0 个类被转储,但需要一段时间进行转储,请忽略它,这些类已被转储,并且由于某种原因它没有报告正确的类数。如果您没有看到 dumpclass.jar 旁边的类,请尝试明确设置输出路径。

其他一些提示:

  • 如果您遇到有关的错误,SwDbgSrv请在此处查看我的答案:https : //stackoverflow.com/questions/10783256/how-to-start-swdbgsrv-exe-in-windows-7/64321750#64321750
  • 解密后使用bytecode-viewer反编译类,真的很好
  • 如果您遇到有关缺少 Java 库的其他错误,那么 dumpclass 可能没有使用 jdk jvm,在这种情况下,您必须确保它是,或者将库从 jdk jvm 复制到 jre jvm。例如,这发生在我的 sa-jdi.jar 中,它包含在 jdk 中,但是因为我使用的是 jre jvm,因为我试图反编译的应用程序找不到 jdk,我遇到了大量错误. 我最终尝试仅从 google 搜索中下载 .jar,这导致了更多错误。如果您遇到这种情况,您几乎只需要为您的 jre 版本下载 jdk,然后将它无法从 jdk 找到的特定库复制到 jre。只有几个。