什么可能导致无效距离太远以及如何修改 zlib 来修复它?

szu*_*lak 2 c c++ zlib

我正在尝试解压缩来自第三方源的原始数据流。数据使用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 库(但我不确定)。有人能指出我正确的方向吗?

Mar*_*ler 6

您的数据是 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所期待的一定来自其他地方。