public final class LoginPacketsDecoder extends Decoder {
public LoginPacketsDecoder(Session session) {
super(session);
}
@Override
public int decode(InputStream stream) {
if (stream.getRemaining() < 3 xss=removed xss=removed xss=removed> PacketId =:" + opcode);
if (stream.getRemaining() < length xss=removed xss=removed xss=removed xss=removed xss=removed xss=removed xss=removed xss=removed xss=removed xss=removed xss=removed xss=removed xss=removed xss=removed xss=removed xss=removed xss=removed xss=removed xss=removed xss=removed xss=removed xss=removed xss=removed xss=removed xss=removed xss=removed xss=removed xss=removed xss=removed xss=removed xss=removed xss=removed xss=removed xss=removed xss=removed xss=removed xss=removed> stream.getRemaining()) {
session.getLoginPackets().sendClosingPacket(10);
return;
}
byte[] data = new byte[rsaBlockSize];
stream.readBytes(data, 0, rsaBlockSize);
InputStream rsaStream = new InputStream(Utils.cryptRSA(data,
Settings.PRIVATE_EXPONENT, Settings.MODULUS));
if (rsaStream.readUnsignedByte() != 10) {
session.getLoginPackets().sendClosingPacket(10);
return;
}
int[] isaacKeys = new int[4];
for (int i = 0; i < isaacKeys xss=removed xss=removed xss=removed xss=removed xss=removed> 30 || password.length() < 3 xss=removed xss=removed xss=removed xss=removed xss=removed xss=removed xss=removed xss=removed xss=removed xss=removed xss=removed xss=removed xss=removed xss=removed xss=removed xss=removed xss=removed xss=removed xss=removed xss=removed xss=removed xss=removed xss=removed xss=removed xss=removed>= 3) {
session.getLoginPackets().sendClosingPacket(9);
return;
}
Player player = new Player();
PlayerHandlerThread.addSession(session, isaacKeys, true, username,
password, MACAddress, 0, 0, 0, null);
}
@SuppressWarnings("unused")
public void decodeWorldLogin(InputStream stream) {
if (stream.readInt() != Settings.MINOR_VERSION) {
session.getLoginPackets().sendClosingPacket(6);
return;
}
boolean unknownEquals14 = stream.readUnsignedByte() == 1;
int rsaBlockSize = stream.readUnsignedShort();
if (rsaBlockSize > stream.getRemaining()) {
session.getLoginPackets().sendClosingPacket(10);
return;
}
byte[] data = new byte[rsaBlockSize];
stream.readBytes(data, 0, rsaBlockSize);
InputStream rsaStream = new InputStream(Utils.cryptRSA(data,
Settings.PRIVATE_EXPONENT, Settings.MODULUS));
if (rsaStream.readUnsignedByte() != 10) {
session.getLoginPackets().sendClosingPacket(10);
return;
}
int[] isaacKeys = new int[4];
for (int i = 0; i < isaacKeys xss=removed xss=removed xss=removed xss=removed xss=removed> 30 || password.length() < 3) {
session.getLoginPackets().sendClosingPacket(3);
return;
}
rsaStream.readLong(); // idk
rsaStream.readLong(); // random value
stream.xteaDecrypt(isaacKeys, stream.getOffset(), stream.getLength());
boolean stringUsername = stream.readUnsignedByte() == 1; // unknown
String username = Utils
.formatPlayerNameForProtocol(stringUsername ? stream
.readString() : Utils.longToString(stream.readLong()));
int displayMode = stream.readUnsignedByte();
int screenWidth = stream.readUnsignedShort();
int screenHeight = stream.readUnsignedShort();
int unknown2 = stream.readUnsignedByte();
stream.skip(24); // 24bytes directly from a file, no idea whats there
String settings = stream.readString();
if (!settings.equals(Settings.CLIENT_SETTINGS)) {
session.getLoginPackets().sendClosingPacket(10);
return;
}
int affid = stream.readInt();
stream.skip(stream.readUnsignedByte()); // useless settings
MachineInformation mInformation = decodeMachineInformation(stream);
int unknown3 = stream.readInt();
int userFlow = stream.readInt();
int unknown9 = stream.readInt();
String worldServerToken = stream.readString();
if (!worldServerToken.equals(Settings.WORLD_SERVER_TOKEN)) {
session.getLoginPackets().sendClosingPacket(35);
return;
}
boolean hasAditionalInformation = stream.readUnsignedByte() == 1;
String aditionalInformation = hasAditionalInformation ? stream
.readString() : "";
boolean hasJagtheora = stream.readUnsignedByte() == 1;
boolean js = stream.readUnsignedByte() == 1;
int unknown4 = stream.readByte();
int unknown5 = stream.readInt();
String grabServerToken = stream.readString();
if (!grabServerToken.equals(Settings.GRAB_SERVER_TOKEN)) {
session.getLoginPackets().sendClosingPacket(35);
return;
}
boolean differentServer = stream.readUnsignedByte() == 1;
int serverId1 = stream.readUnsignedShort();
int serverId2 = stream.readUnsignedShort();
for (int index = 0; index < Cache.STORE.getIndexes().length; index++) {
if (Cache.STORE.getIndexes()[index] == null)
continue;
int crc = Cache.STORE.getIndexes()[index].getCRC();
int receivedCRC = stream.readInt();
if (crc != receivedCRC && index < 30) { // outdated
if (Settings.DEBUG)
Logger.log(this, "Invalid CRC at index: " + index + ", "
+ receivedCRC + ", " + crc);
session.getLoginPackets().sendClosingPacket(6);
return;
}
}
String MACAddress = stream.readString();
Player player = new Player();
PlayerHandlerThread.addSession(session, isaacKeys, false, username,
password, MACAddress, displayMode, screenWidth, screenHeight,
mInformation);
}
}Add a code snippet to your website: www.paste.org