使用字节码修补 Jar 中的类文件

逆向工程 爪哇 修补 补丁反转 字节码
2021-06-23 17:55:28

我试图修补一个应用程序,但该应用程序需要与原始应用程序的类大小完全相同,但使用 JByteMod、Recaf 或其他任何方式编辑类文件总是会改变类文件的大小。是否可以在不更改其大小的情况下修补类文件?我有一个从 Internet 上获得的旧补丁,它具有完全相同的内容。

我试图通过放置静态字节数组而不是私有静态字节(绕过某些限制)来修补应用程序。

如何在不更改类文件大小的情况下执行此操作?jar 文件需要 Java 9.0.4 才能运行,我已经尝试过JBE 字节码 deitorhttp : //set.ee/jbe/但它无法打开类文件。

老版本破解&原文件对比

未修改的私有字节

想改成这样的数组字节

2个回答

您可以发布类文件以及要对其进行的更改吗?根据变化,它应该是可能的。显然,如果您想添加大量新代码或数据,那么在不更改大小的情况下是不可能的,除非您从类文件中删除相应的现有代码。

无论如何,Krakatau能够在不改变大小的情况下编辑类文件。特别是,如果您以往返模式反汇编一个类文件,然后不加修改地重新组合它,您将得到准确的类文件。但是,它仍然需要字节码和类文件格式的知识来了解可以在不影响大小的情况下进行哪些更改,或者删除哪些内容以平衡大小的增加。

话虽如此,这可能不是一种富有成效的方法。如果 jar 正在检查类文件大小,则它可能还会进行其他完整性检查。最好的办法是找到完整性检查并删除它们。

根据您的用例以及您运行 jar 文件的方式,如果您可以运行该文件,您可能想要创建一个挂钩到您的 JVM ( java -jar -javaagent:YourAgent.jar Target.jar)的 Java 代理,并且您可以使用ASMJavassist库在运行时更改字节码.

对于添加字段或改变它在ASM你可以重写你visitFieldvisitMethod你的变压器类函数继承ClassVisitor在该visitField方法中,您可以创建一个新字段或更改变量的值,而无需修改实际的类文件。