示例#1
0
  @Override
  public void visitMaxs(int maxStack, int maxLocals) {
    visitLabel(end);

    if (sandboxVar == 0) visitVMVMLocalVariable();
    while (newLVs.size() > 0) {
      LocalVariableNode lv = newLVs.pop();
      if (lvDescs.get(lv.index) != null) lv.desc = lvDescs.get(lv.index);
      try {
        super.visitLocalVariable(lv.name, lv.desc, lv.signature, this.start, this.end, lv.index);
        if (lv.index == sandboxVar - 1) visitVMVMLocalVariable();
      } catch (NullPointerException ex) {
        System.err.println(
            "Unable to visit local variable "
                + lv.name
                + " "
                + lv.desc
                + " (num "
                + lv.index
                + ")");
        ex.printStackTrace();
      }
    }

    super.visitMaxs(maxStack, maxLocals);
  }
示例#2
0
 @Override
 public void visitVarInsn(int opcode, int var) {
   if (var >= firstLocal - 1 && !isMain() && !name.equals("<clinit>")) {
     super.visitVarInsn(opcode, var + 1);
   } else {
     super.visitVarInsn(opcode, var);
   }
 }
示例#3
0
 @Override
 public void visitIincInsn(int var, int increment) {
   if (var >= firstLocal - 1 && !isMain() && !name.equals("<clinit>")) {
     super.visitIincInsn(var + 1, increment);
   } else {
     super.visitIincInsn(var, increment);
   }
 }
示例#4
0
 @Override
 public void visitEnd() {
   try {
     super.visitEnd();
   } catch (Exception ex) {
     //			log.error("Unable to calculate frame for method " +
     // this.className+"."+this.name+this.desc,ex);
   }
 }
示例#5
0
  @Override
  public void visitLocalVariable(
      String name, String desc, String signature, Label start, Label end, int index) {
    if (oldLVtoSandboxLV != null && oldLVtoSandboxLV.containsKey(index))
      lvDescs.put(getSboxLVMap(index), desc);
    //		if (sandboxVar == index && !sandboxVarVisited) {
    //			sandboxVarVisited = true;
    //			visitLabel(end);
    //			super.visitLocalVariable("vmvmSandboxIndx", Type.getDescriptor(VMState.class), null,
    // this.start, this.end, sandboxVar);
    //		}
    while (newLVs.size() > 0 && newLVs.peek().index < index) {
      LocalVariableNode lv = newLVs.pop();
      if (lvDescs.get(lv.index) != null) lv.desc = lvDescs.get(lv.index);
      super.visitLocalVariable(lv.name, lv.desc, lv.signature, this.start, this.end, lv.index);
    }
    if (index >= firstLocal - 1 && !isMain() && !name.equals("<clinit>")) {

      super.visitLocalVariable(name, desc, signature, start, end, index + 1);
    } else {
      super.visitLocalVariable(name, desc, signature, start, end, index);
      if (index == sandboxVar - 1) visitVMVMLocalVariable();
    }
  }
示例#6
0
 private void visitVMVMLocalVariable() {
   if (sandboxVar >= 0 && !sandboxVarVisited && isRegularClass()) {
     try {
       sandboxVarVisited = true;
       super.visitLocalVariable(
           "secretVMVMD4t4z", Type.getDescriptor(VMState.class), null, start, end, sandboxVar);
     } catch (NullPointerException ex) {
       System.err.println(
           "Unable to visit local variable vmvmSandboxIndx (num "
               + sandboxVar
               + ") [labels="
               + start
               + "; "
               + end
               + "]"
               + "[method = "
               + this.className
               + "."
               + this.name
               + this.desc);
       ex.printStackTrace();
     }
   }
 }
示例#7
0
 @Override
 public void visitCode() {
   visitLabel(start);
   super.visitCode();
 }
示例#8
0
 public void setSandboxFlag() {
   super.visitVarInsn(ASTORE, sandboxVar);
 }
示例#9
0
 public void getSandboxFlag() {
   getSandboxFlagState();
   super.visitMethodInsn(
       INVOKEVIRTUAL, Type.getInternalName(VMState.class), "getState", "()I", false);
 }
示例#10
0
 public void getSandboxFlagState() {
   super.visitVarInsn(ALOAD, sandboxVar);
 }