mirror of
https://github.com/SerendipityR-2022/EndMinecraftPlusV2.git
synced 2024-10-31 20:08:00 +00:00
修复协议版本754后的Forge伪造支持
This commit is contained in:
parent
992a9b7d75
commit
9049294010
@ -8,7 +8,7 @@ import cn.serendipityr.EndMinecraftPlusV2.VersionControl.AttackManager;
|
|||||||
import cn.serendipityr.EndMinecraftPlusV2.VersionControl.ProtocolLibs;
|
import cn.serendipityr.EndMinecraftPlusV2.VersionControl.ProtocolLibs;
|
||||||
|
|
||||||
public class EndMinecraftPlusV2 {
|
public class EndMinecraftPlusV2 {
|
||||||
public static String ver = "1.2.6";
|
public static String ver = "1.2.7";
|
||||||
public static Integer CfgVer = 2;
|
public static Integer CfgVer = 2;
|
||||||
|
|
||||||
public static void main(String[] args) {
|
public static void main(String[] args) {
|
||||||
|
@ -1,15 +1,16 @@
|
|||||||
package cn.serendipityr.EndMinecraftPlusV2.VersionControl.NewVersion.ForgeProtocol;
|
package cn.serendipityr.EndMinecraftPlusV2.VersionControl.NewVersion.ForgeProtocol;
|
||||||
|
|
||||||
import cn.serendipityr.EndMinecraftPlusV2.Tools.LogUtil;
|
import cn.serendipityr.EndMinecraftPlusV2.VersionControl.ProtocolLibs;
|
||||||
import com.github.steveice10.mc.protocol.packet.ingame.client.ClientPluginMessagePacket;
|
import com.github.steveice10.mc.protocol.packet.ingame.client.ClientPluginMessagePacket;
|
||||||
|
import com.github.steveice10.mc.protocol.packet.ingame.clientbound.ClientboundCustomPayloadPacket;
|
||||||
import com.github.steveice10.mc.protocol.packet.ingame.server.ServerPluginMessagePacket;
|
import com.github.steveice10.mc.protocol.packet.ingame.server.ServerPluginMessagePacket;
|
||||||
|
import com.github.steveice10.mc.protocol.packet.ingame.serverbound.ServerboundCustomPayloadPacket;
|
||||||
import com.github.steveice10.packetlib.Session;
|
import com.github.steveice10.packetlib.Session;
|
||||||
import com.github.steveice10.packetlib.event.session.*;
|
import com.github.steveice10.packetlib.event.session.*;
|
||||||
import com.github.steveice10.packetlib.packet.Packet;
|
import com.github.steveice10.packetlib.packet.Packet;
|
||||||
|
|
||||||
import java.lang.reflect.Field;
|
import java.lang.reflect.Field;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Scanner;
|
|
||||||
|
|
||||||
public class MCForge {
|
public class MCForge {
|
||||||
private final MCForgeHandShake handshake;
|
private final MCForgeHandShake handshake;
|
||||||
@ -24,44 +25,93 @@ public class MCForge {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void init() {
|
public void init() {
|
||||||
this.session.addListener(new SessionListener() {
|
if (ProtocolLibs.adaptAfter754) {
|
||||||
public void packetReceived(PacketReceivedEvent e) {
|
this.session.addListener(new SessionListener() {
|
||||||
if (e.getPacket() instanceof ServerPluginMessagePacket) {
|
public void packetReceived(PacketReceivedEvent e) {
|
||||||
handle(e.getPacket());
|
if (e.getPacket() instanceof ClientboundCustomPayloadPacket) {
|
||||||
} else if (e.getPacket().getClass().getSimpleName().equals("LoginPluginRequestPacket")) {
|
handle(e.getPacket());
|
||||||
handshake.handle(e.getPacket());
|
} else if (e.getPacket().getClass().getSimpleName().equals("ClientboundCustomQueryPacket")) {
|
||||||
|
handshake.newHandle(e.getPacket());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
public void packetReceived(Session session, Packet packet) {
|
public void packetReceived(Session session, Packet packet) {
|
||||||
|
if (packet instanceof ClientboundCustomPayloadPacket) {
|
||||||
|
newHandle((ClientboundCustomPayloadPacket) packet);
|
||||||
|
} else if (packet.getClass().getSimpleName().equals("ClientboundCustomQueryPacket")) {
|
||||||
|
handshake.newHandle(packet);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
public void packetSending(PacketSendingEvent packetSendingEvent) {
|
||||||
|
|
||||||
public void packetSending(PacketSendingEvent packetSendingEvent) {
|
}
|
||||||
|
|
||||||
}
|
public void packetSent(Session session, Packet packet) {
|
||||||
|
|
||||||
public void packetSent(Session session, Packet packet) {
|
}
|
||||||
|
|
||||||
}
|
public void packetError(PacketErrorEvent packetErrorEvent) {
|
||||||
|
|
||||||
public void packetError(PacketErrorEvent packetErrorEvent) {
|
}
|
||||||
|
|
||||||
}
|
public void packetSent(PacketSentEvent e) {
|
||||||
|
}
|
||||||
|
|
||||||
public void packetSent(PacketSentEvent e) {
|
public void connected(ConnectedEvent e) {
|
||||||
}
|
modifyHost();
|
||||||
|
}
|
||||||
|
|
||||||
public void connected(ConnectedEvent e) {
|
public void disconnecting(DisconnectingEvent e) {
|
||||||
modifyHost();
|
}
|
||||||
}
|
|
||||||
|
|
||||||
public void disconnecting(DisconnectingEvent e) {
|
public void disconnected(DisconnectedEvent e) {
|
||||||
}
|
}
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
this.session.addListener(new SessionListener() {
|
||||||
|
public void packetReceived(PacketReceivedEvent e) {
|
||||||
|
if (e.getPacket() instanceof ServerPluginMessagePacket) {
|
||||||
|
handle(e.getPacket());
|
||||||
|
} else if (e.getPacket().getClass().getSimpleName().equals("LoginPluginRequestPacket")) {
|
||||||
|
handshake.handle(e.getPacket());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public void disconnected(DisconnectedEvent e) {
|
public void packetReceived(Session session, Packet packet) {
|
||||||
}
|
if (packet instanceof ServerPluginMessagePacket) {
|
||||||
});
|
handle((ServerPluginMessagePacket) packet);
|
||||||
|
} else if (packet.getClass().getSimpleName().equals("LoginPluginRequestPacket")) {
|
||||||
|
handshake.handle(packet);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void packetSending(PacketSendingEvent packetSendingEvent) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public void packetSent(Session session, Packet packet) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public void packetError(PacketErrorEvent packetErrorEvent) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public void packetSent(PacketSentEvent e) {
|
||||||
|
}
|
||||||
|
|
||||||
|
public void connected(ConnectedEvent e) {
|
||||||
|
modifyHost();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void disconnecting(DisconnectingEvent e) {
|
||||||
|
}
|
||||||
|
|
||||||
|
public void disconnected(DisconnectedEvent e) {
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void handle(ServerPluginMessagePacket packet) {
|
public void handle(ServerPluginMessagePacket packet) {
|
||||||
@ -70,16 +120,32 @@ public class MCForge {
|
|||||||
this.handshake.handle(packet);
|
this.handshake.handle(packet);
|
||||||
break;
|
break;
|
||||||
case "REGISTER":
|
case "REGISTER":
|
||||||
case "minecraft:register": // 1.13
|
case "minecraft:register":
|
||||||
this.session.send(new ClientPluginMessagePacket(packet.getChannel(), packet.getData()));
|
this.session.send(new ClientPluginMessagePacket(packet.getChannel(), packet.getData()));
|
||||||
break;
|
break;
|
||||||
case "MC|Brand":
|
case "MC|Brand":
|
||||||
case "minecraft:brand": // 1.13
|
case "minecraft:brand":
|
||||||
this.session.send(new ClientPluginMessagePacket(packet.getChannel(), "fml,forge".getBytes()));
|
this.session.send(new ClientPluginMessagePacket(packet.getChannel(), "fml,forge".getBytes()));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void newHandle(ClientboundCustomPayloadPacket packet) {
|
||||||
|
switch (packet.getChannel()) {
|
||||||
|
case "FML|HS":
|
||||||
|
this.handshake.handle(packet);
|
||||||
|
break;
|
||||||
|
case "REGISTER":
|
||||||
|
case "minecraft:register":
|
||||||
|
this.session.send(new ServerboundCustomPayloadPacket(packet.getChannel(), packet.getData()));
|
||||||
|
break;
|
||||||
|
case "MC|Brand":
|
||||||
|
case "minecraft:brand":
|
||||||
|
this.session.send(new ServerboundCustomPayloadPacket(packet.getChannel(), "fml,forge".getBytes()));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public void modifyHost() {
|
public void modifyHost() {
|
||||||
try {
|
try {
|
||||||
Class<?> cls = this.session.getClass().getSuperclass();
|
Class<?> cls = this.session.getClass().getSuperclass();
|
||||||
|
@ -10,5 +10,6 @@ public abstract class MCForgeHandShake {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public abstract void handle(Packet recvPacket);
|
public abstract void handle(Packet recvPacket);
|
||||||
|
public abstract void newHandle(Packet recvPacket);
|
||||||
public abstract String getFMLVersion();
|
public abstract String getFMLVersion();
|
||||||
}
|
}
|
||||||
|
@ -1,7 +1,9 @@
|
|||||||
package cn.serendipityr.EndMinecraftPlusV2.VersionControl.NewVersion.ForgeProtocol;
|
package cn.serendipityr.EndMinecraftPlusV2.VersionControl.NewVersion.ForgeProtocol;
|
||||||
|
|
||||||
import com.github.steveice10.mc.protocol.packet.ingame.client.ClientPluginMessagePacket;
|
import com.github.steveice10.mc.protocol.packet.ingame.client.ClientPluginMessagePacket;
|
||||||
|
import com.github.steveice10.mc.protocol.packet.ingame.clientbound.ClientboundCustomPayloadPacket;
|
||||||
import com.github.steveice10.mc.protocol.packet.ingame.server.ServerPluginMessagePacket;
|
import com.github.steveice10.mc.protocol.packet.ingame.server.ServerPluginMessagePacket;
|
||||||
|
import com.github.steveice10.mc.protocol.packet.ingame.serverbound.ServerboundCustomPayloadPacket;
|
||||||
import com.github.steveice10.packetlib.Session;
|
import com.github.steveice10.packetlib.Session;
|
||||||
import com.github.steveice10.packetlib.io.stream.StreamNetOutput;
|
import com.github.steveice10.packetlib.io.stream.StreamNetOutput;
|
||||||
import com.github.steveice10.packetlib.packet.Packet;
|
import com.github.steveice10.packetlib.packet.Packet;
|
||||||
@ -65,6 +67,57 @@ public class MCForgeHandShakeV1 extends MCForgeHandShake {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void newHandle(Packet recvPacket) {
|
||||||
|
ClientboundCustomPayloadPacket packet = (ClientboundCustomPayloadPacket) recvPacket;
|
||||||
|
Session session = forge.session;
|
||||||
|
|
||||||
|
byte[] data = packet.getData();
|
||||||
|
int packetID = data[0];
|
||||||
|
|
||||||
|
switch (packetID) {
|
||||||
|
case 0: // Hello
|
||||||
|
newSendPluginMessage(session, packet.getChannel(), new byte[] { 0x01, 0x02 });
|
||||||
|
|
||||||
|
// ModList
|
||||||
|
ByteArrayOutputStream buf = new ByteArrayOutputStream();
|
||||||
|
StreamNetOutput out = new StreamNetOutput(buf);
|
||||||
|
try {
|
||||||
|
out.writeVarInt(2);
|
||||||
|
out.writeByte(forge.modList.size());
|
||||||
|
forge.modList.forEach((k, v) -> {
|
||||||
|
try {
|
||||||
|
out.writeString(k);
|
||||||
|
out.writeString(v);
|
||||||
|
} catch (IOException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
} catch (IOException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
newSendPluginMessage(session, packet.getChannel(), buf.toByteArray());
|
||||||
|
break;
|
||||||
|
case 2: // ModList
|
||||||
|
newSendPluginMessage(session, packet.getChannel(), new byte[] { -0x1, 0x02 }); // ACK(WAITING SERVER DATA)
|
||||||
|
break;
|
||||||
|
case 3: // RegistryData
|
||||||
|
newSendPluginMessage(session, packet.getChannel(), new byte[] { -0x1, 0x03 }); // ACK(WAITING SERVER COMPLETE)
|
||||||
|
break;
|
||||||
|
case -1: // HandshakeAck
|
||||||
|
int ackID = data[1];
|
||||||
|
switch (ackID) {
|
||||||
|
case 2: // WAITING CACK
|
||||||
|
newSendPluginMessage(session, packet.getChannel(), new byte[] { -0x1, 0x04 }); // PENDING COMPLETE
|
||||||
|
break;
|
||||||
|
case 3: // COMPLETE
|
||||||
|
newSendPluginMessage(session, packet.getChannel(), new byte[] { -0x1, 0x05 }); // COMPLETE
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public String getFMLVersion() {
|
public String getFMLVersion() {
|
||||||
return "FML";
|
return "FML";
|
||||||
}
|
}
|
||||||
@ -72,4 +125,8 @@ public class MCForgeHandShakeV1 extends MCForgeHandShake {
|
|||||||
private void sendPluginMessage(Session session, String channel, byte[] data) {
|
private void sendPluginMessage(Session session, String channel, byte[] data) {
|
||||||
session.send(new ClientPluginMessagePacket(channel, data));
|
session.send(new ClientPluginMessagePacket(channel, data));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void newSendPluginMessage(Session session, String channel, byte[] data) {
|
||||||
|
session.send(new ServerboundCustomPayloadPacket(channel, data));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,7 +1,9 @@
|
|||||||
package cn.serendipityr.EndMinecraftPlusV2.VersionControl.NewVersion.ForgeProtocol;
|
package cn.serendipityr.EndMinecraftPlusV2.VersionControl.NewVersion.ForgeProtocol;
|
||||||
|
|
||||||
import com.github.steveice10.mc.protocol.packet.login.client.LoginPluginResponsePacket;
|
import com.github.steveice10.mc.protocol.packet.login.client.LoginPluginResponsePacket;
|
||||||
|
import com.github.steveice10.mc.protocol.packet.login.clientbound.ClientboundCustomQueryPacket;
|
||||||
import com.github.steveice10.mc.protocol.packet.login.server.LoginPluginRequestPacket;
|
import com.github.steveice10.mc.protocol.packet.login.server.LoginPluginRequestPacket;
|
||||||
|
import com.github.steveice10.mc.protocol.packet.login.serverbound.ServerboundCustomQueryPacket;
|
||||||
import com.github.steveice10.packetlib.io.buffer.ByteBufferNetInput;
|
import com.github.steveice10.packetlib.io.buffer.ByteBufferNetInput;
|
||||||
import com.github.steveice10.packetlib.io.stream.StreamNetOutput;
|
import com.github.steveice10.packetlib.io.stream.StreamNetOutput;
|
||||||
import com.github.steveice10.packetlib.packet.Packet;
|
import com.github.steveice10.packetlib.packet.Packet;
|
||||||
@ -112,6 +114,93 @@ public class MCForgeHandShakeV2 extends MCForgeHandShake {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void newHandle(Packet recvPacket) {
|
||||||
|
ClientboundCustomQueryPacket packet = (ClientboundCustomQueryPacket) recvPacket;
|
||||||
|
if (!packet.getChannel().equals("fml:loginwrapper")) return;
|
||||||
|
|
||||||
|
try {
|
||||||
|
LoginWrapper loginWrapper = new LoginWrapper().fromBytes(packet.getData());
|
||||||
|
String targetNetworkReceiver = loginWrapper.getTargetNetworkReceiver();
|
||||||
|
ByteBufferNetInput in = new ByteBufferNetInput(ByteBuffer.wrap(loginWrapper.getPayload()));
|
||||||
|
|
||||||
|
int packetID = in.readByte();
|
||||||
|
switch (packetID) {
|
||||||
|
case Packet_S2CModList: {
|
||||||
|
// recv: S2CModList
|
||||||
|
final List<String> mods = new ArrayList<>();
|
||||||
|
int len = in.readVarInt();
|
||||||
|
for (int x = 0; x < len; x++)
|
||||||
|
mods.add(in.readString());
|
||||||
|
|
||||||
|
final Map<String, String> channels = new HashMap<>();
|
||||||
|
len = in.readVarInt();
|
||||||
|
for (int x = 0; x < len; x++)
|
||||||
|
channels.put(in.readString(), in.readString());
|
||||||
|
|
||||||
|
final List<String> registries = new ArrayList<>();
|
||||||
|
len = in.readVarInt();
|
||||||
|
for (int x = 0; x < len; x++)
|
||||||
|
registries.add(in.readString());
|
||||||
|
// send: C2SModListReply
|
||||||
|
ByteArrayOutputStream buf = new ByteArrayOutputStream();
|
||||||
|
StreamNetOutput out = new StreamNetOutput(buf);
|
||||||
|
|
||||||
|
out.writeByte(Packet_C2SModListReply);
|
||||||
|
|
||||||
|
out.writeVarInt(mods.size());
|
||||||
|
mods.forEach(m -> {
|
||||||
|
try {
|
||||||
|
out.writeString(m);
|
||||||
|
} catch (IOException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
out.writeVarInt(channels.size());
|
||||||
|
channels.forEach((k, v) -> {
|
||||||
|
try {
|
||||||
|
out.writeString(k);
|
||||||
|
out.writeString(v);
|
||||||
|
} catch (IOException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// TODO: Fill with known hashes, which requires keeping a file cache (FMLHandshakeMessages.java)
|
||||||
|
out.writeVarInt(0); // empty map
|
||||||
|
/*
|
||||||
|
out.writeVarInt(registries.size());
|
||||||
|
registries.forEach(r -> {
|
||||||
|
try {
|
||||||
|
out.writeString(r);
|
||||||
|
out.writeString("");
|
||||||
|
} catch (IOException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
*/
|
||||||
|
|
||||||
|
newReply(packet.getMessageId(), targetNetworkReceiver, buf.toByteArray());
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case Packet_S2CRegistry:
|
||||||
|
case Packet_S2CConfigData: {
|
||||||
|
// recv: S2CRegistry
|
||||||
|
// send: C2SAcknowledge
|
||||||
|
ByteArrayOutputStream buf = new ByteArrayOutputStream();
|
||||||
|
StreamNetOutput out = new StreamNetOutput(buf);
|
||||||
|
|
||||||
|
out.writeByte(Packet_C2SAcknowledge);
|
||||||
|
|
||||||
|
newReply(packet.getMessageId(), targetNetworkReceiver, buf.toByteArray());
|
||||||
|
break;
|
||||||
|
}// recv: S2CConfigData
|
||||||
|
}
|
||||||
|
} catch (Exception ex) {
|
||||||
|
forge.session.disconnect("Failure to handshake", ex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public String getFMLVersion() {
|
public String getFMLVersion() {
|
||||||
return "FML2";
|
return "FML2";
|
||||||
}
|
}
|
||||||
@ -120,6 +209,10 @@ public class MCForgeHandShakeV2 extends MCForgeHandShake {
|
|||||||
forge.session.send(new LoginPluginResponsePacket(id, new LoginWrapper(targetNetworkReceiver, payload).toBytes()));
|
forge.session.send(new LoginPluginResponsePacket(id, new LoginWrapper(targetNetworkReceiver, payload).toBytes()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void newReply(int id, String targetNetworkReceiver, byte[] payload) throws IOException {
|
||||||
|
forge.session.send(new ServerboundCustomQueryPacket(id, new LoginWrapper(targetNetworkReceiver, payload).toBytes()));
|
||||||
|
}
|
||||||
|
|
||||||
static class LoginWrapper {
|
static class LoginWrapper {
|
||||||
private String targetNetworkReceiver;
|
private String targetNetworkReceiver;
|
||||||
private byte[] payload;
|
private byte[] payload;
|
||||||
|
@ -51,6 +51,7 @@ public class MCForgeMOTD {
|
|||||||
if (response.modinfo != null) {
|
if (response.modinfo != null) {
|
||||||
for (Response.ModInfo.ModID modid : response.modinfo.modList) {
|
for (Response.ModInfo.ModID modid : response.modinfo.modList) {
|
||||||
modList.put(modid.modid, modid.version);
|
modList.put(modid.modid, modid.version);
|
||||||
|
LogUtil.doLog(0, modid.modid + " | " + modid.version, "[Debug]");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user