From f33de9d82c86d7586622150c9413b906dafba2e9 Mon Sep 17 00:00:00 2001 From: qi4l Date: Wed, 29 Apr 2026 08:52:00 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E5=8E=BB=E9=99=A4RMIServer=E4=B8=AD?= =?UTF-8?q?=E7=9A=84=E9=87=8D=E5=A4=8D=E4=BB=A3=E7=A0=81=E6=AE=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../qi4l/JYso/gadgets/utils/JRMPUtils.java | 25 +++++++++++ .../gadgets/utils/MarshalOutputStream.java | 43 +++++++++++++++++++ 2 files changed, 68 insertions(+) create mode 100644 src/main/java/com/qi4l/JYso/gadgets/utils/JRMPUtils.java create mode 100644 src/main/java/com/qi4l/JYso/gadgets/utils/MarshalOutputStream.java diff --git a/src/main/java/com/qi4l/JYso/gadgets/utils/JRMPUtils.java b/src/main/java/com/qi4l/JYso/gadgets/utils/JRMPUtils.java new file mode 100644 index 0000000..a433283 --- /dev/null +++ b/src/main/java/com/qi4l/JYso/gadgets/utils/JRMPUtils.java @@ -0,0 +1,25 @@ +package com.qi4l.JYso.gadgets.utils; + +import sun.rmi.transport.TransportConstants; + +import java.io.BufferedOutputStream; +import java.io.DataInputStream; +import java.io.DataOutputStream; +import java.io.IOException; +import java.io.OutputStream; +import java.net.Socket; + +public class JRMPUtils { + + public static DataOutputStream handshake(DataInputStream in, Socket s) throws IOException { + int magic = in.readInt(); + short version = in.readShort(); + if (magic != TransportConstants.Magic || version != TransportConstants.Version) { + s.close(); + return null; + } + OutputStream sockOut = s.getOutputStream(); + BufferedOutputStream bufOut = new BufferedOutputStream(sockOut); + return new DataOutputStream(bufOut); + } +} diff --git a/src/main/java/com/qi4l/JYso/gadgets/utils/MarshalOutputStream.java b/src/main/java/com/qi4l/JYso/gadgets/utils/MarshalOutputStream.java new file mode 100644 index 0000000..1eb81c6 --- /dev/null +++ b/src/main/java/com/qi4l/JYso/gadgets/utils/MarshalOutputStream.java @@ -0,0 +1,43 @@ +package com.qi4l.JYso.gadgets.utils; + +import java.io.IOException; +import java.io.ObjectOutputStream; +import java.io.OutputStream; +import java.net.URL; +import java.net.URLClassLoader; + +public class MarshalOutputStream extends ObjectOutputStream { + + private final URL sendUrl; + + public MarshalOutputStream(OutputStream out, URL u) throws IOException { + super(out); + this.sendUrl = u; + } + + public MarshalOutputStream(OutputStream out) throws IOException { + super(out); + this.sendUrl = null; + } + + @Override + protected void annotateClass(Class cl) throws IOException { + if (this.sendUrl != null) { + writeObject(this.sendUrl.toString()); + } else if (!(cl.getClassLoader() instanceof URLClassLoader)) { + writeObject(null); + } else { + URL[] us = ((URLClassLoader) cl.getClassLoader()).getURLs(); + StringBuilder cb = new StringBuilder(); + for (URL u : us) { + cb.append(u.toString()); + } + writeObject(cb.toString()); + } + } + + @Override + protected void annotateProxyClass(Class cl) throws IOException { + annotateClass(cl); + } +}