我有几个加密的类。类加载器必须在 JVM 中执行之前解密它们。
问题是,如何以及在哪里?
我该怎么做才能了解谁负责在部署之前解密这些类?
我有几个加密的类。类加载器必须在 JVM 中执行之前解密它们。
问题是,如何以及在哪里?
我该怎么做才能了解谁负责在部署之前解密这些类?
找出哪些可见类实现了java.lang.ClassLoader.
然后你可以看看它findClass和findResource实现。
我也有这个问题,我试图反编译一些 java 类,但它们都被加密了,我认为在我描述如何实际进行解密之前,我想提到一个不明显的解决方案,那就是:
(1) 尝试找到不包含加密类的旧版本软件。如果它是一个公共应用程序,您可能可以在 archive.org 上找到旧版本,并且很可能这些类在旧版本中没有加密。
但是,如果您被加密的 jar 或从本机应用程序加载的 Java 应用程序困住,那么有一种非常明显的解密方法,并且在这篇 infoworld 文章中描述了如何执行此操作的原理。但这些只是原则,你如何在实践中做到这一点?
我发现的最明显的方法是转储 jvm 加载的类。这篇文章描述了对 .class 文件进行的编辑,这几乎完全可以做到这一点,但是如果您的类文件是由 .exe 或其他东西加载的,则很难做到这一点。无论您是试图解密由 .exe/.dmg/.jar 加载的 java 类,它都必须在某个时候触及 jvm - 我认为。知道了这一点,我们可以使用外部工具进行转储,而不是编辑java程序来转储自己的文件。
在高层次上,这样做的方法是:
下载dumpclass.jar - 这是外部工具,可以查看 jvm 并转储我们关心的类。
设置 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 应用程序...
使用 jdk 中的 jvm 运行 dumpclass.jar 并确保它可以显示使用消息
然后你可以用你想要解密的java类获取java应用程序的进程,如果这是一个exe,你将使用exe进程ID。
对进程 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