【问题标题】:How to decompress WoW data如何解压魔兽数据
【发布时间】:2017-04-11 15:07:25
【问题描述】:

我有魔兽世界流量的 pcap 文件,我需要解压缩它。我知道它是由 Zlib 压缩的: http://wiki.xentax.com/index.php/List_Of_Compressed_Games 因此,为了找到压缩块的开头,我编写了一段代码,遍历原始数据,尝试解压缩数据并检查是否有可用的输出。

我调用 inflateInit2 函数用 windowBits 参数 15(zlib 格式)和 30(gzip 格式)初始化 zlib。我用 Z_SYNC_FLUSH 和 Z_FULL_FLUSH 参数尝试了 inflate() 。 但它没有给我任何输出。

Ip traffic looks like this

每个数据包都以 00 00 00 ff ff 结尾。但是zlib手册说它必须是00 00 ff ff。

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

我的代码是:

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 可能是有效载荷的一部分。

标签: c++ compression zlib inflate world-of-warcraft


【解决方案1】:

您需要 windowBits 参数为 -15(负数)才能请求原始放气。

您所指的存储块是三个零,然后用足够的零位填充该字节的其余部分以到达字节边界,然后是四个字节00 00 ff ff。所以根据流中前面的位,00 00 ff ff 之前的字节可能不是00

【讨论】:

  • 它帮助了我!谢谢
猜你喜欢
  • 1970-01-01
  • 2015-12-16
  • 1970-01-01
  • 2017-06-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多