Guest User

Untitled

a guest
May 24th, 2018
118
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.49 KB | None | 0 0
  1. package net.super_.rdp.bcel.transimpl;
  2.  
  3. import net.super_.rdp.bcel.ClassGenTransformer;
  4. import net.super_.rdp.bcel.SignatureFilter;
  5. import net.super_.rdp.bcel.Member;
  6. import net.super_.rdp.bcel.InstructionSearcher;
  7. import net.super_.rdp.util.Loggable;
  8. import net.super_.rdp.util.Utils;
  9. import net.super_.rdp.util.Logger;
  10. import org.apache.bcel.generic.*;
  11. import org.apache.bcel.classfile.Method;
  12. import org.apache.bcel.Constants;
  13.  
  14. import java.util.Iterator;
  15.  
  16. /**
  17. * Created by IntelliJ IDEA.
  18. * User: super_
  19. * Date: Nov 14, 2008
  20. * Time: 3:23:52 PM
  21. * To change this template use File | Settings | File Templates.
  22. */
  23. public class ClassLoaderT implements ClassGenTransformer, Loggable {
  24.  
  25. public boolean isApplicable(ClassGen classGen) {
  26. return classGen.getSuperclassName().equals("java.lang.ClassLoader");
  27. }
  28.  
  29. public void applyTransformation(ClassGen classGen) {
  30. Utils.defineClass("ClassLoader", classGen);
  31. SignatureFilter sFilter = new SignatureFilter("Ljava/util/Hashtable;");
  32. Member[] results = Utils.runMemberFilter(classGen, sFilter);
  33. Member cachedClasses = results[0];
  34. Utils.defineMember("CachedClasses", cachedClasses);
  35. Member loadClassMethod = Utils.findMethod(classGen, "loadClass", "(Ljava/lang/String;Z)Ljava/lang/Class;");
  36. MethodGen mGen = Utils.getMethodGen(loadClassMethod);
  37. InstructionSearcher searcher = new InstructionSearcher(mGen.getInstructionList());
  38. String bufferPattern = "INVOKEVIRTUAL ASTORE ALOAD IFNULL";
  39. Iterator<InstructionHandle[]> result = searcher.search(bufferPattern);
  40. if (!result.hasNext()) {
  41. Logger.log(this, "Unable to find pattern: " + bufferPattern);
  42. return;
  43. }
  44. InstructionHandle[] classBufferPattern = result.next();
  45. InstructionHandle bufferAstore = classBufferPattern[1];
  46. int positionIdx = ((ASTORE) bufferAstore.getInstruction()).getIndex();
  47. Logger.log(this, "Class data buffer index: " + positionIdx);
  48. InstructionFactory instrFactory = new InstructionFactory(classGen, classGen.getConstantPool());
  49. InvokeInstruction modifyInvoke = instrFactory.createInvoke("ClassProxy", "modifyBuffer", new ArrayType(BasicType.BYTE, 1), new Type[] { new ArrayType(BasicType.BYTE, 1) }, Constants.INVOKESTATIC);
  50. searcher.getInstructionList().insert(bufferAstore, modifyInvoke);
  51. classGen.replaceMethod((Method) loadClassMethod.getFieldOrMethod(), mGen.getMethod());
  52. }
  53. }
Add Comment
Please, Sign In to add comment