2017-04-11 38 views
0

私はWarcraftのトラフィックの世界とのpcapファイルを持っていると私はそれを解凍する必要があります。だから私は、いくつかの出力が利用可能かどうか、データとチェックを解凍しようとした生データを反復処理するコードの一部を書いた圧縮ブロックの先頭を見つけるために http://wiki.xentax.com/index.php/List_Of_Compressed_Games :私はZlibのことで圧縮されていることを知っています。すごい解凍するデータはどのように

私はwindowBitsとZLIBを初期化するためにinflateInit2関数を呼び出す15(ZLIB形式)と30(GZIPフォーマット)パラメータ。私はZ_SYNC_FLUSHとZ_FULL_FLUSHパラメータでinflate()を試みました。 しかしそれは私に出力を与えません。

Ip traffic looks like this

各パケットは00 00 00 FF FFので終わります。しかし、zlibのマニュアルによると、00時以降でなければなりません。

だから、すごいストリームからデータを抽出する方法は何ですか?

私のコードは次のとおりです。

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

私はすごいについて多くを知らないが、パケットは、 '00 00 00 FFのff'で終わる場合、それは' 00 00 FFのff'で終わることを意味するものではないこと? –

+0

はい、あなたは正しいですが、他のストリームでは、それ以前に00 00 ff ff wihtout 00しか見ませんでした。それで、私がそう言っているのです。 –

+1

余分な「00」がペイロードの一部である可能性があります。 –

答えて

1

あなたは生のdeflateを要求するために-15(負)であることをwindowBitsパラメータを必要としています。

あなたが参照している格納されたブロックは4バイト00 00 ff ff続くバイト境界に到達するのに十分なゼロビットでそのバイトの残りの部分を充填することによって、その後3ゼロビット、、です。したがって、ストリーム内の先行ビットによっては、00 00 ff ffの前のバイトは00ではない場合があります。

+0

それは私を助けた!ありがとう –

関連する問題