如何解压魔兽数据
How to decompress WoW data
我有魔兽世界流量的 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;
}
您需要 windowBits
参数为 -15
(负数)才能请求原始放气。
您所指的存储块是三个零 位 ,然后用足够的零位填充该字节的其余部分以达到字节边界,然后是四个字节 00 00 ff ff
。因此,根据流中前面的位,00 00 ff ff
之前的字节可能不是 00
.
我有魔兽世界流量的 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;
}
您需要 windowBits
参数为 -15
(负数)才能请求原始放气。
您所指的存储块是三个零 位 ,然后用足够的零位填充该字节的其余部分以达到字节边界,然后是四个字节 00 00 ff ff
。因此,根据流中前面的位,00 00 ff ff
之前的字节可能不是 00
.