mirror of
https://github.com/ReaJason/MemShellParty.git
synced 2026-09-25 16:31:53 +08:00
refactor: rename
1. 将枚举 Server 改为字符串常量,使得 memshell 和 probeshell 都能共用 2. 移除 memshell 模块直接内置在 generator 中 3. 通用类从 memshell 移动至 javaweb 下,命名修改,增加辨识度
This commit is contained in:
@@ -1,6 +1,6 @@
|
||||
package com.reajason.javaweb.probe;
|
||||
|
||||
import com.reajason.javaweb.memshell.generator.ShellGenerator;
|
||||
import com.reajason.javaweb.ShellGenerator;
|
||||
import com.reajason.javaweb.probe.config.*;
|
||||
import com.reajason.javaweb.probe.generator.DnsLogGenerator;
|
||||
import com.reajason.javaweb.probe.generator.SleepGenerator;
|
||||
|
||||
+4
-4
@@ -1,22 +1,22 @@
|
||||
package com.reajason.javaweb.probe;
|
||||
|
||||
import com.reajason.javaweb.memshell.utils.CommonUtil;
|
||||
import com.reajason.javaweb.probe.config.ProbeConfig;
|
||||
import com.reajason.javaweb.probe.config.ProbeContentConfig;
|
||||
import com.reajason.javaweb.utils.CommonUtil;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
|
||||
/**
|
||||
* @author ReaJason
|
||||
* @since 2025/6/29
|
||||
*/
|
||||
public class ProbeGenerator {
|
||||
public class ProbeShellGenerator {
|
||||
|
||||
public static ProbeResult generate(ProbeConfig probeConfig, ProbeContentConfig contentConfig) {
|
||||
public static ProbeShellResult generate(ProbeConfig probeConfig, ProbeContentConfig contentConfig) {
|
||||
if (StringUtils.isBlank(probeConfig.getShellClassName())) {
|
||||
probeConfig.setShellClassName(CommonUtil.generateInjectorClassName());
|
||||
}
|
||||
byte[] bytes = probeConfig.getProbeMethod().generateBytes(probeConfig, contentConfig);
|
||||
return ProbeResult.builder()
|
||||
return ProbeShellResult.builder()
|
||||
.shellClassName(probeConfig.getShellClassName())
|
||||
.shellBytes(bytes)
|
||||
.probeConfig(probeConfig)
|
||||
+3
-3
@@ -18,7 +18,7 @@ import java.util.Base64;
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
@Builder(builderClassName = "Builder")
|
||||
public class ProbeResult {
|
||||
public class ProbeShellResult {
|
||||
private String shellClassName;
|
||||
private transient byte[] shellBytes;
|
||||
private long shellSize;
|
||||
@@ -27,12 +27,12 @@ public class ProbeResult {
|
||||
private ProbeContentConfig probeContentConfig;
|
||||
|
||||
public static class Builder {
|
||||
public ProbeResult build() {
|
||||
public ProbeShellResult build() {
|
||||
if (shellBytes != null) {
|
||||
shellBytesBase64Str = Base64.getEncoder().encodeToString(shellBytes);
|
||||
shellSize = shellBytes.length;
|
||||
}
|
||||
return new ProbeResult(shellClassName, shellBytes, shellSize, shellBytesBase64Str, probeConfig, probeContentConfig);
|
||||
return new ProbeShellResult(shellClassName, shellBytes, shellSize, shellBytesBase64Str, probeConfig, probeContentConfig);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,13 +1,12 @@
|
||||
package com.reajason.javaweb.probe.config;
|
||||
|
||||
import com.reajason.javaweb.memshell.utils.CommonUtil;
|
||||
import com.reajason.javaweb.probe.ProbeContent;
|
||||
import com.reajason.javaweb.probe.ProbeMethod;
|
||||
import com.reajason.javaweb.utils.CommonUtil;
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Builder;
|
||||
import lombok.Data;
|
||||
import lombok.NoArgsConstructor;
|
||||
import lombok.experimental.SuperBuilder;
|
||||
import net.bytebuddy.jar.asm.Opcodes;
|
||||
|
||||
/**
|
||||
|
||||
+1
-1
@@ -1,9 +1,9 @@
|
||||
package com.reajason.javaweb.probe.generator;
|
||||
|
||||
import com.reajason.javaweb.ClassBytesShrink;
|
||||
import com.reajason.javaweb.ShellGenerator;
|
||||
import com.reajason.javaweb.buddy.ByPassJavaModuleInterceptor;
|
||||
import com.reajason.javaweb.buddy.LogRemoveMethodVisitor;
|
||||
import com.reajason.javaweb.memshell.generator.ShellGenerator;
|
||||
import com.reajason.javaweb.probe.config.ProbeConfig;
|
||||
import com.reajason.javaweb.probe.config.ProbeContentConfig;
|
||||
import net.bytebuddy.ByteBuddy;
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
package com.reajason.javaweb.probe.generator;
|
||||
|
||||
import com.reajason.javaweb.buddy.TargetJreVersionVisitorWrapper;
|
||||
import com.reajason.javaweb.memshell.utils.CommonUtil;
|
||||
import com.reajason.javaweb.probe.ProbeContent;
|
||||
import com.reajason.javaweb.probe.config.DnsLogConfig;
|
||||
import com.reajason.javaweb.probe.config.ProbeConfig;
|
||||
@@ -9,6 +8,7 @@ import com.reajason.javaweb.probe.payload.JdkProbe;
|
||||
import com.reajason.javaweb.probe.payload.ServerProbe;
|
||||
import com.reajason.javaweb.probe.payload.dns.DnsLogJdk;
|
||||
import com.reajason.javaweb.probe.payload.dns.DnsLogServer;
|
||||
import com.reajason.javaweb.utils.CommonUtil;
|
||||
import net.bytebuddy.ByteBuddy;
|
||||
import net.bytebuddy.asm.Advice;
|
||||
import net.bytebuddy.dynamic.DynamicType;
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
package com.reajason.javaweb.probe.generator;
|
||||
|
||||
import com.reajason.javaweb.buddy.TargetJreVersionVisitorWrapper;
|
||||
import com.reajason.javaweb.memshell.utils.CommonUtil;
|
||||
import com.reajason.javaweb.probe.ProbeContent;
|
||||
import com.reajason.javaweb.probe.config.ProbeConfig;
|
||||
import com.reajason.javaweb.probe.config.SleepConfig;
|
||||
import com.reajason.javaweb.probe.payload.ServerProbe;
|
||||
import com.reajason.javaweb.probe.payload.sleep.SleepServer;
|
||||
import com.reajason.javaweb.utils.CommonUtil;
|
||||
import net.bytebuddy.ByteBuddy;
|
||||
import net.bytebuddy.asm.Advice;
|
||||
import net.bytebuddy.dynamic.DynamicType;
|
||||
|
||||
+45
-51
@@ -1,15 +1,15 @@
|
||||
package com.reajason.javaweb.probe.generator.response;
|
||||
|
||||
import com.reajason.javaweb.Constants;
|
||||
import com.reajason.javaweb.Server;
|
||||
import com.reajason.javaweb.buddy.MethodCallReplaceVisitorWrapper;
|
||||
import com.reajason.javaweb.buddy.TargetJreVersionVisitorWrapper;
|
||||
import com.reajason.javaweb.memshell.utils.ShellCommonUtil;
|
||||
import com.reajason.javaweb.probe.config.ProbeConfig;
|
||||
import com.reajason.javaweb.probe.config.ResponseBodyConfig;
|
||||
import com.reajason.javaweb.probe.generator.ByteBuddyShellGenerator;
|
||||
import com.reajason.javaweb.probe.payload.ByteCodeProbe;
|
||||
import com.reajason.javaweb.probe.payload.CommandProbe;
|
||||
import com.reajason.javaweb.probe.payload.response.*;
|
||||
import com.reajason.javaweb.utils.ShellCommonUtil;
|
||||
import net.bytebuddy.ByteBuddy;
|
||||
import net.bytebuddy.asm.Advice;
|
||||
import net.bytebuddy.dynamic.DynamicType;
|
||||
@@ -39,61 +39,55 @@ public class ResponseBodyGenerator extends ByteBuddyShellGenerator<ResponseBodyC
|
||||
name = probeContentConfig.getReqHeaderName();
|
||||
getDataFromReqInterceptor = getDataFromReqHeaderInterceptor.class;
|
||||
}
|
||||
Class<?> templateClass;
|
||||
switch (probeContentConfig.getServer()) {
|
||||
case Constants.Server.JETTY:
|
||||
templateClass = JettyWriter.class;
|
||||
break;
|
||||
case Constants.Server.TOMCAT:
|
||||
case Constants.Server.JBOSS:
|
||||
case Constants.Server.BES:
|
||||
templateClass = TomcatWriter.class;
|
||||
break;
|
||||
case Constants.Server.TONGWEB:
|
||||
templateClass = TongWebWriter.class;
|
||||
break;
|
||||
case Constants.Server.RESIN:
|
||||
templateClass = ResinWriter.class;
|
||||
break;
|
||||
case Constants.Server.UNDERTOW:
|
||||
templateClass = UndertowWriter.class;
|
||||
break;
|
||||
case Constants.Server.GLASSFISH:
|
||||
case Constants.Server.INFORSUITE:
|
||||
templateClass = GlassFishWriter.class;
|
||||
break;
|
||||
case Constants.Server.WEBSPHERE:
|
||||
templateClass = WebSphereWriter.class;
|
||||
break;
|
||||
case Constants.Server.WEBLOGIC:
|
||||
templateClass = WebLogicWriter.class;
|
||||
break;
|
||||
case Constants.Server.APUSIC:
|
||||
templateClass = ApusicWriter.class;
|
||||
break;
|
||||
default:
|
||||
throw new IllegalArgumentException("responseBody now supported for server: " + probeContentConfig.getServer());
|
||||
}
|
||||
|
||||
Class<?> runInterceptor;
|
||||
switch (probeConfig.getProbeContent()) {
|
||||
case Command:
|
||||
runInterceptor = CommandProbe.class;
|
||||
break;
|
||||
case Bytecode:
|
||||
runInterceptor = ByteCodeProbe.class;
|
||||
break;
|
||||
default:
|
||||
throw new IllegalArgumentException("responseBody not supported for probe content: " + probeConfig.getProbeContent());
|
||||
}
|
||||
return buddy.redefine(templateClass)
|
||||
Class<?> writerClass = getWriterClass();
|
||||
Class<?> runnerClass = getRunnerClass();
|
||||
return buddy.redefine(writerClass)
|
||||
.name(probeConfig.getShellClassName())
|
||||
.visit(new TargetJreVersionVisitorWrapper(probeConfig.getTargetJreVersion()))
|
||||
.visit(MethodCallReplaceVisitorWrapper.newInstance("getDataFromReq",
|
||||
probeConfig.getShellClassName(), ShellCommonUtil.class.getName()))
|
||||
.visit(Advice.withCustomMapping().bind(NameAnnotation.class, name)
|
||||
.to(getDataFromReqInterceptor).on(named("getDataFromReq")))
|
||||
.visit(Advice.to(runInterceptor).on(named("run")));
|
||||
.visit(Advice.to(runnerClass).on(named("run")));
|
||||
}
|
||||
|
||||
private Class<?> getRunnerClass() {
|
||||
switch (probeConfig.getProbeContent()) {
|
||||
case Command:
|
||||
return CommandProbe.class;
|
||||
case Bytecode:
|
||||
return ByteCodeProbe.class;
|
||||
default:
|
||||
throw new IllegalArgumentException("responseBody not supported for probe content: " + probeConfig.getProbeContent());
|
||||
}
|
||||
}
|
||||
|
||||
private Class<?> getWriterClass() {
|
||||
switch (probeContentConfig.getServer()) {
|
||||
case Server.Jetty:
|
||||
return JettyWriter.class;
|
||||
case Server.Tomcat:
|
||||
case Server.JBoss:
|
||||
case Server.BES:
|
||||
return TomcatWriter.class;
|
||||
case Server.TongWeb:
|
||||
return TongWebWriter.class;
|
||||
case Server.Resin:
|
||||
return ResinWriter.class;
|
||||
case Server.Undertow:
|
||||
return UndertowWriter.class;
|
||||
case Server.GlassFish:
|
||||
case Server.InforSuite:
|
||||
return GlassFishWriter.class;
|
||||
case Server.WebSphere:
|
||||
return WebSphereWriter.class;
|
||||
case Server.WebLogic:
|
||||
return WebLogicWriter.class;
|
||||
case Server.Apusic:
|
||||
return ApusicWriter.class;
|
||||
default:
|
||||
throw new IllegalArgumentException("responseBody now supported for server: " + probeContentConfig.getServer());
|
||||
}
|
||||
}
|
||||
|
||||
static class getDataFromReqHeaderInterceptor {
|
||||
|
||||
Reference in New Issue
Block a user