2009-09-10 73 views
0

我正在使用ASM为Java程序执行字节码检测。我正在做的事情很简单 - 在检测方法时,如果指令是PUTFIELD,只需在指令前面执行DUP_X1,然后访问PUTFIELD并使用包含DUP的堆栈条目的参数注入函数调用。生成Java验证器错误的字节码工具

   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"); 
        } 

       } 

的代码看起来像在此之前和仪器仪表,分别AFTER:

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的:希望找到对象/数组在堆栈上

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

+0

你确定它在抱怨修改过的setA方法吗? – 2009-09-10 05:11:24

+0

这不是抱怨setA方法马丁 - 这是一个敏锐的观察。你认为我应该研究它抱怨的实际方法吗?它似乎与内部类有关。 – 2009-09-10 16:50:42

+0

这与内部类有关 - 但我不知道为什么这很重要 – 2009-09-10 18:18:34

回答

2

仪器中有一些漏洞。例如,它不检查你是否在静态方法内,所以这个变量是存在的。

+0

沿着时间前解决,但你是正确的。当然你是正确的,你是ASM的作者!!!再次感谢,我是一个巨大的粉丝 – 2010-10-15 14:37:01