⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 peephole.java

📁 一个用于对.class文件进行插桩的开源工具
💻 JAVA
字号:
import java.io.*;import java.util.Iterator;import org.apache.bcel.classfile.*;import org.apache.bcel.generic.*;import org.apache.bcel.Repository;import org.apache.bcel.util.InstructionFinder;public class Peephole {  public static void main(String[] argv) {    try {      /* Load the class from CLASSPATH.       */      JavaClass       clazz   = Repository.lookupClass(argv[0]);      Method[]        methods = clazz.getMethods();      ConstantPoolGen cp      = new ConstantPoolGen(clazz.getConstantPool());      for(int i=0; i < methods.length; i++) {	if(!(methods[i].isAbstract() || methods[i].isNative())) {	  MethodGen mg       = new MethodGen(methods[i],					     clazz.getClassName(), cp);	  Method    stripped = removeNOPs(mg);	  	  if(stripped != null)     // Any NOPs stripped?	    methods[i] = stripped; // Overwrite with stripped method	}      }      /* Dump the class to <class name>_.class       */      clazz.setConstantPool(cp.getFinalConstantPool());      clazz.dump(clazz.getClassName() + "_.class");    } catch(Exception e) { e.printStackTrace(); }  }  private static final Method removeNOPs(MethodGen mg) {    InstructionList   il    = mg.getInstructionList();    InstructionFinder f     = new InstructionFinder(il);    String            pat   = "NOP+"; // Find at least one NOP    InstructionHandle next  = null;    int               count = 0;    for(Iterator i = f.search(pat); i.hasNext(); ) {      InstructionHandle[] match = (InstructionHandle[])e.next();      InstructionHandle   first = match[0];      InstructionHandle   last  = match[match.length - 1];            /* Some nasty Java compilers may add NOP at end of method.       */      if((next = last.getNext()) == null)	break;      count += match.length;      /* Delete NOPs and redirect any references to them to the following       * (non-nop) instruction.       */      try {	il.delete(first, last);      } catch(TargetLostException e) {	InstructionHandle[] targets = e.getTargets();	for(int i=0; i < targets.length; i++) {	  InstructionTargeter[] targeters = targets[i].getTargeters();	  	  for(int j=0; j < targeters.length; j++)	    targeters[j].updateTarget(targets[i], next);	}      }    }    Method m = null;        if(count > 0) {      System.out.println("Removed " + count + " NOP instructions from method " +			 mg.getName());      m = mg.getMethod();    }    il.dispose(); // Reuse instruction handles    return m;  }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -