classPool=ClassPool.getDefault(); String AbstractTranslet="com.sun.org.apache.xalan.internal.xsltc.runtime.AbstractTranslet "; classPool.appendClassPath(AbstractTranslet); CtClass payload=classPool.makeClass(" "; classPool.appendClassPath(AbstractTranslet); CtClass payload=classPool.makeClass classPool=ClassPool.getDefault(); String AbstractTranslet="com.sun.org.apache.xalan.internal.xsltc.runtime.AbstractTranslet "; classPool.appendClassPath(AbstractTranslet); CtClass payload=classPool.makeClass("
1.创建了一个非默认的classpool,加入当前线程的上下文类加载器作为额外的类搜索路径 val classPool = ClassPool(false) classPool.appendClassPath (LoaderClassPath(contextClassLoader)) ClassPool ClassPool是CtClass对象的容器,每一个CtClass对象都必须从ClassPool中获取。 需要注意的是ClassPool会在内存中维护所有被它创建过的CtClass,当CtClass数量过多时,会占用大量的内存,API中给出的解决方案是周期性的调用compress方法 或 重新创建ClassPool 需要关注的方法: 1.getDefault : 返回默认的ClassPool,单例模式!一般通过该方法创建我们的ClassPool。 \");"); ctClass.toClass(); 2.创建一个完整的类: ClassPool classPool = ClassPool.getDefault(); CtClass ctClass
个人网站、项目部署、开发环境、游戏服务器、图床、渲染训练等免费搭建教程,多款云服务器20元起。
常用API 3.1 ClassPool对象 // 获取ClassPool对象, 使用系统默认类路径 ClassPool pool = new ClassPool(true); // 效果与 new ClassPool (true) 一致 ClassPool pool1 = ClassPool.getDefault(); 3.2 类对象 3.2.1 获取类对象 // 通过类名获取 CtClass, 未找到会抛出异常 /xxx/Demo.class"))); 3.3 classpath 通过 ClassPool.getDefault()获取的ClassPool使用JVM的classpath. 可以从ClassPool中删除不必要的CtClass对象. 或者每次创建新的ClassPool对象. // 从ClassPool中删除CtClass对象 ctClass.detach(); // 也可以每次创建一个新的ClassPool, 而不是ClassPool.getDefault
class cc2 { public static void main(String[] args) throws Exception { //通过字节码构建恶意类 ClassPool classPool=ClassPool.getDefault(); String AbstractTranslet="com.sun.org.apache.xalan.internal.xsltc.runtime.AbstractTranslet "; classPool.appendClassPath(AbstractTranslet); CtClass payload=classPool.makeClass(" classPool=ClassPool.getDefault(); String AbstractTranslet="com.sun.org.apache.xalan.internal.xsltc.runtime.AbstractTranslet "; classPool.appendClassPath(AbstractTranslet); CtClass payload=classPool.makeClass("
FileInputStream("test.out")); inputStream.readObject(); } } CC2分析 import javassist.ClassPool classPool=ClassPool.getDefault(); String AbstractTranslet="com.sun.org.apache.xalan.internal.xsltc.runtime.AbstractTranslet "; classPool.appendClassPath(AbstractTranslet); CtClass payload=classPool.makeClass(" classPool=ClassPool.getDefault(); String AbstractTranslet="com.sun.org.apache.xalan.internal.xsltc.runtime.AbstractTranslet "; classPool.appendClassPath(AbstractTranslet); CtClass payload=classPool.makeClass("
27日上午9:52:43 */ public class demo01 { public static void main(String[] args) throws Exception { ClassPool pool = ClassPool.getDefault(); CtClass cc = pool.makeClass("com.bigdataBC.bean.Emp"); // 创建属性 pool = ClassPool.getDefault(); CtClass cc = pool.get("com.bigdataBC.demo.Emp"); byte[] bytes pool = ClassPool.getDefault(); CtClass cc = pool.get("com.bigdataBC.demo.Emp"); // CtMethod m pool = ClassPool.getDefault(); CtClass cc = pool.get("com.bjsxt.test.Emp"); CtConstructor[] cs
---- Javassist作用 运行时监控插桩埋点 AOP动态代理实现(性能上比Cglib生成的要慢) 获取访问类结构信息:如获取参数名称信息 ---- 常用API 类 说明 ClassPool Javassist 的类池,使用ClassPool 类可以跟踪和控制所操作的类, 与 JVM ClassLoader相似 CtClass CtClass提供了类的操作,如在类中动态添加新字段、方法和构造函数、以及改变类、父类和接口的方法 classPool = new ClassPool(); // 追加系统ClassLoader classPool.appendSystemPath(); // 获取要操作的类 CtClass ctClass = classPool.get("com.artisan.agent.UserService"); // 获取方法 classPool = new ClassPool(); // 追加系统ClassLoader classPool.appendSystemPath();
2、测试javassist生成一个新的类 源代码如下: package com.peng.test; import javassist.ClassPool; import javassist.CtClass pool = ClassPool.getDefault(); CtClass cc = pool.makeClass("com.peng.bean.Emp"); //创建属性 ; } } tips: (1)由上面的代码也可以看出使用javassist操作字节码的方式:首先获取一个类池“ClassPool”,通过类池,我们创建编译过程中的新类“CtClass”, pool = ClassPool.getDefault(); CtClass cc = pool.makeClass("com.peng.test.Emp"); byte[] pool = ClassPool.getDefault(); CtClass cc = pool.makeClass("com.peng.test.Emp"); //方法一:
引用后,只要将所有Module的编译目录加入到classpath后,通过类名即可以得到解析.class文件抽象后的CtClass对象,如下: ClassPool classPool = ClassPool.getDefault () // 加入classpath mProjectsBuildPath.each { buildPath -> classPool.appendClassPath(buildPath) } // 根据类型获取 CtClass对象 // CtClass ctClass = classPool.get(className) 分析依赖 有了.class文件的CtClass对象后,就可以获取到该CtClass所依赖的所有 CtClass ctClass = classPool.get(className) ClassFile classFile = ctClass.getClassFile() for (String dependent
编写代码并且需要导入 javassist.jar包 核心代码如下: public static void patchClass(String jarPath) throws Exception { ClassPool classPool = ClassPool.getDefault(); classPool.insertClassPath(jarPath); CtClass ctClass = classPool.get("com.xk72.charles.kKPk"); //修改return true CtMethod ctMethod = ctClass.getDeclaredMethod
classPool = ClassPool.getDefault(); String code = " String cmd = request.getParameter classPool = ClassPool.getDefault(); try { CtClass ctClass = classPool.get > clazz : allLoadedClasses){ if (clazz.getName().equals(CLASS_NAME)){ ClassPool classPool = ClassPool.getDefault(); ClassClassPath classClassPath = new ClassClassPath classPool = ClassPool.getDefault(); ClassClassPath classClassPath = new ClassClassPath
javassist实例代码: package com.test; import javassist.ClassPool; import javassist.CtClass; import javassist.CtMethod operation... " + value); } public static void main(String[] args) throws Exception { ClassPool classPool = ClassPool.getDefault(); CtClass ctClass = classPool.makeClass("test.SubAccount") ; ctClass.setSuperclass(classPool.get("com.test.Account")); // 调用方法 ((Account ) ctClass.toClass().newInstance()).operation(""); // 添加方法并调用 ctClass = classPool.makeClass
IOException, NotFoundException, CannotCompileException, ClassNotFoundException { //通过字节码构建恶意类 ClassPool classPool= ClassPool.getDefault(); String AbstractTranslet="com.sun.org.apache.xalan.internal.xsltc.runtime.AbstractTranslet "; classPool.appendClassPath(AbstractTranslet); CtClass payload=classPool.makeClass(" } public static void main(String[] args) throws Exception { // 创建恶意类,用于报错抛出调用链 ClassPool pool = ClassPool.getDefault(); CtClass payload = pool.makeClass("EvilClass"); payload.setSuperclass
//动态创建字节码 String cmd = "java.lang.Runtime.getRuntime().exec(\"calc\");"; ClassPool pool = ClassPool.getDefault { //动态创建字节码 String cmd = "java.lang.Runtime.getRuntime().exec(\"calc\");"; ClassPool { //动态创建字节码 String cmd = "java.lang.Runtime.getRuntime().exec(\"calc\");"; ClassPool //生成恶意的bytecodes String cmd = "java.lang.Runtime.getRuntime().exec(\"calc\");"; ClassPool classPool = ClassPool.getDefault(); CtClass ctClass = classPool.makeClass("evilexp");
HelloWorld的Class实例 */ public static Class createHelloWorld()throws Exception{ //使用默认的ClassPool ClassPool pool = ClassPool.getDefault(); //创建一个空类 CtClass ctClass = pool.makeClass (1) 在createHelloWorld()方法中创建一个ClassPool,ClassPool本质上就是个CtClass对象容器。 (2) 调用ClassPool的makeClass()方法,传入完整的包名+类名生成一个空的类信息。
String AbstractTranslet="com.sun.org.apache.xalan.internal.xsltc.runtime.AbstractTranslet"; ClassPool classPool=ClassPool.getDefault(); classPool.appendClassPath(AbstractTranslet); CtClass payload=classPool.makeClass("cc4Demo"); payload.setSuperclass(classPool.get(AbstractTranslet
扫码关注腾讯云开发者
领取腾讯云代金券