Incorrect packet checksum - Форум администраторов игровых серверов
Форум администраторов игровых серверов StormWall - Защита от DDos атак
Регистрация Мнения Справка Сообщество Календарь
Вернуться   Форум администраторов игровых серверов > MMO > Lineage II

Lineage II
Дискуссии на тему создания, настройки и обслуживания серверов Lineage 2. При поддержке: Премиум услуги по рекламе

Описание темы:проблемы с логином

Ответ
Опции темы
Непрочитано 30.08.2015, 18:41   #1
Пользователь

Автор темы (Топик Стартер) Incorrect packet checksum

добрый вечер!

столкнулся с большущей проблемой, суть такова:

при каждом запуске GS и LS, в момент когда ГС пытается подключиться к ЛС, логин сервер выдает сообщение:

Incorrect packet checksum, closing connection ...

Нашел это в классе GameServerThread:

Код:
				// decrypt if we have a key
				data = _blowfish.decrypt(data);
				checksumOk = NewCrypt.verifyChecksum(data);

				if(!checksumOk)
				{
					_log.warn("Incorrect packet checksum, closing connection ...");
					return;
				}
Тут весь класс: http://pastebin.com/TiVNnJcN

Причем подключается он как повезет... если перезапустить логин random раз, то случается так, что он все -таки подключается к ГСу нормально...

В чем может быть причина и как с этим бороться?
__________________
mego4el вне форума Ответить с цитированием
Непрочитано 30.08.2015, 19:28   #2
Аватар для Daan Raven
Пользователь

По умолчанию Re: Incorrect packet checksum

NewCrypt.verifyChecksum(byte[]); - смотри здесь.
Daan Raven вне форума Ответить с цитированием
Сказали спасибо:
Непрочитано 31.08.2015, 20:49   #3
Пользователь

Автор темы (Топик Стартер) Re: Incorrect packet checksum

Цитата:
Сообщение от Warencense Посмотреть сообщение
NewCrypt.verifyChecksum(byte[]); - смотри здесь.
Посмотрел этот класс.. Не знаю что с ним делать?

Код:
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

import java.io.IOException;

public class NewCrypt
{
	private static final Logger _log = LogManager.getLogger(NewCrypt.class.getName());

	BlowfishEngine _crypt;
	BlowfishEngine _decrypt;

	public NewCrypt(final byte[] blowfishKey)
	{
		_crypt = new BlowfishEngine();
		_crypt.init(true, blowfishKey);
		_decrypt = new BlowfishEngine();
		_decrypt.init(false, blowfishKey);
	}

	public NewCrypt(final String key)
	{
		this(key.getBytes());
	}

	public static boolean verifyChecksum(final byte[] raw)
	{
		return NewCrypt.verifyChecksum(raw, 0, raw.length);
	}
	
	public static boolean verifyChecksum(final byte[] raw, final int offset, final int size)
	{
		// check if size is multiple of 4 and if there is more then only the checksum
		if ((size & 3) != 0 || size <= 4)
			return false;
		
		long chksum = 0;
		final int count = size - 4;
		long check = -1;
		int i;
		
		for (i = offset; i < count; i += 4)
		{
			check = raw[i] & 0xff;
			check |= raw[i + 1] << 8 & 0xff00;
			check |= raw[i + 2] << 0x10 & 0xff0000;
			check |= raw[i + 3] << 0x18 & 0xff000000;
			
			chksum ^= check;
		}
		
		check = raw[i] & 0xff;
		check |= raw[i + 1] << 8 & 0xff00;
		check |= raw[i + 2] << 0x10 & 0xff0000;
		check |= raw[i + 3] << 0x18 & 0xff000000;
		
		return check == chksum;
	}

	public static void appendChecksum(final byte[] raw)
	{
		NewCrypt.appendChecksum(raw, 0, raw.length);
	}

	public static void appendChecksum(final byte[] raw, final int offset, final int size)
	{
		long chksum = 0;
		final int count = size - 4;
		long ecx;
		int i;
		
		for (i = offset; i < count; i += 4)
		{
			ecx = raw[i] & 0xff;
			ecx |= raw[i + 1] << 8 & 0xff00;
			ecx |= raw[i + 2] << 0x10 & 0xff0000;
			ecx |= raw[i + 3] << 0x18 & 0xff000000;
			
			chksum ^= ecx;
		}
		
		ecx = raw[i] & 0xff;
		ecx |= raw[i + 1] << 8 & 0xff00;
		ecx |= raw[i + 2] << 0x10 & 0xff0000;
		ecx |= raw[i + 3] << 0x18 & 0xff000000;
		
		raw[i] = (byte) (chksum & 0xff);
		raw[i + 1] = (byte) (chksum >> 0x08 & 0xff);
		raw[i + 2] = (byte) (chksum >> 0x10 & 0xff);
		raw[i + 3] = (byte) (chksum >> 0x18 & 0xff);
	}
	
	/**
	 * Packet is first XOR encoded with <code>key</code> Then, the last 4 bytes are overwritten with the the XOR "key". Thus this assume that there is enough room for the key to fit without overwriting data.
	 * @param raw The raw bytes to be encrypted
	 * @param key The 4 bytes (int) XOR key
	 */
	public static void encXORPass(final byte[] raw, final int key)
	{
		NewCrypt.encXORPass(raw, 0, raw.length, key);
	}

	/**
	 * Packet is first XOR encoded with <code>key</code> Then, the last 4 bytes are overwritten with the the XOR "key". Thus this assume that there is enough room for the key to fit without overwriting data.
	 * @param raw The raw bytes to be encrypted
	 * @param offset The begining of the data to be encrypted
	 * @param size Length of the data to be encrypted
	 * @param key The 4 bytes (int) XOR key
	 */
	public static void encXORPass(final byte[] raw, final int offset, final int size, final int key)
	{
		final int stop = size - 8;
		int pos = 4 + offset;
		int edx;
		int ecx = key; // Initial xor key
		
		while (pos < stop)
		{
			edx = raw[pos] & 0xFF;
			edx |= (raw[pos + 1] & 0xFF) << 8;
			edx |= (raw[pos + 2] & 0xFF) << 16;
			edx |= (raw[pos + 3] & 0xFF) << 24;
			
			ecx += edx;
			
			edx ^= ecx;
			
			raw[pos++] = (byte) (edx & 0xFF);
			raw[pos++] = (byte) (edx >> 8 & 0xFF);
			raw[pos++] = (byte) (edx >> 16 & 0xFF);
			raw[pos++] = (byte) (edx >> 24 & 0xFF);
		}
		
		raw[pos++] = (byte) (ecx & 0xFF);
		raw[pos++] = (byte) (ecx >> 8 & 0xFF);
		raw[pos++] = (byte) (ecx >> 16 & 0xFF);
		raw[pos++] = (byte) (ecx >> 24 & 0xFF);
	}
	
	public byte[] decrypt(final byte[] raw) throws IOException
	{
		final byte[] result = new byte[raw.length];
		final int count = raw.length / 8;
		
		for (int i = 0; i < count; i++)
		{
			_decrypt.processBlock(raw, i * 8, result, i * 8);
		}
		
		return result;
	}
	
	public void decrypt(final byte[] raw, final int offset, final int size) throws IOException
	{
		final byte[] result = new byte[size];
		final int count = size / 8;
		
		for (int i = 0; i < count; i++)
		{
			_decrypt.processBlock(raw, offset + i * 8, result, i * 8);
		}
		// TODO can the crypt and decrypt go direct to the array
		System.arraycopy(result, 0, raw, offset, size);
	}
	
	public byte[] crypt(final byte[] raw) throws IOException
	{
		final int count = raw.length / 8;
		final byte[] result = new byte[raw.length];
		
		for (int i = 0; i < count; i++)
		{
			_crypt.processBlock(raw, i * 8, result, i * 8);
		}
		
		return result;
	}
	
	public void crypt(final byte[] raw, final int offset, final int size) throws IOException
	{
		final int count = size / 8;
		final byte[] result = new byte[size];
		
		for (int i = 0; i < count; i++)
		{
			_crypt.processBlock(raw, offset + i * 8, result, i * 8);
		}
		// TODO can the crypt and decrypt go direct to the array
		System.arraycopy(result, 0, raw, offset, size);
	}
}
__________________
mego4el вне форума Ответить с цитированием
Непрочитано 02.09.2015, 22:10   #4
Пользователь

Автор темы (Топик Стартер) Re: Incorrect packet checksum

Хелп плз. Не понятно как с этим бороться
__________________
mego4el вне форума Ответить с цитированием
Непрочитано 03.09.2015, 01:39   #5
Пользователь

По умолчанию Re: Incorrect packet checksum

А вы как то регистрировали гейм сервер в базе ЛС? Например файл hex.id генерировали и подкладывали?
flopix вне форума Ответить с цитированием
Непрочитано 03.09.2015, 14:38   #6
Аватар для Daan Raven
Пользователь

По умолчанию Re: Incorrect packet checksum

Значит что-то с data не так.
Daan Raven вне форума Ответить с цитированием
Непрочитано 03.09.2015, 19:30   #7
Аватар для Zubastic
ZG troll squad

По умолчанию Re: Incorrect packet checksum

Видимо автор не может в дебаг. Я помню также долго искал ошибку. Оказалось проблема в 1м байте...
__________________
Zubastic вне форума Ответить с цитированием
Непрочитано 04.09.2015, 11:38   #8
Пользователь

Автор темы (Топик Стартер) Re: Incorrect packet checksum

Цитата:
Сообщение от flopix Посмотреть сообщение
А вы как то регистрировали гейм сервер в базе ЛС? Например файл hex.id генерировали и подкладывали?
как обычно.
когда проблема с хексидом - пишет Wrong hexid, это совершенно другая ошибка!

Цитата:
Значит что-то с data не так.
всмысле?

Цитата:
Видимо автор не может в дебаг. Я помню также долго искал ошибку. Оказалось проблема в 1м байте...
я не знаю даже ЧТО тут можно искать... в битсуммах не шарю совершенно(

помогите плз
__________________
mego4el вне форума Ответить с цитированием
Непрочитано 04.09.2015, 11:53   #9
Аватар для Donatte
Герой

По умолчанию Re: Incorrect packet checksum

Стесняюсь спросить, а структура пакетом отсылаемого и принимаемого идентична?
__________________
Родился, живу и когда-нибудь умру.
Donatte вне форума Ответить с цитированием
Непрочитано 04.09.2015, 15:03   #10
Пользователь

Автор темы (Топик Стартер) Re: Incorrect packet checksum

Цитата:
Сообщение от Donatte Посмотреть сообщение
Стесняюсь спросить, а структура пакетом отсылаемого и принимаемого идентична?
как это проверить?)
__________________
mego4el вне форума Ответить с цитированием
Ответ


Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
какой-то Телнет! FurerSS Lineage II 22 10.12.2010 18:00
полет во всех локациях zaqwer Серверная часть 35 26.07.2010 22:50
Серверр выкидывает игроков kolovratt Aion 6 20.07.2010 10:51
Зависает после выбора сервера! Nales Серверная часть 8 09.05.2010 12:55


© 2007–2024 «Форум администраторов игровых серверов»
Защита сайта от DDoS атак — StormWall
Работает на Булке неизвестной версии с переводом от zCarot
Текущее время: 20:47. Часовой пояс GMT +3.

Вверх