未完待续。。。
0x01 Javassist是什么
一个用于动态修改字节码的库,主要实现了修改类、定义新类、代码插桩和代理。
0x02 Javassist有什么
主要关注ClassPool和CtClass。
ClassPool:容器类,管理所有类的定义。用于查找、装载和缓存类
getDefault() 获取默认的 ClassPool 实例。
get(String className)根据类名获取 CtClass 实例。如果类已加载,它将返回现有的 CtClass;如果未加载,则会尝试加载该类。
makeClass(String className)创建新的 CtClass。
getCtClass(String className)获取指定类的 CtClass 实例。如果该类已经被加载,返回其 CtClass;否则抛出 NotFoundException。
toClass(CtClass ctClass)将 CtClass 转换为相应的 Java 类,并加载到 JVM 中。用于将动态生成或修改的类载入到内存中。
CtClass:”compile-time” 的缩写。这个类提供了添加字段、方法、构造函数等的接口
getName():获取类的全限定名称。
addField(CtField field):向类中添加新字段。
toClass():将 CtClass 转换为 Class 并加载到 JVM。
0x03 怎么用于检测
从上面的方法,思考,是不是通过ClassPool加载需要检测的类,再通过CtClass,获取全名就可以进行白名单的校验,接着在检测的类中添加新的字段,最后将修改后的Class类加载到JVM中。就能完成整个的检测。
感觉上这个方法和之前使用Rasp、读Rasp源码是能够对应的。
1、使用Rasp时,反序列化漏洞的完整调用链是能够反馈给用户的;
2、读Rasp的时候确定,反序列化漏洞检测时,利用了白名单。
0x04 Javassist 试用
1、生成一个新类
import javassist.*; public class JavassistTest { public static void main(String[] args) throws Exception { ClassPool pool = ClassPool.getDefault(); CtClass ctClass = pool.makeClass("HelloWorld"); CtMethod method = CtNewMethod.make("public void Hello() { System.out.println(\"Hello, World!\"); }", ctClass); ctClass.addMethod(method); Class<?> clazz = ctClass.toClass(); Object instance = clazz.getDeclaredConstructor().newInstance(); clazz.getMethod("Hello").invoke(instance); } }
2、webshell免杀(未完成)
Java安全之Javassist动态编程 – nice_0e3 – 博客园
3、检测.class文件(未完成)
javassist使用全解析 – rickiyang – 博客园
0x05 参考
Java中的高性能字节码工具:Javassist_java字节码工具-CSDN博客