refactor: rename

1. 将枚举 Server 改为字符串常量,使得 memshell 和 probeshell 都能共用
2. 移除 memshell 模块直接内置在 generator 中
3. 通用类从 memshell 移动至 javaweb 下,命名修改,增加辨识度
This commit is contained in:
ReaJason
2025-08-13 23:53:40 +08:00
parent d4bde3baad
commit f9dce4f84b
354 changed files with 1094 additions and 1387 deletions
@@ -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;
@@ -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)
@@ -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,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;
@@ -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 {