微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

反向工程 Java *.class 文件以更改变量的数据类型

如何解决反向工程 Java *.class 文件以更改变量的数据类型

我有一个运行在 Java Tomcat 服务器上的旧应用程序的问题,该应用程序的源代码不完全可用,但 .class 文件显然都在 tomcat 服务器上运行。

我能否以某种方式操纵 .class 文件(由 JVM 使用)的字节码,以便我可以更改变量数据类型(因为这是必须要做的)?或者甚至将其逆向工程为旧的 .java 源代码

到目前为止,我已经使用过反编译器和 javap 命令。我可以以某种方式复制整个 Tomcat 应用程序并:

  1. 反编译
  2. 做我的改变
  3. 重新编译?

解决方法

好吧,如果您将其反编译以进行更改并重新编译,那么您将不需要直接更改字节码。

如果更改类型,则必须更改使用该变量的任何方法(如 getter 和 setter)的类型。然后,您需要更改调用这些方法的所有类中的任何方法的调用,以及保存这些值的变量类型等。好消息是,如果您设法成功反编译,您的 IDE 将告诉你所有这些地方在哪里,假设新类型与旧类型不兼容。

我会将此评估为“理论上可行”,但存在问题。凭借您提供给我们的少量信息,您无法在成功反编译整个应用程序后知道作业的大小。

,

我有一个疯狂而疯狂的想法;我还没有这样做,但只要我们谈论的是理论上可能的事情......

如果您设法反编译所有代码并获得一个可以重新编译和运行的系统(我强烈建议您在进行任何更改之前这样做),如果您能够确定您想要的 int 位置替换为一个长的,然后是对它的所有直接和间接引用,希望(因为这只是你在别处提到的这个文件大小限制)你最终只有少数几个类。

反编译应该告诉你他们的名字。创建具有完全相同名称的新类,其中包含(当然)所有的反编译代码。改变你需要改变的方法。

现在将这些类放在一个 jar 中,该 jar 在包含应用程序的 jar 之前搜索。您将为其提供新 .class 文件的类数量限制为仅这些。如果它不执行任何其他操作,那么对于未来的程序员来说,这可以更容易地准确查看已更改的内容。这是可能的,因为 Java 处理其运行时的方式;与传统编译型非虚拟机语言中的“链接”等效的步骤发生在类加载时,而不是在编译时。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。