直接修改class文件

出于某种原因,我们可能会想修改class文件。
比较直接了当的,是通过16进制编辑器直接修改。
效果也是最直接的。

准备工具:jclasslib_windows_3_0
和hex workshop
其中jclasslib_windows_3_0是一个GUI程序,很方便显示类文件的java虚拟机操作码。
相关这方面的文章,网络上也很多。


一点小心得:
修改中,有时想将相关操作码修改成空操作(nop)
后来运行时候,报错,栈的长度问题,后来采用纯出栈(pop)操作,解决问题。
呵呵,这点很管用,往往经过一堆运算,后面就是赋值(astore_2),若不想看到结果,
就直接出栈好了。

附件操作码参考文档来源于优快云 作者 benq998
如果需要直接修改 `.class` 文件的反编译工具,以下几种工具可以满足需求,并在不同程度上支持对 Java 字节码进行编辑和操作: ### 1. **JD-GUI + JD-Eclipse 或其他插件** - JD-GUI 是一个图形界面工具,能够将 `.class` 和 `.jar` 文件反编译为 `.java` 源代码,便于查看和理解。虽然它本身不支持直接修改 `.class` 文件并重新编译回字节码,但可以通过集成 JD-Eclipse 插件(如 Eclipse IDE 中使用)实现一定程度的源代码编辑和调试功能。 - 用户可以在 JD-GUI 中查看反编译后的源码,然后手动在开发环境中重建类文件并进行修改[^3]。 ### 2. **JAD + UuDeJava** - JAD 是一款经典的 Java 反汇编工具,UuDeJava 是其封装版本之一,允许用户将 `.class` 文件反编译为 `.java` 源代码,并输出到与原始 `.class` 文件相同的目录中。这种工具链适合快速查看和修改源代码后重新编译生成新的 `.class` 文件。 - 使用 UuDeJava 时,只需右键点击 `.class` 文件并选择“发送到 UuDeJava”,即可自动执行反编译过程[^2]。 ### 3. **CFR (Class File Reader)** - CFR 是一个现代且活跃维护的 Java 反编译工具,能够处理较新版本的 Java 字节码(包括 Java 8 到 Java 17)。CFR 支持命令行操作,也提供 GUI 版本(如 Bytecode Viewer),可用于分析和修改 `.class` 文件。 - 它的优点在于对 lambda 表达式、模块系统等新特性有较好的支持,适合需要深入研究或重构旧项目的开发者。 ### 4. **Procyon** - Procyon 是另一个强大的开源 Java 反编译器,尤其擅长处理复杂的语言结构,例如匿名内部类、枚举等。Procyon 提供了高质量的反编译结果,适合需要对 `.class` 文件进行精细修改的情况。 - 虽然 Procyon 不具备图形界面,但可以通过命令行方式运行,并结合其他工具(如 ASM 或 ByteBuddy)进行字节码操作和修改。 ### 5. **ASM / ByteBuddy / Javassist** - 如果目标是直接操作 `.class` 文件中的字节码而非将其还原为源代码,ASM、ByteBuddy 和 Javassist 是更底层但功能强大的库。 - 这些库允许开发者以编程方式读取、修改和写入 `.class` 文件的内容,适用于 AOP 编程、性能监控、动态代理等场景。 - 例如,使用 ASM 修改方法体的代码示例如下: ```java ClassReader reader = new ClassReader("com.example.MyClass"); ClassWriter writer = new ClassWriter(reader, ClassWriter.COMPUTE_FRAMES); ClassVisitor visitor = new ClassVisitor(ASM9, writer) { @Override public MethodVisitor visitMethod(int access, String name, String descriptor, String signature, String[] exceptions) { MethodVisitor mv = super.visitMethod(access, name, descriptor, signature, exceptions); return new MethodVisitor(ASM9, mv) { @Override public void visitInsn(int opcode) { if (opcode >= IRETURN && opcode <= RETURN) { // 在方法返回前插入一条打印语句 mv.visitFieldInsn(GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;"); mv.visitLdcInsn("Method ended."); mv.visitMethodInsn(INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V", false); } super.visitInsn(opcode); } }; } }; reader.accept(visitor, ClassReader.EXPAND_FRAMES); byte[] modifiedClass = writer.toByteArray(); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值