From 51cda2b2ba8b945ba3d247cde95ca6dcb991ff28 Mon Sep 17 00:00:00 2001 From: ReaJason Date: Wed, 22 Jan 2025 18:28:37 +0800 Subject: [PATCH] feat: support GZIPBase64 packer --- .../javaweb/memshell/packer/GzipBase64.java | 18 +++++++++++++ .../javaweb/memshell/packer/Packer.java | 4 +++ .../javaweb/memshell/utils/CommonUtil.java | 15 +++++++++++ .../memshell/packer/GzipBase64Test.java | 25 +++++++++++++++++++ 4 files changed, 62 insertions(+) create mode 100644 generator/src/main/java/com/reajason/javaweb/memshell/packer/GzipBase64.java create mode 100644 generator/src/test/java/com/reajason/javaweb/memshell/packer/GzipBase64Test.java diff --git a/generator/src/main/java/com/reajason/javaweb/memshell/packer/GzipBase64.java b/generator/src/main/java/com/reajason/javaweb/memshell/packer/GzipBase64.java new file mode 100644 index 00000000..78ac6a02 --- /dev/null +++ b/generator/src/main/java/com/reajason/javaweb/memshell/packer/GzipBase64.java @@ -0,0 +1,18 @@ +package com.reajason.javaweb.memshell.packer; + +import com.reajason.javaweb.memshell.config.GenerateResult; +import com.reajason.javaweb.memshell.utils.CommonUtil; +import lombok.SneakyThrows; +import org.apache.commons.codec.binary.Base64; + +/** + * @author ReaJason + * @since 2025/1/22 + */ +public class GzipBase64 implements Packer { + @Override + @SneakyThrows + public String pack(GenerateResult generateResult) { + return Base64.encodeBase64String(CommonUtil.gzipCompress(generateResult.getInjectorBytes())); + } +} 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 index 7a70c29e..5c3569f8 100644 --- a/generator/src/main/java/com/reajason/javaweb/memshell/packer/Packer.java +++ b/generator/src/main/java/com/reajason/javaweb/memshell/packer/Packer.java @@ -44,6 +44,10 @@ public interface Packer { */ Base64(new Base64Packer()), + /** + * GzipBase64 + */ + GzipBase64(new GzipBase64()), /** * BCEL */ diff --git a/generator/src/main/java/com/reajason/javaweb/memshell/utils/CommonUtil.java b/generator/src/main/java/com/reajason/javaweb/memshell/utils/CommonUtil.java index 862b5dc8..b887cc12 100644 --- a/generator/src/main/java/com/reajason/javaweb/memshell/utils/CommonUtil.java +++ b/generator/src/main/java/com/reajason/javaweb/memshell/utils/CommonUtil.java @@ -2,10 +2,12 @@ package com.reajason.javaweb.memshell.utils; import com.reajason.javaweb.memshell.config.Server; +import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.security.SecureRandom; import java.util.Random; +import java.util.zip.GZIPInputStream; import java.util.zip.GZIPOutputStream; /** @@ -43,6 +45,19 @@ public class CommonUtil { return out.toByteArray(); } + public static byte[] gzipDecompress(byte[] data) throws IOException { + ByteArrayOutputStream out = new ByteArrayOutputStream(); + try (GZIPInputStream gzip = new GZIPInputStream(new ByteArrayInputStream(data))) { + byte[] buffer = new byte[1024]; + int length; + while ((length = gzip.read(buffer)) != -1) { + out.write(buffer, 0, length); + + } + } + return out.toByteArray(); + } + public static String getRandomString(int length) { String str = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; SecureRandom random = new SecureRandom(); 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 new file mode 100644 index 00000000..3aedbbcd --- /dev/null +++ b/generator/src/test/java/com/reajason/javaweb/memshell/packer/GzipBase64Test.java @@ -0,0 +1,25 @@ +package com.reajason.javaweb.memshell.packer; + +import com.reajason.javaweb.memshell.config.GenerateResult; +import com.reajason.javaweb.memshell.utils.CommonUtil; +import lombok.SneakyThrows; +import org.apache.commons.codec.binary.Base64; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +/** + * @author ReaJason + * @since 2025/1/22 + */ +class GzipBase64Test { + + @Test + @SneakyThrows + void compress() { + GenerateResult generateResult = new GenerateResult(); + generateResult.setInjectorBytes("hello world".getBytes()); + String pack = new GzipBase64().pack(generateResult); + assertEquals("hello world", new String(CommonUtil.gzipDecompress(Base64.decodeBase64(pack)))); + } +} \ No newline at end of file