All pastes #181935 Raw Edit

Stuff

public text v1 · immutable
#181935 ·published 2006-09-25 14:43 UTC
rendered paste body
void CWoWOpcodeHandler::GetWoWPacketInfo(ByteBuffer* data, int len, WoWPacketInfo* wowdata, bool IncomingPacket)
{
	assert(data);
	assert(wowdata);
	if (wowdata->IsWorldPacket)				// World packet
	{
		if (IncomingPacket)					// Server -> client
		{
			// Server -> Client = 4 bytes header (2 bytes size - 2 bytes opcode)
			if (LastPacketFragmented)
			{
				ByteBuffer tmp;
				WorldServerPktHdr* _hdr = (WorldServerPktHdr*)PreviousPkt.contents();
				if ((ntohs(_hdr->size) == 47806) && (_hdr->opcode == 57005))	// BABE - DEAD
				{
					tmp.append(*data);
					tmp.append(PreviousPkt);
				}
				else						// Sometimes it gets reversed sniffed, so fix it
				{
					tmp.append(PreviousPkt);
					tmp.append(*data);
				}
				PreviousPkt.clear();
				data->clear();
				data->append(tmp);
				len = data->size();
				LastPacketFragmented = false;
			}
			WorldServerPktHdr* hdr = (WorldServerPktHdr*)data->contents();
			wowdata->HeaderSize = 4;
			wowdata->DataSize = len - wowdata->HeaderSize;
			wowdata->EncryptedDataSize = hdr->size;
			wowdata->WorldOpcode = hdr->opcode;
			switch (len)
			{
			case 4:
				if (!RecvAuthChallenge)				// Full = 8 bytes
				{
					RecvAuthChallenge = true;
					LastPacketFragmented = true;
					PreviousPkt.append(*data);
					return;
				}
				if (!RecvAuthSession)				// Full = 8 bytes
				{
					RecvAuthSession = true;
					LastPacketFragmented = true;
					PreviousPkt.append(*data);
					return;
				}
				if (!RecvCharEnum)					// Full = 
				{
					RecvCharEnum = true;
					LastPacketFragmented = true;
					PreviousPkt.append(*data);
					return;
				}
				break;
			case 8:
				if (hdr->opcode == SMSG_AUTH_CHALLENGE)	// Not encrypted - no use bruteforcing
					return;
			}
			wowdata->WorldOpcode = GetRealServerOpcode(data, len, wowdata->DecryptedDataSize);
		}
		else								// Client -> server
		{
			WorldClientPktHdr* hdr = (WorldClientPktHdr*)data->contents();
			wowdata->HeaderSize = 6;		// sizeof(WorldClientPktHdr);
			wowdata->DataSize = len - wowdata->HeaderSize;
			wowdata->EncryptedDataSize = hdr->size;
			if (hdr->opcode != CMSG_AUTH_SESSION)
				wowdata->WorldOpcode = GetRealClientOpcode(data, len, wowdata->DecryptedDataSize);
		}
	}