我有魔獸世界流量的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參數嘗試膨脹()。 但它沒有輸出。
每個分組具有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;
}
我對WoW的瞭解不多,但是如果一個數據包以'00 00 00 ff ff'結尾,那不是說它以'00 00 ff ff'結尾? –
是的,你是對的,但在其他流中,我只看到00 00 ff ff沒有00。這就是爲什麼我這麼說.. –
這可能是額外的'00'是有效載荷的一部分。 –