我遇到了一个在Java Tomcat服务器上运行的旧应用程序的问题,该应用程序的源代码不完全可用,但.class文件显然都在Tomcat服务器上运行。我能以某种方式操纵.class文件的字节码(JVM使用的),从而改变变量的数据类型(因为这是必须要做的)吗?或者甚至将其反向工程为旧的.java源代码?到目前为止,我已经使用了反编译器和javap命令。我可以以某种方式复制整个Tomcat应用程序并:1.反编译它1.执行我的更改1.重新编译它?
mitkmikd1#
如果你对它进行反编译,然后再重新编译,那么你就不需要直接修改字节码了。如果更改类型,则必须更改所有方法的类型然后,您需要更改所有类中调用这些方法的方法的调用,以及保存这些值的变量的类型,等等。好消息是,如果您设法成功地反编译了它,IDE将告诉您所有这些地方在哪里,假定新类型与旧类型不兼容。我认为这是“理论上可能的”,但有问题。由于您提供的信息很少,在您成功反编译整个应用程序后,无法知道作业的大小。
hl0ma9xz2#
我有一个疯狂的想法;我还没做过,但只要我们讨论的是理论上可能的事情...如果你设法反编译所有的代码,并得到一个系统,你可以重新编译和运行(我强烈建议您在进行任何更改之前这样做),如果您能够确定要将int替换为long的位置,然后确定对它的所有直接和间接引用,希望(因为这正是您在其他地方提到文件大小限制)您最终只得到少数几个类。反编译器应该告诉你它们的名字。用完全相同的名字创建新的类,包含(当然)它们所有的反编译代码。改变你需要改变的方法。现在,将这些类放入一个jar中,在搜索包含应用程序的jar之前搜索该jar。您将为这些类提供新的.class文件的数量限制为这些类。这使得未来的程序员更容易准确地看到更改了什么,如果它不做其他任何事情的话。这是可能的,因为Java处理其运行时的方式;在传统的编译的非虚拟机语言中,相当于“链接”的步骤发生在类加载时,而不是在编译时。
monwx1rj3#
我这样做了。不完全是这样,但非常相似。我没有反编译和重新编译,这是非常漫长和乏味的,我直接编辑了类文件的字节码。"专业人士"
缺点
PS:我不得不编辑一个产品的授权类,以允许更多的用户。写它的公司已经不存在了,所以购买不是一个选项。我们反正换了一个新产品,这只是暂时的。
3条答案
按热度按时间mitkmikd1#
如果你对它进行反编译,然后再重新编译,那么你就不需要直接修改字节码了。
如果更改类型,则必须更改所有方法的类型然后,您需要更改所有类中调用这些方法的方法的调用,以及保存这些值的变量的类型,等等。好消息是,如果您设法成功地反编译了它,IDE将告诉您所有这些地方在哪里,假定新类型与旧类型不兼容。
我认为这是“理论上可能的”,但有问题。由于您提供的信息很少,在您成功反编译整个应用程序后,无法知道作业的大小。
hl0ma9xz2#
我有一个疯狂的想法;我还没做过,但只要我们讨论的是理论上可能的事情...
如果你设法反编译所有的代码,并得到一个系统,你可以重新编译和运行(我强烈建议您在进行任何更改之前这样做),如果您能够确定要将int替换为long的位置,然后确定对它的所有直接和间接引用,希望(因为这正是您在其他地方提到文件大小限制)您最终只得到少数几个类。
反编译器应该告诉你它们的名字。用完全相同的名字创建新的类,包含(当然)它们所有的反编译代码。改变你需要改变的方法。
现在,将这些类放入一个jar中,在搜索包含应用程序的jar之前搜索该jar。您将为这些类提供新的.class文件的数量限制为这些类。这使得未来的程序员更容易准确地看到更改了什么,如果它不做其他任何事情的话。这是可能的,因为Java处理其运行时的方式;在传统的编译的非虚拟机语言中,相当于“链接”的步骤发生在类加载时,而不是在编译时。
monwx1rj3#
我这样做了。不完全是这样,但非常相似。我没有反编译和重新编译,这是非常漫长和乏味的,我直接编辑了类文件的字节码。
"专业人士"
缺点
PS:我不得不编辑一个产品的授权类,以允许更多的用户。写它的公司已经不存在了,所以购买不是一个选项。我们反正换了一个新产品,这只是暂时的。