2017-04-11 57 views
0

我有魔兽世界流量的pcap文件,我需要解压缩它。我知道它是由Zlib压缩的: http://wiki.xentax.com/index.php/List_Of_Compressed_Games 所以要找到一个压缩块的开始,我写了一段迭代原始数据的代码,试图解压缩数据并检查是否有一些输出可用。如何解压WoW数据

我使用windowBits参数15(zlib格式)和30(gzip格式)调用inflateInit2函数初始化zlib。我用Z_SYNC_FLUSH和Z_FULL_FLUSH参数尝试膨胀()。 但它没有输出。

Ip traffic looks like this

每个分组具有00 00 00 FF FF结束。但zlib手册说它必须是00 00 ff ff。

那么从WoW流中提取数据的方法是什么?

我的代码是:

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

充气包装函数:

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

我对WoW的了解不多,但是如果一个数据包以'00 00 00 ff ff'结尾,那不是说它以'00 00 ff ff'结尾? –

+0

是的,你是对的,但在其他流中,我只看到00 00 ff ff没有00。这就是为什么我这么说.. –

+1

这可能是额外的'00'是有效载荷的一部分。 –

回答

1

您需要windowBits参数是-15(负)以请求原放气。

你指的是存储的块为三零,然后填充足够的零个比特字节的其余部分得到一个字节边界,后面有四个字节0​​。因此,根据流中前面的位,00 00 ff ff之前的字节可能不是00

+0

它帮助了我!谢谢 –