rendered paste bodyvoid 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);
}
}