Тема: Сниффер
Показать сообщение отдельно
Старый 01.06.2010, 09:58   #32
Konctantin
RuDB Dev
 
Аватар для Konctantin
 
Регистрация: 01.02.2010
Адрес: localhost
Сообщений: 592
Сказал(а) спасибо: 323
Поблагодарили 283 раз(а) в 122 сообщениях
Записей в дневнике: 2
Konctantin Это имя известно всемKonctantin Это имя известно всемKonctantin Это имя известно всемKonctantin Это имя известно всемKonctantin Это имя известно всемKonctantin Это имя известно всем
По умолчанию

Спасибо всем за советы и подсказки:
Цитата:
А помоему некорректно определяются large пакеты...
Да так и есть, щас переделаю:
http://github.com/arrai/tiawps/blob/...pter/decrypt.c
Если я правильно понял с примера, то нужно дополнительно декриптовать еще 1 байт, или же сразу нужный размер.
Код:
private static void ProcessWorldPacket(byte[] data, Direction direction)
{
	int i = 0, size = 0, opcode = 0;
	bool isLarge = (data[i] & 0x80) != 0;
	int HEADER_LENGTH = isLarge ? 4 : 5;

	if (direction == Direction.SERVER)
	{
		Crypt.DecryptServer(data, 0, HEADER_LENGTH);
	}
	else
	{
		HEADER_LENGTH += 2;
		Crypt.DecryptClient(data, 0, HEADER_LENGTH);
	}

	if (isLarge)
		size = data[i++] & 0x7F;

	size = (size << 8) | data[i++];
	size = (size << 8) | data[i++];

	for (int j = 0; j < HEADER_LENGTH - 2; j++)
		opcode |= ((0xFF & data[i++]) << (8 * j));

	size += (2 + (isLarge ? 1 : 0));

	if (size > data.Length)
	{
		Console.WriteLine("ERROR: {0} Size = {1} > packet.Length = {2}", direction, size, data.Length);
		return;
	}

	using (BinaryReader reader = new BinaryReader(new MemoryStream(data)))
	{
		reader.BaseStream.Position += HEADER_LENGTH;
		byte[] newData = reader.ReadBytes(size - HEADER_LENGTH);
		HandleWorldPacket((WorldOpcodes)opcode, newData);

		Console.WriteLine("{0}:\tHeader = {1}\tPacket = {2}\t{3}\tOpcode: {4}",
			direction, size, data.Length, data.Length == size ? "OK" : "REUSE", (WorldOpcodes)opcode);

		if (size < data.Length)
		{
			ProcessWorldPacket(reader.ReadBytes(data.Length - size), direction);
		}  
	} 
}
Но надо проверить, а это уже вечером.

Цитата:
это означает, что когда вы в снифере видите "пакет", то это совсем не означает что он пришел полностью. это даже не означает что это пакет вообще. это просто какие то данные в потоке tcp. и даже на следующий "recv_from_server" тоже не обязательно пакет придет полностью. под "пакетом" будем подразумевать "игровой пакет" от близзов, дамп опкода.
Это я тоже пытался учитывать, но как показал лог сниффера ни разу это не был фрагмент пакета, к тому же все равно приходили бы и целые пакеты.

Цитата:
ну и если вам вдруг будет все равно в каком формате записывать,
не все равно, формат ваш (pkt)

Цитата:
с другой стороны, а зачем вам раскриптованный трафик сразу?
Ну хотя бы для того чтоб потом этим не заниматься, а:
Цитата:
это ведь все задержки и возможные ошибки
тут не должно быть ошибки.
Цитата:
лишнее подтвердждение того, что прокси удобнее будет
А это как нож в горло, как видите пока не в силах сделать сниффер, а до прокси еще как до неба...

Да и с моим ничтожным опытом в программировании (чуть больше года на любительском уровне и когда есть время) наверное не постичь тайну аутеффикации, так как надо делать хук (подменить ИП сервера в памяти), надо еще чего-то и еще...
Ладно хватит писать, пойду работать...
__________________
Konctantin вне форума   Ответить с цитированием