我正在尝试解压缩来自第三方源的原始数据流。数据使用zlib库(版本1.2.13)压缩并通过TCP协议传输。我能够使用 WireShark 和逆向工程方法的组合来捕获压缩和未压缩的数据流:
压缩形式:0xCA 0x05 0xDB 0xC8 0xE8 0x07 0x22 0x01 0x00
未压缩形式:0x6D 0x4D 0x7D 0x9B 0x7C 0x07 0x01 0x4E 0x7D 0x9B 0x7C 0x07 0x00
z_stream strm;
unsigned char in[9] = {0xCA, 0x05, 0xDB, 0xC8, 0xE8, 0x07, 0x22, 0x01, 0x00};
unsigned char out[65535] = {0};
strm.zalloc = Z_NULL;
strm.zfree = Z_NULL;
strm.opaque = Z_NULL;
int ret = inflateInit2(&strm, -15);
if (ret != Z_OK)
return ret;
strm.next_in = (unsigned char *) in;
strm.avail_in = 9;
strm.next_out = (unsigned char *) out;
strm.avail_out = 65535;
strm.total_out = 0;
ret = inflate(&strm, Z_SYNC_FLUSH);
Run Code Online (Sandbox Code Playgroud)
最初,该inflate函数返回 -3(带有消息“无效距离太远”)。然后我重新编译了 zlib,进行了两项修改:添加DINFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR标志并更改sane = 0函数inflateResetKeep以允许无效距离。
经过这些修改后,调用inflate函数我得到以下结果(在输出缓冲区中):
0x6D 0x00 0x00 0x00 0x00 0x00 0x01 0x4E 0x00 0x00 0x00 0x00 0x00
我尝试使用infgen工具调试这个 deflate 流,但它给了我一个错误,提示incomplete deflate stream.
deflate 流有可能来自修改后的 zlib 库(但我不确定)。有人能指出我正确的方向吗?
您的数据是 deflate 流的片段。拆解后的这些位是:
! infgen 3.0 output
!
fixed
literal 'm
match 5 114
infgen warning: distance too far back (114/1)
literal 1 'N
match 4 6
end
!
stored
infgen warning: incomplete deflate data
Run Code Online (Sandbox Code Playgroud)
在该数据开始之前,它需要 113 字节中的 5 个字节,这将是 deflate 流的早期部分的一部分。稍后,这五个字节中的四个您没有的字节会再次重复。
仅从 deflate 流的片段中获取您期望的数据是不可能的。你0x4D 0x7D 0x9B 0x7C 0x07所期待的一定来自其他地方。