使用dirtJOE编辑类文件后出现VerifyError

逆向工程 爪哇 字节码
2021-07-11 04:18:48

我正在使用dirtyJOE来编辑类文件的方法。

原始类文件有一些加密方法调用等。我已经改变了方法 ldc (byte-code: 12 1E) 的字节码来加载 true 和 return(byte-code: 12 1E)

显然,Java 的验证器对我的更改感到不满,并抱怨验证错误:

java.lang.VerifyError: 在方法[methodName]中的偏移量 2 at.. at.. 中需要堆栈映射帧

我想知道是否有办法让 jvm 认为存在堆栈映射帧?

谢谢

1个回答

如果原始类没有使用 StackMapTables,那么应该没有问题,假设您正确修改了字节码。即使它正在使用它们,通常也可以删除它们并恢复到旧的行为。假设该类不使用invokedynamic,您可以将版本改回49.0并删除 StackMapTable 属性。

不幸的是,51.0 版要求使用 StackMapTable,在手动编辑字节码时创建它很痛苦。如果您的类实际上正在使用 51.0 功能(即invokedynamic),那么您唯一的选择就是创建适当的堆栈帧。在像这样的简单情况下,您可以手动完成,但通常最好使用工具自动生成堆栈帧。