繁体   English   中英

如何从已编译的Java类/ jar文件中删除方法?

[英]How to remove a method from a compiled Java class/jar file?

我有一个JAR文件,有一个静态类,我无法反编译它,它搞砸了。 其中有一个方法,它返回一个不存在的类。 不知道如何,但我得到NoClassDefFoundError 即使我没有使用那种方法,它仍然会崩溃。 所以我需要以某种方式删除它,它应该工作正常。 我知道可以使用Reflection或Javassist,但不知道如何使用。

请注意,这显然不适用于生产版本,只是一些白帽黑客攻击。

我认为你错了:如果永远不会调用那个方法,那么JVM 很可能不会尝试加载该类。

你看,班级加载的重点 - 它发生了懒惰 ; 当你加载类X,并且X需要Y,Z ...时,只有在执行需要加载Y,Z的代码时才加载Y和Z.

换句话说:NoClassDefFound错误实际上告诉您某些东西 (可能是JAR中的某个静态init)正在调用该方法。

因此,解决方案不是“删除”一个方法(这将导致另一个异常,如MethodNotFound!)。 相反,您应该尝试创建一个虚拟类,以便根本不会遇到该异常。 或者:您的JAR至少缺少一个依赖项。 您可以尝试解决该依赖关系 - 也许您可以在某处找到该类,或者,您“构建”自己的版本(第二个想法可能很难得到正确)。

GhostCat已经解释了为什么你的问题没有删除方法。 但我想我应该回答原来的问题以防其他人在想。

从类文件中删除方法的最佳方法是使用Krakatau对其进行反汇编,从.j文件中删除所需的方法,然后重新组合它。 这个方法允许你编辑任何类文件,无论多么奇怪。 (如果您发现Krakatau反汇编程序无法处理的任何有效类文件,请提交错误)。

在反汇编时,您可能还想传递-roundtrip选项。 这不是正确性所必需的,但它可以防止重新排列常量池,从而减少生成的类文件的二进制差异。 另一方面, -roundtrip也使得在.j文件中找到所需方法变得更加困难。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM