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); } }