一、概述
BCEL的全名应该是Apache Commons BCEL,属于Apache Commons项目下的一个子项目。Apache Commons大家应该不陌生,反序列化最著名的利用链就是出自于其另一个子项目——Apache Commons Collections。
就这个库的功能来看,其使用面远不及同胞兄弟们,但是他比Commons Collections特殊的一点是,它被包含在了原生的JDK中,位于com.sun.org.apache.bcel。
二、BCEL ClassLoader如何使用
BCEL这个包中有个有趣的类com.sun.org.apache.bcel.internal.util.ClassLoader,他是一个ClassLoader,但是他重写了Java内置的ClassLoader#loadClass()方法。
-
在ClassLoader#loadClass()中,接受一个String并且判断类名是否是$$BCEL$$开头,如果是的话,调用createClass方法。

-
此方法中将会对这个字符串截取$$BCEL$$后面的字符串进行decode,解码后经过一些列处理后返回clazz,也就是javaclass。

-
当我们的字节码加载完成javaclass后,如果不为空,即调用definClass方法动态加载。

文章介绍了ApacheCommonsBCEL项目,这是一个被包含在JDK中的库,用于处理Java字节码。BCELClassLoader是一个特殊的ClassLoader,它可以加载以$$BCEL$$开头的类名,并对其进行解码和处理。文章通过示例展示了如何使用BCEL将字节码编码并动态加载,同时提到了在Java8u251中该ClassLoader被移除的安全改进。
最低0.47元/天 解锁文章
1321

被折叠的 条评论
为什么被折叠?



