浅看BCEL字节码

什么是BCEL

BCEL是位于sun包下的一个项目,是属于Apache Common的一个子项目

BCEL-LoadClass分析

demo

package org.example;  import com.sun.org.apache.bcel.internal.Repository; import com.sun.org.apache.bcel.internal.classfile.JavaClass; import com.sun.org.apache.bcel.internal.classfile.Utility; import com.sun.org.apache.bcel.internal.util.ClassLoader; import java.io.IOException;   public class Main {     public static void main(String[] args) throws IOException, ClassNotFoundException, InstantiationException, IllegalAccessException {         JavaClass javaClass = Repository.lookupClass(calc.class);         String code = Utility.encode(javaClass.getBytes(), true);         System.out.println(code);         new ClassLoader().loadClass("$$BCEL$$"+code).newInstance();     } } 
package org.example;  import java.io.IOException;  public class calc {     static {         try {             Runtime.getRuntime().exec("calc");         } catch (IOException e) {             throw new RuntimeException(e);         }     } } 

运行即可弹出计算器

流程分析

打个断点进入loadClass,注意这里单步调试是进不去我们要看的ClassLoader的,我们先打个断点,然后手动进去我们要看的com.sun.org.apache.bcel.internal.util.ClassLoader这个,然后在里面打个断点,运行即可
浅看BCEL字节码
进去后,这里会判断头是否是$$BCEL$$,是的话进入createClass
浅看BCEL字节码
这里对我们的code进行解密,退出返回上一层,进入defineClass浅看BCEL字节码
打进去一看,是原生的defineClass,定义了我们的恶意类,然后newInstance的时候弹计算器
就这么点?下篇研究下BCEL内存马

结尾

BCEL字节码可以结合其它进行利用,例如fastjson

发表评论

评论已关闭。

相关文章