来学习一下java的ASM,和class字节码以及一些简单的jvm知识也记录在这,参考文章:https://lsieun.github.io/java/asm/java-asm-season-01.html,https://www.javabetter.cn/jvm/class-file-jiegou.html

因为后面java反序列化的学习还需要动态生成恶意字节码,所以来补补基础。

Java类文件结构

ASM介绍

ASM就是一个操作java字节码的类库。

ASM的操作对象字节码数据,就是.java文件经过javac之后生成的.class文件。

ASM处理字节码的步骤就是:拆分->修改->合并

  • 第一步,将 .class 文件拆分成多个部分;
  • 第二步,对某一个部分的信息进行修改;
  • 第三步,将多个部分重新组织成一个新的 .class 文件。

版本问题

不同的ASM版本对应不同的Java版本,高版本可以兼容低版本

ASM Release Release Date Java Support
2.0 2005-05-17 Java 5 language support
3.2 2009-06-11 support for the new invokedynamic code.
4.0 2011-10-29 Java 7 language support
5.0 2014-03-16 Java 8 language support
6.0 2017-09-23 Java 9 language support
6.1 2018-03-11 Java 10 language support
7.0 2018-10-27 Java 11 language support
7.1 2019-03-03 Java 13 language support
8.0 2020-03-28 Java 14 language support
9.0 2020-09-22 Java 16 language support
9.1 2021-02-06 JDK 17 support
9.2 2021-06-26 JDK 18 support
9.3 2022-04-04
9.4 2022-10-02
9.5 2023-03-24

ASM能做的事

  • 父类:修改成一个新的父类
  • 接口:添加一个新的接口、删除已有的接口
  • 字段:添加一个新的字段、删除已有的字段
  • 方法:添加一个新的方法、删除已有的方法、修改已有的方法
  • …等等

ASM生成新的类