首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

ASM 字节码增强

ASM 可以在被加载入 JVM 之前动态修改已存在行为,也可以直接生成 .class 字节文件。...核心: ClassReader:读取字节码并将其转换为内部数据结构。 ClassWriter:内部数据结构转换回字节码,允许对字节码进行修改。...CoreAPI 根据字节码结构从上到下依次处理,对于字节文件不同的区域有不同的 Visitor,比如用于访问方法的 MethodVisitor、用于访问变量的 FieldVisitor、用于访问注解的...ASM Tree API ASM Tree API 是 ASM 框架提供的一种基于树结构的字节码访问方式。字节文件读取到内存构建树结构,通过各种 Node 来映射字节码。...asm-tree.jar 主要按“包含”组织关系: ClassNode:() VisitMethod(): 用于访问的方法。 VisitField(): 用于访问的字段。

32710

写个更牛逼的Transform | Plugin 进阶教程

而一般我们在使用asm的时候,我们都只会操作Class文件,然后根据class的文件名+路径对其进行一次简单的判断,当前是不是我们需要做插桩或者扫描操作的,然后我们会读取这个文件byte数组,之后在完成...如果byte数组非空的情况下,代表当前被进行了字节码修改操作,然后我们只要把这个文件进行一次覆盖操作就可以了。...ClassNode简介 如果你仔细读了关于字节码的文章后,你应该会知道Java当一个方法被调用时会产生一个栈帧(Stack Frame),可以理解为那个方法被包含在了这个栈帧里,栈帧包括3个部分,局部变量区...(srcClass) //1 读入的字节转为classNode classReader.accept(classNode, 0) classNodeMap...) val classWriter = ClassWriter(0) //3 classNode转为字节数组 classNode.accept(classWriter

24520
您找到你想要的搜索结果了吗?
是的
没有找到

字节码也能做有趣的事之ASM

但是字节码如果我们直接操作,成本太大,并且效率也不高。这个时候你就需要一款利器,字节码转换成java语言,从而你就可以随心所欲的操纵字节码。...而这里我要介绍的就是操作字节码的一把利器-ASMASM是一个java字节码操纵框架,它能被用来动态生成或者增强既有的功能。...Java class 被存储在严格格式定义的 .class文件里,这些文件拥有足够的元数据来解析的所有元素:名称、方法、属性以及 Java 字节码(指令)。...ASM文件读入信息后,能够改变行为,分析信息,甚至能够根据用户要求生成新ASM的优点如下: 有一个简单的模块API,设计完善,使用方便。...,甚至可以生成新的字节文件

1.2K51

写个更牛逼的Transform | Plugin 进阶教程

而一般我们在使用asm的时候,我们都只会操作Class文件,然后根据class的文件名+路径对其进行一次简单的判断,当前是不是我们需要做插桩或者扫描操作的,然后我们会读取这个文件byte数组,之后在完成...如果byte数组非空的情况下,代表当前被进行了字节码修改操作,然后我们只要把这个文件进行一次覆盖操作就可以了。...ClassNode简介 如果你仔细读了关于字节码的文章后,你应该会知道Java当一个方法被调用时会产生一个栈帧(Stack Frame),可以理解为那个方法被包含在了这个栈帧里,栈帧包括3个部分,局部变量区...= ClassNode(ASM5) val classReader = ClassReader(srcClass) //1 读入的字节转为classNode...) val classWriter = ClassWriter(0) //3 classNode转为字节数组 classNode.accept(classWriter

42920

ASM初探

,便封装它的操作码替换为一个新的 VarInsnNode 操作码,这个新操作码封装了 “ALOAD 1” 字节码, 原程序 值设为16 替换为 值设为局部变量1。...ASM 的 MethodVisitor 提供了一种 hook(钩子)机制,以便能够访问方法的每一个操作码,这样我们便能够对字节文件进行细粒度地修改。...只有 visit 这个方法一定会被调用一次,因为它 获取了头部的描述信息 **ASM Core API 类似于解析 XML 文件的 SAX 方式,直接用流式的方法来处理字节文件,而不需要把这个的整个结构读进内存之中...2)、ClassWriter:用于重新构建编译后的,如修改名、属性以及方法,也可以生成新的字节文件。...3)、各种 Visitor :如上所述,Core API 根据字节码从上到下依次处理,对于字节文件不同的区域有不同的 Visitor,比如用于访问方法的 MethodVisitor、用于访问变量的

1.3K10

牛逼的Transform Plus | Transform进阶教程

因为我们首先要取到的是R文件,然后把R文件的内容收集起来,之后再去所有有使用到R文件,所以如果使用正常的Transform流程的话这个可能就没办法操作了....然后通过文件或者信息进行增量编译的缓存数据,因为在增量编译得时候我们需要对上次的R文件进行一次记录,否则增量情况下就会出现缺失的问题。这部分尤其容易发生在路由表增量的过程。...我们在这个过程只收集我们所需要的数据信息,当然这次操作我们不会进行任何的asm替换操作和文件写入操作,只会将文件转化成asm语法相关的。当然这里是用tree api还是core api就随便了。...api 'org.ow2.asm:asm:9.2' api 'org.ow2.asm:asm-tree:9.2' 第二次asm操作的时候我们会进行文件copy操作以及替换等等,第二次的时候我们会在第一次收集到的数据的...,之后原来要做的替换或者方法替换等还原出来。

60050

Tree Api+ClassScanner = 识别三方隐私权限调用 | Android Lint

这些其实都是.class文件,因为已经跳过了javac的过程,所以也就没有语法树了。...很相似,因为已经编译成字节码了,而lint也是使用tree api,可以看到很多老熟人,比如ClassNode,MethodNode,还是一点点分析吧。...其中INVOKEVIRTUAL,INVOKESTATIC 都是MethodInsnNode,所以我们只要在getApplicableAsmNodeTypes方法添加AbstractInsnNode.METHOD_INSN...然后我们需要做的也很简单,因为我们的输入类型只有MethodInsnNode,所以当checkInstruction就是栈帧调用方法被执行的时候,call直接转化成MethodInsnNode,之后判断当前栈判断当前方法是不是操作符...当然理解文章内容的前提是你要有一定的虚拟机机器码的认知,对于asm相关的理解就会融汇贯通,无论是transform还是ClassScanner就都是一样的。

58130

现在准备好告别Transform了吗? | 拥抱AGP7.0

,最后也没有成功,而且Transform Action的输入产物都是单一文件,修改也是针对单一文件的,所以貌似也不完全是一个很好的替换方案,之前文章介绍的那种复杂的asm操作则无法负荷了。...然后我们构造一个ClassReader实例,然后byte数组传入,之后调用classReader.accept方法,之后我们就能在visitor逐个访问数据了。...这就是新的asm api 的设计思路了,也是我们这边大佬的字节码框架大佬的设计。另外bytex内的设计思路也是如此。...class PrivacyClassNode(private val nextVisitor: ClassVisitor) : ClassNode(Opcodes.ASM5) { override...second } 这部分比较简单,把逻辑抽象定义在ClassNode内,然后在visitEnd方法的时候调用我之前说的accept(nextVisitor)方法。

51720

Java 字节码操作框架——ASM

大家好我是小悦,之前的文章我们介绍了字节码的基础知识,今天我们介绍字节码相关的应用场景,首先要介绍的是如何对字节码做解析和修改,本文将会详细给大家介绍一个工业级字节码操作框架 ASM。...ASM 当我们需要对一个 class 文件做修改时,我们可以选择自己解析这个class 文件,在符合 Java 字节码规范的前提下进行字节码改造。...ASM 操作字节码案例 接下面我们用几个简单的例子来演示 ASM 各个核心操作字节码的案例。...访问的方法和字段 ASM 的 visitor 设计模式可以很方便的用来访问文件我们感兴趣的部分,比如文件的字段和方法列表,有下面的: public class MyMain { public...,经常会需要给新增一个字段存储额外的信息,在 ASM 新增一个字段非常简单,以下面的 MyMain 为例,使用 javac 编译为 class 文件

35320

pfinder实现原理揭秘

这里我字节码增强技术分两点来说,也是我认为实现字节码增强需要解决的两个关键点: 1.字节码是为了机器设计的,而非人类,字节码可读性极差、修改门槛极高,那么我们如何修改字节码呢?...Javassist ByteBuddy ByteKit 性能 ASM的性能最高,因为它直接操作字节码,没有中间环节 劣于ASM 介于javassist和ASM之间 介于javassist和ASM之间...void redefineClasses(ClassDefinition... definitions) 用给定的字节码数组替换指定的字节文件,也就是重新定义指定的 void retransformClasses...2.根据加载的插件做字节码增强。3.使用JMTP服务和插件产生的数据(trace、指标等)进行上报。...,通过事件解析引擎解析用户自定义事件并完成事件的绑定,完成解析赋值以及事件绑定后进行视图的渲染,最终将 5.1 多线程traceId丢失问题 pfinder目前已经traceId放到了MDC,我们通过在日志配置文件添加

10510

源码分析 | 咋嘞?你的IDEA过期了吧!加个Jar包就破解了,为什么?

在以下章节你可以学习到如下知识; Java Agent 非硬编码式代理,这也就是常说的探针技术 ASM 字节码编程简单使用 工程打包额外加载其他 jar 方法 最后是一个破解演示,仅适合个人学习使用...ASM 介绍 ASM 是一个 JAVA 字节码分析、创建和修改的开源应用框架。在 ASM 中提供了诸多的API用于对的内容进行字节码操作的方法。...然后使用 new VarInsnNode(Opcodes.ALOAD, 1) 本地指定的引用存入栈 之后将我们的入参内容直接返回,new InsnNode(Opcodes.ARETURN),从方法返回引用类型的数据...这个时候虽然你大爷还是你大爷,但你大娘已经不是你大娘了 为了测试的验证我们变更后的字节码代码(大娘)输出到工程目录下,也就是一个 class 文件,下文测试时候验证 4....比如监控,调试等 别忘了我们还在 Agent 输出了新的字节码,看看这个时候的是什么样(你大爷还是你大爷,但你大娘可不是你大娘了) 被代理前 public class DecodeCertificates

1.7K20

说说编译插桩

Java字节码,里面演示了如何字节码反过来解析出对应的class文件。....一方面是小端排列,另一方面需要寻址.最重要的一点是,class文件索引里面所有的信息都是直接排进去的,但是dex文件里面的都是存的索引,dex文件更为紧凑.也就是意味着,如果需要修改dex文件,...下面简单介绍一下ASM ASM 库提供了两个用于生成和转换已编译的 API,一个是核心 API,以基于事件的形式来表示,另一个是树 API,以基于对象的形式来表示。...基于对象的 API 提供了一种方法,可以表示一个的事件序列转换为表示同一个的对象树,也可以反过来,将对象树表示为等价的事件序列。换言之,基于对象的 API 构建在基于事件的 API 之上。...核心是ClassNode,可以在此基础上增加或者删除属性,成员之类的,当然还有更高级的。缺点是:如果使用者对字节码不熟悉的话不好操作 3.掌握插桩应该具备的基础知识 (1)熟练掌握字节码相关技术。

1.2K20

【Groovy】编译时元编程 ( ASTTransformation#visit 方法访问 Groovy 、方法、字段、属性 | 完整代码示例及进行编译时处理的编译过程 )

Groovy 脚本定义的所有 Groovy ; 使用 each 方法遍历上述 Class 节点集合 List classes , 在闭包 , 使用 it 获取正在遍历的..., 并进行遍历 // 在 ModuleNode 节点封装在了如下成员 // List classes = new LinkedList<ClassNode..., 并进行遍历 // 在 ModuleNode 节点封装在了如下成员 // List classes = new LinkedList<ClassNode..., 在文件配置 ASTTransformation 实现的全名 : MyASTTransformation 3、使用命令行进行编译时处理 首先 , 进入 Y:\002_WorkSpace\003...MyASTTransformation.groovy , 编译后的字节文件 MyASTTransformation.class 保存到 Y:\002_WorkSpace\003_IDEA\Groovy_Demo2

84120

【Groovy】编译时元编程 ( 编译时方法拦截 | 在 MyASTTransformation#visit 方法中进行方法拦截 )

, 在MyASTTransformation#visit 方法 , 首先获取了 ModuleNode , 然后查找指定的 ClassNode , 从指定的 ClassNode 查找对应的 MethodNode..., 并进行遍历 // 在 ModuleNode 节点封装在了如下成员 // List classes = new LinkedList<ClassNode..., 在文件配置 ASTTransformation 实现的全名 : MyASTTransformation 3、使用命令行进行编译时处理 首先 , 进入 D:\002_Project\012_...MyASTTransformation.groovy , 编译后的字节文件 MyASTTransformation.class 保存到 D:\002_Project\012_Groovy\Groovy_Demo...\src\main\groovy\classes 目录下 , groovyc -d classes MyASTTransformation.groovy 再后 , 打包上述编译好的字节文件 , 存放在

38220

【Groovy】编译时元编程 ( ASTTransformation#visit 方法简介 | org.codehaus.groovy.ast.ModuleNode 脚本节点 )

ASTTransformation#visit 方法简介 ---- 在上一篇博客 【Groovy】编译时元编程 ( 编译 ASTTransformation | 打包 ASTTransformation 字节文件...* 编译时处理方法 * @param nodes AST 抽象语法树节点 , 是 ASTNode 数组类型 * @param source 源单元 , 可以通过该对象拿到源文件...> classes = new LinkedList(); 成员表示该脚本定义了多少个 Groovy 节点 ; private List methods...; 通过 ModuleNode , 可以拿到 Groovy 脚本几乎所有的内容 ; org.codehaus.groovy.ast.ModuleNode 原型如下 : /** * 表示一个模块,...该模块通常由一个声明组成, * 但可以包括一些导入、一些语句和多个, * 这些与Python或Ruby的脚本等语句混合在一起 * * @author Jochen Theodorou

20610

【Android 逆向】启动 DEX 字节的 Activity 组件 ( 替换 LoadedApk 加载器 | 加载 DEX 文件的 Activity 并启动成功 )

加载器 二、完整代码示例 三、执行结果 四、博客资源 前言 ---- 在 上一篇博客 【Android 逆向】启动 DEX 字节的 Activity 组件 ( DEX 文件准备 | 拷贝资源目录下的文件到内置存储区...的加载器 , 就可以成功加载 DEX 文件了 , 该操作类似于热修复 ; /** * 不修改加载器的前提下 , 运行 Dex 字节文件的组件 * * @param...// 替换 LoadedApk 加载器 ClassLoader // 然后使用替换的加载器加载 DEX 字节文件的 Activity 组件...加载器 ClassLoader , 然后使用替换的加载器加载 DEX 字节文件的 Activity 组件 ; 完整代码示例 : package com.example.classloader_demo...// 替换 LoadedApk 加载器 ClassLoader // 然后使用替换的加载器加载 DEX 字节文件的 Activity 组件 if (Build.VERSION.SDK_INT

1.6K30
领券