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

wbrvyc0a  于 2022-11-07  发布在  Java
关注(0)|答案(3)|浏览(167)

我遇到了一个在Java Tomcat服务器上运行的旧应用程序的问题,该应用程序的源代码不完全可用,但.class文件显然都在Tomcat服务器上运行。
我能以某种方式操纵.class文件的字节码(JVM使用的),从而改变变量的数据类型(因为这是必须要做的)吗?或者甚至将其反向工程为旧的.java源代码?
到目前为止,我已经使用了反编译器和javap命令。我可以以某种方式复制整个Tomcat应用程序并:
1.反编译它
1.执行我的更改
1.重新编译它?

mitkmikd

mitkmikd1#

如果你对它进行反编译,然后再重新编译,那么你就不需要直接修改字节码了。
如果更改类型,则必须更改所有方法的类型然后,您需要更改所有类中调用这些方法的方法的调用,以及保存这些值的变量的类型,等等。好消息是,如果您设法成功地反编译了它,IDE将告诉您所有这些地方在哪里,假定新类型与旧类型不兼容。
我认为这是“理论上可能的”,但有问题。由于您提供的信息很少,在您成功反编译整个应用程序后,无法知道作业的大小。

hl0ma9xz

hl0ma9xz2#

我有一个疯狂的想法;我还没做过,但只要我们讨论的是理论上可能的事情...
如果你设法反编译所有的代码,并得到一个系统,你可以重新编译和运行(我强烈建议您在进行任何更改之前这样做),如果您能够确定要将int替换为long的位置,然后确定对它的所有直接和间接引用,希望(因为这正是您在其他地方提到文件大小限制)您最终只得到少数几个类。
反编译器应该告诉你它们的名字。用完全相同的名字创建新的类,包含(当然)它们所有的反编译代码。改变你需要改变的方法。
现在,将这些类放入一个jar中,在搜索包含应用程序的jar之前搜索该jar。您将为这些类提供新的.class文件的数量限制为这些类。这使得未来的程序员更容易准确地看到更改了什么,如果它不做其他任何事情的话。这是可能的,因为Java处理其运行时的方式;在传统的编译的非虚拟机语言中,相当于“链接”的步骤发生在类加载时,而不是在编译时。

monwx1rj

monwx1rj3#

我这样做了。不完全是这样,但非常相似。我没有反编译和重新编译,这是非常漫长和乏味的,我直接编辑了类文件的字节码。
"专业人士"

  • 您根本不需要编译任何东西,只需编辑一个文件即可
  • 不需要SDK、IDE等,只需要一个Java字节代码编辑器
  • 对于小的更改,您可以通过修改单个方法来解决

缺点

  • 即使您知道自己在做什么,也非常容易出错
  • 无法像使用git那样跟踪更改
  • 可能需要修改所有依赖类
  • 在尝试编译代码之前,您应该对编译代码的外观和行为有一定的了解。
  • 你很可能会违反一两条法律,因为这不是为了“教育”的目的
  • 你将被标记为“黑客”,所有的零工都将转给你

PS:我不得不编辑一个产品的授权类,以允许更多的用户。写它的公司已经不存在了,所以购买不是一个选项。我们反正换了一个新产品,这只是暂时的。

相关问题