2017-04-11 3 views
0

J'ai un fichier pcap avec le trafic de World of Warcraft et j'ai besoin de le décompresser. Je sais qu'il est compressé par Zlib: http://wiki.xentax.com/index.php/List_Of_Compressed_Games Donc, pour trouver le début d'un bloc compressé, j'ai écrit un morceau de code qui itère à travers les données brutes, essaie de décompresser les données et vérifie si certaines sorties sont disponibles.Comment décompresser les données WoW

J'appelle la fonction inflateInit2 pour initialiser zlib avec les paramètres windowBits 15 (format zlib) et 30 (format gzip). J'ai essayé inflate() avec les paramètres Z_SYNC_FLUSH et Z_FULL_FLUSH. Mais cela ne me donne aucune sortie.

Ip traffic looks like this

Chaque paquet se termine par 00 00 00 ff ff. Mais le manuel de zlib dit que ça doit être 00 00 ff ff.

Alors, quel est le moyen d'extraire des données à partir du flux WoW?

Mon code est:

void tryZlib(unsigned __int8 *StPt, __int64 size, Deflate *zlib) 
{ 
    z_stream_s * stream = new z_stream_s; 
    SecureZeroMemory(stream, sizeof(z_stream_s)); 
    bool isInit = false; 

    while (size > 0) 
    { 
     BYTE *out_buf; 
     bool isPacketLost = false; 
     unsigned __int32 total_out = 0; 
     Zlib::ZlibData ddata(StPt, size, *stream, isInit, isPacketLost); 
     auto IsOk = zlib->Decoder(ddata, out_buf, total_out); 
     zlib->Reset(*stream, isInit); 
     --size; 
     ++StPt; 
    } 
} 

fonction enveloppe INFLATE:

bool Zlib::Decoder(const DeflateData & ddata, BYTE *& out_data, unsigned __int32 & size) 
    { 
     if (IsDllLoaded == false || ddata.PDU == nullptr || ddata.PDU_size == 0) 
      return false; 
     z_stream_s & strm = ddata.stream; 
     if (!ddata.isInitialized) 
      Init(ddata); 
     strm.total_out = 0; 
     strm.avail_in = ddata.PDU_size; 
     strm.next_in = ddata.PDU; 
     strm.avail_out = OUT_BUFFER_SIZE; 
     strm.next_out = out_buffer; 
     __int32 ret = 0; 
     bool isWasSync = false; 
     ret = ZDecompressor(&strm, Z_SYNC_FLUSH); 
     size = strm.total_out; 
     if ((ret = 0) || (size > 10)) 
      printf("Found!!"); 
     out_data = out_buffer; 
     return true;    
    } 
+0

Je ne sais pas grand-chose sur WoW, mais si un paquet se termine par '00 00 00 ff ff' cela ne signifie-t-il pas qu'il se termine par' 00 00 ff ff'? –

+0

Oui, vous avez raison, mais dans d'autres cours d'eau, je n'ai vu que 00 00 ff ff wihtout 00 avant. C'est pourquoi je le dis .. –

+1

Il est possible que le supplément '00' fasse partie de la charge utile. –

Répondre

1

Vous avez besoin du paramètre windowBits être -15 (négatif) afin de demander dégonfler premières.

Le bloc stocké vous faites référence est trois zéro les bits, puis en remplissant le reste de cet octet avec suffisamment de bits à zéro pour arriver à une limite d'octet, suivi par les quatre octets 00 00 ff ff. Donc, en fonction des bits précédents dans le flux, l'octet avant le 00 00 ff ff peut ne pas être 00.

+0

Ça m'a aidé! Merci –