【问题标题】:Bytecode instrumentation generating java verifier error字节码检测生成 java 验证程序错误
【发布时间】:2009-09-10 01:12:57
【问题描述】:

我正在使用 ASM 来为 Java 程序进行字节码检测。我所做的很简单 - 在检测方法时,如果指令是 PUTFIELD,只需在指令之前执行 DUP_X1,然后访问 PUTFIELD 并使用包含 DUP 的堆栈条目的参数注入函数调用。

                public void visitFieldInsn(
                                int opcode,
                                String owner,  // owner of this field...
                                String name,
                                String desc) {

                    boolean did_dup = false;

                    if(opcode == Opcodes.PUTFIELD) {
                        if(!owner.equals("java/lang/System")) {
                            if (desc.startsWith("L")) {
                                mv.visitInsn(Opcodes.DUP_X1);                                       
                                did_dup = true;
                            }
                        }

                    } 

                    mv.visitFieldInsn(opcode, owner, name, desc);

                    if (did_dup) {
                        mv.visitVarInsn(Opcodes.ALOAD, 0);
                        mv.visitMethodInsn(Opcodes.INVOKESTATIC, "com/amir/ASide", "updateG", "(Ljava/lang/Object;Ljava/lang/Object;)V");
                    }

                 }

代码在检测之前和之后分别如下所示:

public void setA(ClassA classa)
{
    refA = classa;
    eyeColor = classa.eyeColor;
}


public void setA(ClassA classa)
{
    ASide.updateG(refA = classa, this);
    ASide.updateG(eyeColor = classa.eyeColor, this);
}

但是当我运行检测代码时,我得到:

java.lang.VerifyError: Expecting to find object/array on stack

你能提供这方面的帮助吗?

【问题讨论】:

  • 你确定是在抱怨修改后的 setA 方法吗?
  • 这不是在抱怨 setA 方法 Martin - 这是一个敏锐的观察。你认为我应该调查它抱怨的实际方法吗?它似乎与内部类有关。
  • 这与内部类有关 - 但我不确定为什么这很重要。

标签: java assembly bytecode instrumentation java-bytecode-asm


【解决方案1】:

您的仪器中有一些漏洞。例如,它不会检查您是否在静态方法中,因此存在此变量。

【讨论】:

  • 很久以前就解决了,但你是对的。当然你是对的,你是 ASM 的作者!!!再次感谢,我是超级粉丝
猜你喜欢
  • 2013-04-27
  • 1970-01-01
  • 2022-01-24
  • 2010-09-12
  • 2023-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多