Skip to content

Commit a746817

Browse files
committed
refactor: remove ShellTool enum
1 parent 4e505d6 commit a746817

File tree

73 files changed

+156
-180
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

73 files changed

+156
-180
lines changed

boot/src/main/java/com/reajason/javaweb/boot/controller/ConfigController.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22

33
import com.reajason.javaweb.boot.vo.CommandConfigVO;
44
import com.reajason.javaweb.memshell.ServerFactory;
5-
import com.reajason.javaweb.memshell.ShellTool;
65
import com.reajason.javaweb.memshell.config.CommandConfig;
76
import com.reajason.javaweb.memshell.server.AbstractServer;
87
import com.reajason.javaweb.packer.Packers;
@@ -50,12 +49,12 @@ public List<String> getPackers() {
5049
continue;
5150
}
5251
Map<String, Set<String>> map = new LinkedHashMap<>(16);
53-
for (ShellTool shellTool : server.getSupportedShellTools()) {
52+
for (String shellTool : server.getSupportedShellTools()) {
5453
Set<String> supportedShellTypes = server.getSupportedShellTypes(shellTool);
5554
if (supportedShellTypes.isEmpty()) {
5655
continue;
5756
}
58-
map.put(shellTool.name(), supportedShellTypes);
57+
map.put(shellTool, supportedShellTypes);
5958
}
6059
coreMap.put(supportedServer, map);
6160
}

boot/src/main/java/com/reajason/javaweb/boot/dto/MemShellGenerateRequest.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66
import lombok.Data;
77
import org.apache.commons.lang3.StringUtils;
88

9+
import static com.reajason.javaweb.memshell.ShellTool.*;
10+
911
/**
1012
* @author ReaJason
1113
* @since 2024/12/18

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ public static MemShellResult generate(ShellConfig shellConfig, InjectorConfig in
4747
shellToolConfig.setShellClass(shellClass);
4848
}
4949

50-
byte[] shellBytes = shellConfig.getShellTool().generateBytes(shellConfig, shellToolConfig);
50+
byte[] shellBytes = ShellToolFactory.generateBytes(shellConfig, shellToolConfig);
5151

5252
injectorConfig.setInjectorClass(injectorClass);
5353
injectorConfig.setShellClassName(shellToolConfig.getShellClassName());

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -219,7 +219,7 @@ public static AbstractServer getServer(String serverName) {
219219
});
220220
}
221221

222-
public static void addToolMapping(ShellTool shellTool, ToolMapping toolMapping) {
222+
public static void addToolMapping(String shellTool, ToolMapping toolMapping) {
223223
Map<String, Class<?>> rawToolMapping = toolMapping.getShellClassMap();
224224
List<String> supportedServers = ServerFactory.getSupportedServers();
225225
for (String supportedServer : supportedServers) {
Lines changed: 9 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -1,41 +1,15 @@
11
package com.reajason.javaweb.memshell;
22

3-
import com.reajason.javaweb.ShellGenerator;
4-
import com.reajason.javaweb.memshell.config.*;
5-
import com.reajason.javaweb.memshell.generator.*;
6-
import com.reajason.javaweb.memshell.generator.command.CommandGenerator;
7-
8-
import java.lang.reflect.Constructor;
9-
103
/**
114
* @author ReaJason
12-
* @since 2024/11/22
5+
* @since 2025/8/22
136
*/
14-
public enum ShellTool {
15-
Godzilla(GodzillaGenerator.class, GodzillaConfig.class),
16-
Command(CommandGenerator.class, CommandConfig.class),
17-
Behinder(BehinderGenerator.class, BehinderConfig.class),
18-
Suo5(Suo5Generator.class, Suo5Config.class),
19-
AntSword(AntSwordGenerator.class, AntSwordConfig.class),
20-
NeoreGeorg(NeoreGeorgGenerator.class, NeoreGeorgConfig.class),
21-
Custom(CustomShellGenerator.class, CustomConfig.class);
22-
23-
private final Class<? extends ShellGenerator> generatorClass;
24-
private final Class<? extends ShellToolConfig> configClass;
25-
26-
ShellTool(Class<? extends ShellGenerator> generatorClass, Class<? extends ShellToolConfig> configClass) {
27-
this.generatorClass = generatorClass;
28-
this.configClass = configClass;
29-
}
30-
31-
public byte[] generateBytes(ShellConfig shellConfig, ShellToolConfig shellToolConfig) {
32-
try {
33-
Constructor<? extends ShellGenerator> constructor =
34-
generatorClass.getConstructor(ShellConfig.class, configClass);
35-
ShellGenerator generator = constructor.newInstance(shellConfig, configClass.cast(shellToolConfig));
36-
return generator.getBytes();
37-
} catch (Exception e) {
38-
throw new RuntimeException("shell generate failed " + e.getMessage(), e);
39-
}
40-
}
7+
public class ShellTool {
8+
public static final String Godzilla = "Godzilla";
9+
public static final String Behinder = "Behinder";
10+
public static final String Command = "Command";
11+
public static final String Suo5 = "Suo5";
12+
public static final String AntSword = "AntSword";
13+
public static final String NeoreGeorg = "NeoreGeorg";
14+
public static final String Custom = "Custom";
4115
}
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
package com.reajason.javaweb.memshell;
2+
3+
import com.reajason.javaweb.GenerationException;
4+
import com.reajason.javaweb.ShellGenerator;
5+
import com.reajason.javaweb.memshell.config.*;
6+
import com.reajason.javaweb.memshell.generator.*;
7+
import com.reajason.javaweb.memshell.generator.command.CommandGenerator;
8+
import org.apache.commons.lang3.tuple.Pair;
9+
10+
import java.lang.reflect.Constructor;
11+
import java.util.Map;
12+
import java.util.concurrent.ConcurrentHashMap;
13+
14+
/**
15+
* @author ReaJason
16+
* @since 2025/08/22
17+
*/
18+
public class ShellToolFactory {
19+
private static final Map<String, Pair<Class<? extends ShellGenerator>, Class<? extends ShellToolConfig>>> instances = new ConcurrentHashMap<>();
20+
21+
static {
22+
register(ShellTool.Godzilla, GodzillaGenerator.class, GodzillaConfig.class);
23+
register(ShellTool.Behinder, BehinderGenerator.class, BehinderConfig.class);
24+
register(ShellTool.Command, CommandGenerator.class, CommandConfig.class);
25+
register(ShellTool.Suo5, Suo5Generator.class, Suo5Config.class);
26+
register(ShellTool.AntSword, AntSwordGenerator.class, AntSwordConfig.class);
27+
register(ShellTool.NeoreGeorg, NeoreGeorgGenerator.class, NeoreGeorgConfig.class);
28+
register(ShellTool.Custom, CustomShellGenerator.class, CustomConfig.class);
29+
}
30+
31+
public static void register(String shellToolName, Class<? extends ShellGenerator> generatorClass, Class<? extends ShellToolConfig> configClass) {
32+
if (shellToolName == null || shellToolName.trim().isEmpty()) {
33+
throw new IllegalArgumentException("ShellTool name cannot be null or empty.");
34+
}
35+
instances.put(shellToolName, Pair.of(generatorClass, configClass));
36+
}
37+
38+
39+
public static byte[] generateBytes(ShellConfig shellConfig, ShellToolConfig shellToolConfig) {
40+
try {
41+
Pair<Class<? extends ShellGenerator>, Class<? extends ShellToolConfig>> classClassPair = instances.get(shellConfig.getShellTool());
42+
Constructor<? extends ShellGenerator> constructor =
43+
classClassPair.getLeft().getConstructor(ShellConfig.class, classClassPair.getRight());
44+
ShellGenerator generator = constructor.newInstance(shellConfig, classClassPair.getRight().cast(shellToolConfig));
45+
return generator.getBytes();
46+
} catch (Exception e) {
47+
throw new GenerationException("shell generate failed " + e.getMessage(), e);
48+
}
49+
}
50+
}

generator/src/main/java/com/reajason/javaweb/memshell/config/ShellConfig.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
package com.reajason.javaweb.memshell.config;
22

3-
import com.reajason.javaweb.memshell.ShellTool;
43
import com.reajason.javaweb.memshell.ShellType;
54
import lombok.AllArgsConstructor;
65
import lombok.Builder;
@@ -31,7 +30,7 @@ public class ShellConfig {
3130
/**
3231
* 内存马功能
3332
*/
34-
private ShellTool shellTool;
33+
private String shellTool;
3534

3635
/**
3736
* 内存马类型

generator/src/main/java/com/reajason/javaweb/memshell/server/AbstractServer.java

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
package com.reajason.javaweb.memshell.server;
22

3-
import com.reajason.javaweb.memshell.ShellTool;
43
import org.apache.commons.lang3.tuple.Pair;
54

65
import java.util.Collections;
@@ -14,7 +13,7 @@
1413
*/
1514
public abstract class AbstractServer {
1615

17-
private final Map<ShellTool, ToolMapping> map = new LinkedHashMap<>();
16+
private final Map<String, ToolMapping> map = new LinkedHashMap<>();
1817

1918
/**
2019
* 定义注入器映射
@@ -27,7 +26,7 @@ public Class<?> getListenerInterceptor() {
2726
return null;
2827
}
2928

30-
public void addToolMapping(ShellTool shellTool, ToolMapping mapping) {
29+
public void addToolMapping(String shellTool, ToolMapping mapping) {
3130
map.put(shellTool, mapping);
3231
}
3332

@@ -37,19 +36,19 @@ public void addToolMapping(ShellTool shellTool, ToolMapping mapping) {
3736
* @param shellTool 内存马功能
3837
* @return shellTypes
3938
*/
40-
public Set<String> getSupportedShellTypes(ShellTool shellTool) {
39+
public Set<String> getSupportedShellTypes(String shellTool) {
4140
ToolMapping toolMapping = map.get(shellTool);
4241
if (toolMapping == null) {
4342
return Collections.emptySet();
4443
}
4544
return Collections.unmodifiableSet(toolMapping.getSupportedShellTypes());
4645
}
4746

48-
public Set<ShellTool> getSupportedShellTools() {
47+
public Set<String> getSupportedShellTools() {
4948
return Collections.unmodifiableSet(map.keySet());
5049
}
5150

52-
public Pair<Class<?>, Class<?>> getShellInjectorPair(ShellTool shellTool, String shellType) {
51+
public Pair<Class<?>, Class<?>> getShellInjectorPair(String shellTool, String shellType) {
5352
ToolMapping mapping = map.get(shellTool);
5453
if (mapping == null) {
5554
throw new UnsupportedOperationException("please implement shell type: " + shellType + " for " + shellTool);

gradle/libs.versions.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[versions]
22
asm = "9.8"
3-
jna = "5.13.0"
3+
jna = "5.13.0" # 为适配 JDK6+ 这个不可修改
44
bcel = "5.2"
55
javax-servlet-api = "3.0.1"
66
javax-websocket-api = "1.1"

integration-test/src/test/java/com/reajason/javaweb/integration/ShellAssertion.java

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
import com.reajason.javaweb.godzilla.GodzillaManager;
77
import com.reajason.javaweb.memshell.MemShellGenerator;
88
import com.reajason.javaweb.memshell.MemShellResult;
9-
import com.reajason.javaweb.memshell.ShellTool;
109
import com.reajason.javaweb.memshell.ShellType;
1110
import com.reajason.javaweb.memshell.config.*;
1211
import com.reajason.javaweb.packer.Packers;
@@ -36,6 +35,7 @@
3635
import java.nio.file.Path;
3736
import java.util.Objects;
3837

38+
import static com.reajason.javaweb.memshell.ShellTool.*;
3939
import static org.hamcrest.CoreMatchers.anyOf;
4040
import static org.hamcrest.CoreMatchers.containsString;
4141
import static org.hamcrest.MatcherAssert.assertThat;
@@ -49,17 +49,17 @@
4949
@Slf4j
5050
public class ShellAssertion {
5151

52-
public static void shellInjectIsOk(String url, String server, String shellType, ShellTool shellTool, int targetJdkVersion, Packers packer) {
52+
public static void shellInjectIsOk(String url, String server, String shellType, String shellTool, int targetJdkVersion, Packers packer) {
5353
shellInjectIsOk(url, server, shellType, shellTool, targetJdkVersion, packer, null);
5454
}
5555

5656
@SneakyThrows
57-
public static void shellInjectIsOk(String url, String server, String shellType, ShellTool shellTool, int targetJdkVersion, Packers packer, GenericContainer<?> container) {
57+
public static void shellInjectIsOk(String url, String server, String shellType, String shellTool, int targetJdkVersion, Packers packer, GenericContainer<?> container) {
5858
shellInjectIsOk(url, server, shellType, shellTool, targetJdkVersion, packer, container, null);
5959
}
6060

6161
@SneakyThrows
62-
public static Pair<String, String> getUrls(String url, String shellType, ShellTool shellTool, Packers packer) {
62+
public static Pair<String, String> getUrls(String url, String shellType, String shellTool, Packers packer) {
6363
String shellUrl = url + "/test";
6464
String urlPattern = null;
6565
if (shellType.endsWith(ShellType.SERVLET)
@@ -80,7 +80,7 @@ public static Pair<String, String> getUrls(String url, String shellType, ShellTo
8080
}
8181

8282
@SneakyThrows
83-
public static void shellInjectIsOk(String url, String server, String shellType, ShellTool shellTool, int targetJdkVersion, Packers packer, GenericContainer<?> appContainer, GenericContainer<?> pythonContainer) {
83+
public static void shellInjectIsOk(String url, String server, String shellType, String shellTool, int targetJdkVersion, Packers packer, GenericContainer<?> appContainer, GenericContainer<?> pythonContainer) {
8484
Pair<String, String> urls = getUrls(url, shellType, shellTool, packer);
8585
String shellUrl = urls.getLeft();
8686
String urlPattern = urls.getRight();
@@ -95,7 +95,7 @@ public static void shellInjectIsOk(String url, String server, String shellType,
9595
}
9696

9797
@SneakyThrows
98-
public static void packerResultAndInject(MemShellResult generateResult, String url, ShellTool shellTool, String shellType, Packers packer, GenericContainer<?> appContainer) {
98+
public static void packerResultAndInject(MemShellResult generateResult, String url, String shellTool, String shellType, Packers packer, GenericContainer<?> appContainer) {
9999
String content = null;
100100
if (packer.getInstance() instanceof AgentJarPacker) {
101101
byte[] bytes = ((JarPacker) packer.getInstance()).packBytes(generateResult.toJarPackerConfig());
@@ -141,7 +141,7 @@ public static void packerResultAndInject(MemShellResult generateResult, String u
141141
}
142142

143143
@SneakyThrows
144-
public static void assertShellIsOk(MemShellResult generateResult, String shellUrl, ShellTool shellTool, String shellType, GenericContainer<?> appContainer, GenericContainer<?> pythonContainer) {
144+
public static void assertShellIsOk(MemShellResult generateResult, String shellUrl, String shellTool, String shellType, GenericContainer<?> appContainer, GenericContainer<?> pythonContainer) {
145145
switch (shellTool) {
146146
case Godzilla:
147147
godzillaIsOk(shellUrl, ((GodzillaConfig) generateResult.getShellToolConfig()));
@@ -233,7 +233,7 @@ public static void antSwordIsOk(String entrypoint, AntSwordConfig shellConfig) {
233233
assertTrue(antSwordManager.getInfo().contains("ok"));
234234
}
235235

236-
public static ShellToolConfig getShellToolConfig(String shellType, ShellTool shellTool, Packers packer) {
236+
public static ShellToolConfig getShellToolConfig(String shellType, String shellTool, Packers packer) {
237237
ShellToolConfig shellToolConfig = null;
238238
String uniqueName = shellTool + RandomStringUtils.randomAlphabetic(5) + shellType + RandomStringUtils.randomAlphabetic(5) + packer.name();
239239
switch (shellTool) {
@@ -288,7 +288,7 @@ public static ShellToolConfig getShellToolConfig(String shellType, ShellTool she
288288
return shellToolConfig;
289289
}
290290

291-
public static MemShellResult generate(String urlPattern, String server, String shellType, ShellTool shellTool, int targetJdkVersion, ShellToolConfig shellToolConfig) {
291+
public static MemShellResult generate(String urlPattern, String server, String shellType, String shellTool, int targetJdkVersion, ShellToolConfig shellToolConfig) {
292292
InjectorConfig injectorConfig = new InjectorConfig();
293293
if (StringUtils.isNotBlank(urlPattern)) {
294294
injectorConfig.setUrlPattern(urlPattern);
@@ -306,7 +306,7 @@ public static MemShellResult generate(String urlPattern, String server, String s
306306
return MemShellGenerator.generate(shellConfig, injectorConfig, shellToolConfig);
307307
}
308308

309-
public static void injectIsOk(String url, String shellType, ShellTool shellTool, String content, Packers packer, GenericContainer<?> container) {
309+
public static void injectIsOk(String url, String shellType, String shellTool, String content, Packers packer, GenericContainer<?> container) {
310310
switch (packer) {
311311
case JSP, ClassLoaderJSP, DefineClassJSP -> {
312312
String uploadEntry = url + "/upload";

0 commit comments

Comments
 (0)