Ну вот INIT (AKA AUTH_SERVER_PROTOCOL_VERSION) у мобиусовского логин сервера
Java:
LoginServerPackets.INIT.writeId(this);
writeInt(_sessionId); // session id
writeInt(0x0000c621); // protocol revision
writeBytes(_publicKey); // RSA Public Key
// unk GG related?
writeInt(0x29DD954E);
writeInt(0x77C39CFC);
writeInt(0x97ADB620);
writeInt(0x07BDE0F7);
writeBytes(_blowfishKey); // BlowFish key
writeByte(0); // null termination ;)
Вот пакет от L2JServer:
Java:
@Override
protected void write() {
writeC(0x00); // init packet id
writeD(_sessionId); // session id
writeD(0x0000c621); // protocol revision
writeB(_publicKey); // RSA Public Key
// unk GG related?
writeD(0x29DD954E);
writeD(0x77C39CFC);
writeD(0x97ADB620);
writeD(0x07BDE0F7);
writeB(_blowfishKey); // BlowFish key
writeC(0x00); // null termination ;)
}
Вот что сейчас в 418 протоколе происходит:
Java:
OutgoingPackets.AUTH_SERVER_PROTOCOL_VERSION.writeHeader(packet);
packet.writeInt(client.getSessionId()); // session id
packet.writeInt(50721); // 0xC621 protocol version
packet.writeBytes(client.getScrambledPair().getScrambledModulus()); // 128 key
// on NA not used anymore
packet.writeBytes(new byte[16]); // 16 gg key
// on NA not used anymore
packet.writeBytes(client.getBlowfishKey()); // 16 second key
packet.writeByte(4); // login type?
packet.writeByte(0); // company code 0
packet.writeByte(0); // company code 1
packet.writeByte(0); // company code 2
packet.writeBytes(new byte[15]); // in engine it looks as C D D D, but it has more data than needs
Ну да, много чего смотрел в сурсах, многое идентично, те же классы пакетов инит. Мне кажется мобиусовский инит в бловфиш не заворачивается, хотя как тогда его клиент нормально обрабатывает. Мне кажется, что вообще куски кода в логин сервере мобиуса тупо не работают. Инит вроде просто отправляется на outputstream и флушится
Код:
public void sendPacket(WritablePacket packet)
{
final Socket socket = getSocket();
if ((socket != null) && socket.isConnected())
{
final byte[] sendableBytes = packet.getSendableBytes();
if (sendableBytes == null)
{
return;
}
try
{
final OutputStream outputStream = getOutputStream();
synchronized (this)
{
outputStream.write(sendableBytes);
outputStream.flush();
}
}
catch (Exception ignored)
{
}
}
}
Хотя должен в SendThread идти, где должен через
final byte[] sendableBytes = writablePacket.getSendableBytes(_client.getEncryption());
обрабатываться.
Где класс SendThread там используется я не нашел, скорее всего нигде не используется
Init содержит динамический Blowfish ключ случайно генерируемый для каждого клиента. Этот пакет сначала шифруется по алгоритму XOR(ключ генерируется
случайным образом и помещается в конце пакета), а потом шифруется по алгоритму Blowfish, статическим ключом.
Где инит в бловфиш в логинсервере оборачивается я не не нашел
Да я был прав, логин сервер мобиуса не криптует пакет инит. Ни rsa, ни blowfish. Но клиент некриптованный пакет принимает и так. Сейчас реализовал крипт пакета инит, клиент его нормально обрабатывает, но бот по прежнему нет. Возможно что-то с чексуммами не дописал. Посмотрю, потом отпишусь что там
Пока на этом этапе. Логин сервер мобиуса не криптовал рса и блоуфишем пакет инит, потом не криптовал блоуфишем пакеты логин сервера. Думаю это потому что он перевел ByteBuffer пакетов лыжи на byte array, а дальше функционал не доделал. Это я сейчас реализовал. Теперь не заходит на гейм сервер, еще не смотрел, но думаю и там блоуфиша нет. Потом посмотрю. Удивительно, что клиент пакеты без шифрования нормально обрабатывает
Все, разобрался. Да, логин сервер мобиуса ничего не шифрует и клиент это нормально принимает, а бот нет. К гейм серверу не мог подключиться, потому что чексумму неправильно к пакету подключал