Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package net.super_.rdp.bcel.transimpl;
- import net.super_.rdp.bcel.ClassGenTransformer;
- import net.super_.rdp.bcel.SignatureFilter;
- import net.super_.rdp.bcel.Member;
- import net.super_.rdp.bcel.InstructionSearcher;
- import net.super_.rdp.util.Loggable;
- import net.super_.rdp.util.Utils;
- import net.super_.rdp.util.Logger;
- import org.apache.bcel.generic.*;
- import org.apache.bcel.classfile.Method;
- import org.apache.bcel.Constants;
- import java.util.Iterator;
- /**
- * Created by IntelliJ IDEA.
- * User: super_
- * Date: Nov 14, 2008
- * Time: 3:23:52 PM
- * To change this template use File | Settings | File Templates.
- */
- public class ClassLoaderT implements ClassGenTransformer, Loggable {
- public boolean isApplicable(ClassGen classGen) {
- return classGen.getSuperclassName().equals("java.lang.ClassLoader");
- }
- public void applyTransformation(ClassGen classGen) {
- Utils.defineClass("ClassLoader", classGen);
- SignatureFilter sFilter = new SignatureFilter("Ljava/util/Hashtable;");
- Member[] results = Utils.runMemberFilter(classGen, sFilter);
- Member cachedClasses = results[0];
- Utils.defineMember("CachedClasses", cachedClasses);
- Member loadClassMethod = Utils.findMethod(classGen, "loadClass", "(Ljava/lang/String;Z)Ljava/lang/Class;");
- MethodGen mGen = Utils.getMethodGen(loadClassMethod);
- InstructionSearcher searcher = new InstructionSearcher(mGen.getInstructionList());
- String bufferPattern = "INVOKEVIRTUAL ASTORE ALOAD IFNULL";
- Iterator<InstructionHandle[]> result = searcher.search(bufferPattern);
- if (!result.hasNext()) {
- Logger.log(this, "Unable to find pattern: " + bufferPattern);
- return;
- }
- InstructionHandle[] classBufferPattern = result.next();
- InstructionHandle bufferAstore = classBufferPattern[1];
- int positionIdx = ((ASTORE) bufferAstore.getInstruction()).getIndex();
- Logger.log(this, "Class data buffer index: " + positionIdx);
- InstructionFactory instrFactory = new InstructionFactory(classGen, classGen.getConstantPool());
- InvokeInstruction modifyInvoke = instrFactory.createInvoke("ClassProxy", "modifyBuffer", new ArrayType(BasicType.BYTE, 1), new Type[] { new ArrayType(BasicType.BYTE, 1) }, Constants.INVOKESTATIC);
- searcher.getInstructionList().insert(bufferAstore, modifyInvoke);
- classGen.replaceMethod((Method) loadClassMethod.getFieldOrMethod(), mGen.getMethod());
- }
- }
Add Comment
Please, Sign In to add comment