序言
利用环境: Commons-collections 4.0 java版本无要求
CC4就是CC2和CC3的合体,大致与CC2一样,唯一的变动就是将CC2中触发newTransform的方法替换成了CC3中的TrAXFilter
和InstantiateTransformer
分析
1 | package CC4; |
首先前半部分和CC3与CC2一样,都是javassist
生成字节码,templatesImpl
来准备加载字节码
然后接下来就是二链结合之处了
1 | //构造chainedTransformer,用TrAXFilter调用InstantiateTransformer的newIntance() |
我们来看看CC2中这里是如何构造的
1 | //创建InvokerTransformer并实例化 传入参数newTransformer,后续调用TemplatesImpl.newTransformer |
我们知道在 TransformingComparator的compare()
方法中可以触发transform
所以在CC2中是利用这个地方来调用InvokerTransformer.transform
,进而反射调用TemplatesImpl.newTransform()
,最后实例化加载字节码。
而在上一节CC3中我们知道了TrAXFilter
和InstantiateTransformer
也能组合拳调用TemplatesImpl.newTransform()
,所以这里自然而然就不再用InvokerTransformer多此一举了。
接下来就如同CC2一样,利用PriortyQueue
队列的readObject()
作为入口
又因为我们不用InvokerTransformer,用的是ChainedTransformer的transform
所以这里就不需要接受传参了(obj1与obj2)
只要进入到compare(),调用ChainedTransformer.transform()即可,传入参数无所谓。不需要像InvokerTransformer那样传入TemplatesImpl,设置反射获取方法的类。
例:
自然也就不需要反射设置队列的queue属性了
(CC2设置queue属性为templates)
利用链:
1 | PriorityQueue.readObject |
结尾
cc3是cc1和cc2的结合,cc4是cc2和cc3的结合,就是利用了CC3中的TrAXFilter和InstantiateTransformer来触发TemplatesImpl.newTransform()