mirror of
https://github.com/ReaJason/MemShellParty.git
synced 2026-09-22 15:10:43 +08:00
refactor: remove ShellTool enum
This commit is contained in:
@@ -47,7 +47,7 @@ public class MemShellGenerator {
|
||||
shellToolConfig.setShellClass(shellClass);
|
||||
}
|
||||
|
||||
byte[] shellBytes = shellConfig.getShellTool().generateBytes(shellConfig, shellToolConfig);
|
||||
byte[] shellBytes = ShellToolFactory.generateBytes(shellConfig, shellToolConfig);
|
||||
|
||||
injectorConfig.setInjectorClass(injectorClass);
|
||||
injectorConfig.setShellClassName(shellToolConfig.getShellClassName());
|
||||
|
||||
@@ -219,7 +219,7 @@ public class ServerFactory {
|
||||
});
|
||||
}
|
||||
|
||||
public static void addToolMapping(ShellTool shellTool, ToolMapping toolMapping) {
|
||||
public static void addToolMapping(String shellTool, ToolMapping toolMapping) {
|
||||
Map<String, Class<?>> rawToolMapping = toolMapping.getShellClassMap();
|
||||
List<String> supportedServers = ServerFactory.getSupportedServers();
|
||||
for (String supportedServer : supportedServers) {
|
||||
|
||||
@@ -1,41 +1,15 @@
|
||||
package com.reajason.javaweb.memshell;
|
||||
|
||||
import com.reajason.javaweb.ShellGenerator;
|
||||
import com.reajason.javaweb.memshell.config.*;
|
||||
import com.reajason.javaweb.memshell.generator.*;
|
||||
import com.reajason.javaweb.memshell.generator.command.CommandGenerator;
|
||||
|
||||
import java.lang.reflect.Constructor;
|
||||
|
||||
/**
|
||||
* @author ReaJason
|
||||
* @since 2024/11/22
|
||||
* @since 2025/8/22
|
||||
*/
|
||||
public enum ShellTool {
|
||||
Godzilla(GodzillaGenerator.class, GodzillaConfig.class),
|
||||
Command(CommandGenerator.class, CommandConfig.class),
|
||||
Behinder(BehinderGenerator.class, BehinderConfig.class),
|
||||
Suo5(Suo5Generator.class, Suo5Config.class),
|
||||
AntSword(AntSwordGenerator.class, AntSwordConfig.class),
|
||||
NeoreGeorg(NeoreGeorgGenerator.class, NeoreGeorgConfig.class),
|
||||
Custom(CustomShellGenerator.class, CustomConfig.class);
|
||||
|
||||
private final Class<? extends ShellGenerator> generatorClass;
|
||||
private final Class<? extends ShellToolConfig> configClass;
|
||||
|
||||
ShellTool(Class<? extends ShellGenerator> generatorClass, Class<? extends ShellToolConfig> configClass) {
|
||||
this.generatorClass = generatorClass;
|
||||
this.configClass = configClass;
|
||||
}
|
||||
|
||||
public byte[] generateBytes(ShellConfig shellConfig, ShellToolConfig shellToolConfig) {
|
||||
try {
|
||||
Constructor<? extends ShellGenerator> constructor =
|
||||
generatorClass.getConstructor(ShellConfig.class, configClass);
|
||||
ShellGenerator generator = constructor.newInstance(shellConfig, configClass.cast(shellToolConfig));
|
||||
return generator.getBytes();
|
||||
} catch (Exception e) {
|
||||
throw new RuntimeException("shell generate failed " + e.getMessage(), e);
|
||||
}
|
||||
}
|
||||
public class ShellTool {
|
||||
public static final String Godzilla = "Godzilla";
|
||||
public static final String Behinder = "Behinder";
|
||||
public static final String Command = "Command";
|
||||
public static final String Suo5 = "Suo5";
|
||||
public static final String AntSword = "AntSword";
|
||||
public static final String NeoreGeorg = "NeoreGeorg";
|
||||
public static final String Custom = "Custom";
|
||||
}
|
||||
|
||||
@@ -0,0 +1,50 @@
|
||||
package com.reajason.javaweb.memshell;
|
||||
|
||||
import com.reajason.javaweb.GenerationException;
|
||||
import com.reajason.javaweb.ShellGenerator;
|
||||
import com.reajason.javaweb.memshell.config.*;
|
||||
import com.reajason.javaweb.memshell.generator.*;
|
||||
import com.reajason.javaweb.memshell.generator.command.CommandGenerator;
|
||||
import org.apache.commons.lang3.tuple.Pair;
|
||||
|
||||
import java.lang.reflect.Constructor;
|
||||
import java.util.Map;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
|
||||
/**
|
||||
* @author ReaJason
|
||||
* @since 2025/08/22
|
||||
*/
|
||||
public class ShellToolFactory {
|
||||
private static final Map<String, Pair<Class<? extends ShellGenerator>, Class<? extends ShellToolConfig>>> instances = new ConcurrentHashMap<>();
|
||||
|
||||
static {
|
||||
register(ShellTool.Godzilla, GodzillaGenerator.class, GodzillaConfig.class);
|
||||
register(ShellTool.Behinder, BehinderGenerator.class, BehinderConfig.class);
|
||||
register(ShellTool.Command, CommandGenerator.class, CommandConfig.class);
|
||||
register(ShellTool.Suo5, Suo5Generator.class, Suo5Config.class);
|
||||
register(ShellTool.AntSword, AntSwordGenerator.class, AntSwordConfig.class);
|
||||
register(ShellTool.NeoreGeorg, NeoreGeorgGenerator.class, NeoreGeorgConfig.class);
|
||||
register(ShellTool.Custom, CustomShellGenerator.class, CustomConfig.class);
|
||||
}
|
||||
|
||||
public static void register(String shellToolName, Class<? extends ShellGenerator> generatorClass, Class<? extends ShellToolConfig> configClass) {
|
||||
if (shellToolName == null || shellToolName.trim().isEmpty()) {
|
||||
throw new IllegalArgumentException("ShellTool name cannot be null or empty.");
|
||||
}
|
||||
instances.put(shellToolName, Pair.of(generatorClass, configClass));
|
||||
}
|
||||
|
||||
|
||||
public static byte[] generateBytes(ShellConfig shellConfig, ShellToolConfig shellToolConfig) {
|
||||
try {
|
||||
Pair<Class<? extends ShellGenerator>, Class<? extends ShellToolConfig>> classClassPair = instances.get(shellConfig.getShellTool());
|
||||
Constructor<? extends ShellGenerator> constructor =
|
||||
classClassPair.getLeft().getConstructor(ShellConfig.class, classClassPair.getRight());
|
||||
ShellGenerator generator = constructor.newInstance(shellConfig, classClassPair.getRight().cast(shellToolConfig));
|
||||
return generator.getBytes();
|
||||
} catch (Exception e) {
|
||||
throw new GenerationException("shell generate failed " + e.getMessage(), e);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,6 +1,5 @@
|
||||
package com.reajason.javaweb.memshell.config;
|
||||
|
||||
import com.reajason.javaweb.memshell.ShellTool;
|
||||
import com.reajason.javaweb.memshell.ShellType;
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Builder;
|
||||
@@ -31,7 +30,7 @@ public class ShellConfig {
|
||||
/**
|
||||
* 内存马功能
|
||||
*/
|
||||
private ShellTool shellTool;
|
||||
private String shellTool;
|
||||
|
||||
/**
|
||||
* 内存马类型
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
package com.reajason.javaweb.memshell.server;
|
||||
|
||||
import com.reajason.javaweb.memshell.ShellTool;
|
||||
import org.apache.commons.lang3.tuple.Pair;
|
||||
|
||||
import java.util.Collections;
|
||||
@@ -14,7 +13,7 @@ import java.util.Set;
|
||||
*/
|
||||
public abstract class AbstractServer {
|
||||
|
||||
private final Map<ShellTool, ToolMapping> map = new LinkedHashMap<>();
|
||||
private final Map<String, ToolMapping> map = new LinkedHashMap<>();
|
||||
|
||||
/**
|
||||
* 定义注入器映射
|
||||
@@ -27,7 +26,7 @@ public abstract class AbstractServer {
|
||||
return null;
|
||||
}
|
||||
|
||||
public void addToolMapping(ShellTool shellTool, ToolMapping mapping) {
|
||||
public void addToolMapping(String shellTool, ToolMapping mapping) {
|
||||
map.put(shellTool, mapping);
|
||||
}
|
||||
|
||||
@@ -37,7 +36,7 @@ public abstract class AbstractServer {
|
||||
* @param shellTool 内存马功能
|
||||
* @return shellTypes
|
||||
*/
|
||||
public Set<String> getSupportedShellTypes(ShellTool shellTool) {
|
||||
public Set<String> getSupportedShellTypes(String shellTool) {
|
||||
ToolMapping toolMapping = map.get(shellTool);
|
||||
if (toolMapping == null) {
|
||||
return Collections.emptySet();
|
||||
@@ -45,11 +44,11 @@ public abstract class AbstractServer {
|
||||
return Collections.unmodifiableSet(toolMapping.getSupportedShellTypes());
|
||||
}
|
||||
|
||||
public Set<ShellTool> getSupportedShellTools() {
|
||||
public Set<String> getSupportedShellTools() {
|
||||
return Collections.unmodifiableSet(map.keySet());
|
||||
}
|
||||
|
||||
public Pair<Class<?>, Class<?>> getShellInjectorPair(ShellTool shellTool, String shellType) {
|
||||
public Pair<Class<?>, Class<?>> getShellInjectorPair(String shellTool, String shellType) {
|
||||
ToolMapping mapping = map.get(shellTool);
|
||||
if (mapping == null) {
|
||||
throw new UnsupportedOperationException("please implement shell type: " + shellType + " for " + shellTool);
|
||||
|
||||
Reference in New Issue
Block a user