2017-04-11 59 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

它幫助了我!謝謝 –