All pastes #375183 Raw Edit

Unnamed

public text v1 · immutable
#375183 ·published 2007-02-28 01:57 UTC
rendered paste body
import org.apache.bcel.classfile.JavaClass;
import org.apache.bcel.classfile.ClassParser;
import org.apache.bcel.classfile.Method;
import org.apache.bcel.generic.*;
import org.apache.bcel.Constants;

import java.io.FileOutputStream;

public class BCELplay {
    public static void main(String[] args) {
        new BCELplay();
    }

    public BCELplay() {
        try {
            w("Parsing HelloWorld.class");
            JavaClass j = new ClassParser("HelloWorld.class").parse();
            w("Making ClassGen for HelloWorld.class");
            ClassGen cg = new ClassGen(j);
            w("Getting the ConstantPoolGen.");
            ConstantPoolGen cp = cg.getConstantPool();
            w("Creating Instruction Factory");
            InstructionFactory _if = new InstructionFactory(cg, cp);
            w("Listing the methods!");
            getMethods(cg);
            w("Injecting Method");
            inject(cp, cg);
            w("Dumping the file!");
            cg.getJavaClass().dump(new FileOutputStream("HelloWorld.class"));
            w("Relisting Methods, seeing if it REALLY injected..");
            getMethods(cg);
        } catch(Exception e) {
            e.printStackTrace();
        }
    }

    public void getMethods(ClassGen _cg) {
        for(Method m : _cg.getMethods()) {
            System.out.println("Method in '"+_cg.getClassName()+"': "+m);
        }
    }

    public void w(String l) {
        System.out.println(l);
    }

    //injectInMain() -- Was gonna try to get a reference into the main method, so it calls the method.
    public void injectInMain(ClassGen cg, ConstantPoolGen cp, InstructionFactory _if) {
        for(Method m : cg.getMethods()) {
            if(m.getName().equalsIgnoreCase("main")) {
                Method mainMethod = m;
                MethodGen method = new MethodGen(mainMethod, mainMethod.getClass().getName(), cp);
                InstructionList il = method.getInstructionList();
                il.append(_if.createInvoke("HelloWorld", "hai", Type.NULL, Type.NO_ARGS, Constants.INVOKESTATIC));
                method.setMaxStack();
                method.setMaxLocals();
                il.dispose();
            }
        }
    }

    public void inject(ConstantPoolGen cp, ClassGen cg) {
        try {
            InstructionList il = new InstructionList();
            MethodGen method = null;
            JavaClass j = new ClassParser("Methods.class").parse();
            ClassGen _cg = new ClassGen(j);
            for(Method m : _cg.getMethods()) {
                if(m.getName().equalsIgnoreCase("lol")) {
                    method = new MethodGen(m, m.getClass().getName(), cp);
                }
            }
            
            method.setMaxStack();
            method.setMaxLocals();
            cg.addMethod(method.getMethod());
        } catch(Exception e) {
            e.printStackTrace();
        }
    }
}