它是一个强大的字节码工具,被广泛用于许多 Java 字节码操作的场景。 官方网站:ASM Byte Buddy: 简介:Byte Buddy 是一个用于创建和操作字节码的库。...它提供了一个高层次的 API,用于动态创建类、生成代理和拦截方法调用等。 官方网站:Byte Buddy Javassist: 简介:Javassist 是一个用于在运行时编辑字节码的库。...ASM 可以在类被加载入 JVM 之前动态修改已存在类行为,也可以直接生成 .class 字节码文件。...ASM Core API ASM Core API 使用流式的方式根据字节码结构从上到下依次处理,性能很好,所以一般 ASM 增强字节码一般都使用 Core API。...ASM 使用 Core API 使用 Demo ASM 版本使用 ASM9 源码: public class ByteCodeDemo { private String prefix = "A";
---- 接下来我们开始介绍关于使用字节码插桩非入侵的方式进行系统监控,关于字节码插桩常用的有三个组件,包括:ASM、Javassit、Byte-Buddy,接下来我们分别介绍它们是如何使用的。...Byte Buddy 是一个代码生成和操作库,用于在 Java 应用程序运行时创建和修改 Java 类,而无需编译器的帮助。...此外,Byte Buddy 提供了一种方便的 API,可以使用 Java 代理或在构建过程中手动更改类。 无需理解字节码指令,即可使用简单的 API 就能很容易操作字节码,控制类和方法。...整个过程就像最初使用 AOP 一样简单,但却满足了非入侵的监控需求。 所以在使用字节码框架的时候,可以考虑选择使用 Byte-buddy 这个非常好用的字节码框架。...除了本章节的案例使用介绍外,还可以通过官网:https://bytebuddy.net,去了解更多关于 Byte Buddy 的内容。
{ // TODO 对字节码进行修改; 原始字节码为 classfileBuffer; // 可以使用ASM、Javassist等字节码操作框架进行字节码修改操作..., 这里使用jdk自带asm示例 if (!"...参考地址:https://javadoc.io/doc/net.bytebuddy/byte-buddy# // 1....super的方法 @SuperCall 用于调用父类版本的方法(原方法,不能修改参数) @RuntimeType 可以用在返回值、参数上,提示ByteBuddy禁用严格的类型检查 @Super 当前被拦截的...-- 需要处理的包路径 --> net.bytebuddy:byte-buddy:jar:
从官网抄的介绍: 官网:https://asm.ow2.io/ ASM是一个通用的Java字节码操作和分析框架。它可以用于修改现有类或直接以二进制形式动态生成类。...使用此对象的时候需要指定asm api的版本。...使用此对象的时候需要指定asm api的版本。...使用此对象的时候需要指定asm api的版本。...使用此对象的时候需要指定asm api的版本。 一些需要的说明 class的访问标示: 可以使用如下命令: //命令 javap -v Aoo.class //结果 。。。省略。。。
如何使用ASM给android的某个函数做插桩?...(file)); //ASM提供的类修改对象,并将读到的信息交给classWriter ClassWriter...现在开始操作ASM的api 首先要实现ASM的 ClassVisitor 类来操作我们想要操作的类,它可以访问class文件的各个部分,比如方法、变量、注解等 基本的实现如下: public class...,同样用到ASM提供的对象,下面看具体实现代码 return new TestMethodVisitor(Opcodes.ASM6, methodVisitor, access...(file)); //ASM提供的类修改对象,并将读到的信息交给classWriter ClassWriter
为了更方便的学习ASM,我将《ASM4使用手册》以及一些技术点整理成在线文档,可以随时方便查阅(http://asm.itstack.org); [ASM4使用手册] 另外关于本文中出现的代码例子,可以通过在公众号...^1024”,其实以上的代码都是来自于 ASM 框架的代码,这里面所有的操作与我们使用使用 javap -c XXX 所反解析出的字节码是一样的,只不过是反过来使用指令来编写代码。...首先如果你看过我的专栏,用《Java写一个Jvm虚拟机》,那么你可能会感受到这里面的知识点还是不那么陌生的。另外这里的编写,ASM还提供了插件,可以方便的让你开发字节码。接下来就介绍一下使用方式。...这个插件可以很轻松的让你看到一段代码的指令码以及如何用ASM去开发。...但是在实际使用的过程中,我们可能有的时候是需要修改一个原有的方法,在开始和结尾添加一些代码,来监控这个方法的耗时。这也是非侵入式监控的最基本模型。
一、java agent和byte-buddy组合的使用场景 java agent开了一扇门,bytebuddy在开的这扇门中打开了一片新的天地。...Byte Buddy提供了一个简单易用的API,用于生成、修改和加载Java字节码。它支持Java 5及更高版本,并且与Java Agent技术非常配合。...ASM: ASM是一个Java字节码操控框架。它能直接生成或以二进制形式修改已有类或者核心类的字节码。ASM可以直接生成字节码,而不需要了解Java虚拟机指令。...Instrumentation API: 这是Java Agent技术的核心API,用于在运行时修改类的字节码。使用这个API,你可以实现自己的类加载器,并在类被加载到JVM时修改其字节码。..."); } } 以上是对byte-buddy的简单入门案例,通过上面的案例可以很好的理解sermant的原理。
为了更方便的学习ASM,我将《ASM4使用手册》以及一些技术点整理成在线文档,可以随时方便查阅(http://asm.itstack.org); ?...^1024”,其实以上的代码都是来自于 ASM 框架的代码,这里面所有的操作与我们使用使用 javap -c XXX 所反解析出的字节码是一样的,只不过是反过来使用指令来编写代码。...首先如果你看过我的专栏,用《Java写一个Jvm虚拟机》,那么你可能会感受到这里面的知识点还是不那么陌生的。另外这里的编写,ASM还提供了插件,可以方便的让你开发字节码。接下来就介绍一下使用方式。...这个插件可以很轻松的让你看到一段代码的指令码以及如何用ASM去开发。 安装插件(ASM Bytecode Outline) ? 测试使用 ?...但是在实际使用的过程中,我们可能有的时候是需要修改一个原有的方法,在开始和结尾添加一些代码,来监控这个方法的耗时。这也是非侵入式监控的最基本模型。
ASM 提供与其他 Java 字节码框架类似的功能,但更注重性能。由于它的设计和实现尽可能小巧和快速,因此非常适合在动态系统中使用(但当然也可以以静态方式使用,例如在编译器中)。...官网地址:https://asm.ow2.io/ 2.1、工作流程 基于访问者模式: ASM 使用访问者模式来遍历和修改字节码。...ClassVisitor 接收来自 ClassReader 的事件,并可以选择性地将这些事件传递给下一个 ClassVisitor 或者修改字节码内容。...它实现了 ClassVisitor 接口,在接收到各种字节码元素后,根据需要构建出新的字节码序列。 在这个过程中可以插入、删除或修改原有的字节码指令,从而实现对类行为的动态调整。...MethodVisitor 用于访问和修改方法的字节码指令。
ASM 当我们需要对一个 class 文件做修改时,我们可以选择自己解析这个class 文件,在符合 Java 字节码规范的前提下进行字节码改造。...简单的 API 背后 ASM 自动帮我们做了很多事情,比如维护常量池的索引,计算最大栈大小 max_stack,局部变量表大小 max_locals 等,除此之外还有下面这些优点: 架构设计精巧,使用方便...ASM 提供了两种生成和转换类的方法: 基于事件触发的 core API 和基于对象的 Tree API,这两种方式可以用 XML 解析的 SAX 和 DOM 方式来对照。...ClassVisitor 对象调用不同的 visit 方法,ClassVisitor 可以在这些 visit 方法中对字节码进行修改,ClassWriter 可以生成最终修改过的自己字节码。...使用 Tree Api 的方式也可以实现同样的效果 byte[] bytes = getBytes(); ClassReader cr = new ClassReader(bytes); ClassNode
operation... from Sub operation... param1 bytebuddy Byte Buddy是致力于解决字节码操作和 instrumentation API 的复杂性的开源框架...Byte Buddy 所声称的目标是将显式的字节码操作隐藏在一个类型安全的领域特定语言背后。通过使用 Byte Buddy,任何熟悉 Java 编程语言的人都有望非常容易地进行字节码操作。...Byte Buddy是一个较高层级的抽象的字节码操作工具,相较于ASM而言。其实吧,Byte Buddy 本身也是基于 ASM API 实现的。...与原始的 ASM 类似,“intercept”会告诉 Byte Buddy 为拦截到的指令提供方法实现: ClassASM/byte-buddy/Java动态代理;另一种是使用Java编码方式创建新类或者修改现有类,比如javassist。
在API设计层面,ASM提供两套访问机制:基于事件的Core API和基于对象的Tree API。...实际工程中,95%以上的场景推荐使用Core API,特别是在性能敏感的热点代码增强场景。...MethodVisitor与AOP注入 在字节码层面实现AOP(面向切面编程)的核心在于动态修改方法体,这正是ASM框架中MethodVisitor的专长领域。...关键点在于正确维护操作数栈状态——异常对象会自动压入栈顶,需要先存储到局部变量表(ASTORE)再进行处理。 高级模式:条件性注入 通过分析方法的字节码指令,可以实现更智能的注入策略。...教育领域的颠覆性应用 字节码技术正在成为理解编程语言本质的教学利器。通过ASM可视化工具,学习者可以实时观察高级语言结构到字节码的映射过程。
Java Agent是Java SE 5.0版本引入的一个新特性,它可以在Java虚拟机(JVM)启动前或者在运行时动态地读取一些class文件,并在内存中修改后替换原始的class文件,从而在不改变原有代码的情况下增强或者监视应用程序的运行...API可以让代理程序注册到JVM中,而java.lang.ClassFileTransformer API允许代理程序使用ASM等字节码操作框架来修改类字节码。...当类被加载到JVM时,代理程序就可以使用ClassFileTransformer API来检测并且修改这个类的字节码,使得这个类被加载到JVM后可以被代理程序所处理。...示例 下面是一个使用Java Agent实现方法耗时监控的例子: 首先,在maven的pom.xml中加入以下依赖: org.ow2.asm</groupId...总结: 在本文中,我们对Java Agent进行了简单的介绍,包括它的原理、运行机制以及如何使用ASM等字节码操作框架来修改类字节码。
用户代码中的org.apache.hadoop.mapreduce.Job(以下简称Job)对象是其业务代码中的一个局部变量,执行提交操作后,其JobID存在于其对象内部,外部代码无妨访问到该Job对象...如果通过hadoop的rest api去获取呢,yarn rest api确实可以获取所有的任务的相关信息,但是在外部程序不知道这个Job的任务信息的情况下,又怎么能准确的对应上呢?...这里可以通过修改Job类的字节码,去动态的注入一个这样的属性currentJob和赋值的操作。...Job类在hadoop框架的jar包内,要想拦截到Job类的字节码并在类加载的时候对其修改,hadoop的依赖也就须要一个ClassLoader来加载,并在其加载的loadClass方法中去获取并修改Job...通过ASM来实现对Job类的字节码的修改,ASM的使用可以参考文档:asm4-guide 实现的ClassVisitor代码如下: public class JobAdapter extends ClassVisitor
常见场景包括: AOP实现:在方法调用前后插入切面逻辑,如事务管理、日志记录 性能监控:注入方法执行时间统计代码 功能增强:动态添加字段或方法 代码混淆:保护知识产权 使用ASM进行字节码修改通常遵循访问者模式...,各有特点: ASM:性能最优,直接操作字节码指令,但学习曲线陡峭 Javassist:提供更高级的API,允许用Java代码字符串形式修改类 Byte Buddy:流畅的DSL接口,适合创建运行时代理...CGLIB:基于ASM的封装,主要用于生成动态代理 工具选择应考虑: 性能要求(ASM比Javassist快约10倍) 易用性需求(Javassist支持Java语法糖) 功能复杂度(Byte Buddy...这使得我们可以利用自定义类加载器实现以下流程: 检测类文件修改(通常通过文件最后修改时间戳) 创建新的类加载器实例 用新加载器加载修改后的类 替换旧类创建的实例为新类的实例 这种机制与JSP文件修改即时生效的原理类似...层(Layer)架构:通过ModuleLayer类可以实现动态模块加载,这是热部署技术的进阶方案。开发者可以创建新的模块层来加载修改后的模块,而无需重启JVM。
文件: AspectJ官网 更多AspectJ的内容可以参考本篇文章进行学习 ---- 收获 编译器也能修改 class 实现增强 编译器增强能突破代理仅能通过方法重写增强的限制:可以对构造方法、静态方法等实现增强...【3】-instrumentation 构建自己的监测器【6】-agentmain方式 -java -D参数使用 构建自己的监测器【4】-java -D参数使用 ---- 使用演示: 我们需要借助javassist...---- 收获 类加载时可以通过 agent 修改 class 实现增强 java文件是先被编译成class二进制字节码文件,再加载进虚拟机的,Aspectj是在没加载前,直接修改生成的class文件完成...aop逻辑织入的,但是这里的agent是通过加载前的回调处理接口,对class文件进行aop逻辑切入的,所以我们查看生成的class文件,会发现并没有变化 我们可以使用Arthas在运行期间,对程序中某个类进行反编译...asm模拟生成代理类字节码 因为使用asm框架的要求比较高,需要使用者熟悉jvm指令集,因此我们先手写一个代理类模板,然后通过asm插件,翻译出该类对应的asm代码: 1.安装asm插件 2.准备代理类
visitMethod方法返回一个MethodVisitor实例(参考图标3.4),可以使用它定义方法的注解、属性和最重要的方法代码。...使用生成的类 上面生成的byte数组可以保存到Comparable.class文件中,以便后续使用。 另外,该数组也可以被ClassLoader动态加载。...ASM会自动为方法执行这些优化: 当ClassReader检测到ClassVisitor中返回的MethodVisitor作为参数传递给一个ClassWriter对象,这意味着这个方法没有被修改,并且实际上不应该被应用所见...这两种解决方案都是有意义的;使用那种取决于场景需求。例如你可以增加一个单一的计数器属性来统计对象的调用次数,或者每个方法的计数器来单独统计每个方法的调用次数。...需要注意的是,正如第一章介绍的,Tree API的调用是没有限制的:在类转换的过程中可以使用API添加类成员。
Arouter框架结构 Arouter框架结构中有注解定义和注解处理器相关的内容,Arouter本身也可以算是一个示例。...arouter-api对Arouter初始化 Arouter框架使用的静态注解处理,为适应多模块,使用moduleName后缀生成了一组统一规则的注册类。...RegisterTransform.registerList中的ScanSetting对象中,以及arouter-api初始化类 LogisticsCenter 所在的文件由 RegisterTransform.fileContainsInitClass...#register(className) 调用语句,使得loadRouterMap可以直接完成路由注册,节省了运行时扫描的时间。..., mv) } return mv } } 方法访问 使用 MethodVisitor 对类方法进行读写,可以插入代码。
于是具体的代码中使用Base64解码后,转为类对象,手动触发该类的构造方法即可实现Webshell的功能 String cmd = request.getParameter("cmd"); ClassLoader...byte[]还原出一个Class对象。...,以描述该CodeSource所获取的权限 类加载器的实现可以通过将代码来源(CodeSource)即代码库和该class文件的所有签名者信息,传递给当前的Policy对象的getPermissions...ASM框架可以直接操作字节码,而JDK其实是自带ASM的,并不需要引入第三方依赖 最终目标是加载字节码触发漏洞,并不是一定要使用JAVAC来编译生成,也可以直接写入 例如0x02的BCEL的例子,需要编译得到一长串...jdk.internal.org.objectweb.asm.MethodVisitor methodVisitor; // 类名可以自行修改 classWriter.visit
1 Instrumentation 上一篇字节码也能做有趣的事之ASM教你了如何去修改字节码?...相信看过的同学已经对如何修改字节码已经有一定印象了,但是这里有个问题,上一节我们是通过读取.class文件在内存里面使用,并不能影响我们实际jvm中使用的class。...这里不做篇幅介绍attach api怎么运行的,总而言之需要依靠accach api整个过程依然比较麻烦,感兴趣的同学可以自行阅读: https://www.ibm.com/developerworks...插件就可以大显神威了,(不仅是这里,以后如果大家开发asm相关的,用插件看他本来的代码,然后进行对比),这里我们通过asm插件生成一版asm的代码这个时候可以截图保存,然后我们手动的修改toString...同时ASM的作用不仅仅是和instrument搭配,大家可以看看cglib切面的源码,或者看看fastjson的源码,你可以根据jvm中已经加载好的类,然后修改其字节码修改成新的其他类,这里可以是代理类