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

Posted

技术标签:

【中文标题】逆向工程 Java *.class 文件以更改变量的数据类型【英文标题】:Reverse Engineer Java *.class file to change data type of variable 【发布时间】:2021-05-03 11:53:07 【问题描述】:

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

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

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

    反编译 做我的改变 重新编译?

【问题讨论】:

这会不会产生滚雪球效应,要求您修改甚至依赖于您修改过的类的其他类?对于可能访问不会从已编译类中反编译的值的本机方法,您将如何处理? 是的,我知道这可能会发生,但该变量是上传操作到本地服务器的文件大小限制,他们希望它更大。所以基本上从客户的角度来看,我们被告知“我们知道我们在做什么”,无论这意味着什么...... 这似乎有点幼稚。改变变量的类型不会改变程序逻辑。限制由存储在变量中的 施加。因此,您必须更改所有负责确定该值并将其分配给变量的代码。然后,有代码使用该变量。如果原始作者使用较小的数据类型创建变量,则使用它的代码不太可能处理较大的数据类型。这可能意味着执行实际上传的代码无法处理它。 【参考方案1】:

好吧,如果你反编译它来进行更改并重新编译,那么你就不需要直接更改字节码了。

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

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

【讨论】:

更不用说,创建新代码来解决这个问题可能比直接操作字节码容易 10 倍。那么,为什么还要尝试呢? 这正是我的想法,但是客户...... 所以基本上是要把一个变量从整型改成长整型。 好吧,好消息是eclipse,可能还有Java编译器,在需要int时标记用户long。我怕它不会。所以编译器会告诉你所有你需要改变的地方。如果您将其存储在任何地方的数据库中,复杂性就会激增。【参考方案2】:

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

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

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

现在将这些类放在一个 jar 中,该 jar 在包含应用程序的 jar 之前被搜索。您将要为其提供新 .class 文件的类的数量仅限于这些类。如果它没有做任何其他事情,这使得未来的程序员更容易准确地看到发生了什么变化。这是可能的,因为 Java 处理其运行时的方式;相当于传统编译的非虚拟机语言中的“链接”的步骤发生在加载类时,而不是在编译时。

【讨论】:

【参考方案3】:

我做到了。不完全是这样,但非常相似。我没有反编译和重新编译,很长,很繁琐,我直接编辑了class文件的字节码。

专业人士

你根本不需要编译任何东西,你只需编辑一个文件 不需要 SDK、IDE 等,只需一个 java 字节代码编辑器 对于小的更改,您可以通过单一方法修改来摆脱困境

缺点

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

PS:我必须编辑产品的许可类别以允许更多用户。编写它的公司不复存在,因此购买不是一种选择。不管怎样,我们换了一个新产品,这只是暂时的。

【讨论】:

以上是关于逆向工程 Java *.class 文件以更改变量的数据类型的主要内容,如果未能解决你的问题,请参考以下文章

用tomcat发布的工程如果更改了CLASS文件怎么能不重启tomcat服务!

JAVA中获取工程路径的方法

如何更改MapStruct生成的* .java文件的位置?

Myeclipse中的Java工程报错,表示找不到class文件,clean工程后编译的class文件全部消失了。如何解决。

java中怎样获取当前路径的绝对路径

软件工程第二次作业