0

我编写了一个小应用程序,它应该解压缩以 gzip/deflate 格式编码的数据。

为了做到这一点,我正在使用 ZLIB 库,使用 uncompress 函数。

问题是该功能不起作用!换句话说,数据不是未压缩的!

我在这里发布代码:

int (*decompress)(PBYTE,PULONG,PBYTE,ULONG);

void DecodeData(PBYTE data,ULONG dataSize){
  LoadLibrary("C:\\zlib1.dll");

  decompress=(int(*)(PBYTE,PULONG,PBYTE,ULONG))GetProcAddress(
    GetModuleHandle("zlib1.dll"),"uncompress");

  // Yeah I know the size is hardcoded and it's not right, but it's just a test,
  // so nevermind

  PBYTE decompressedData=(PBYTE)VirtualAlloc(NULL,300,MEM_COMMIT|MEM_RESERVE,
    PAGE_EXECUTE_READWRITE);
  ULONG maxSize=250;

  decompress(decompressedData,&maxSize,data,dataSize);

  MessageBox(0,(char*)decompressedData,0,MB_OK);//MessageBox shows no data, it's blank!
}

GetProcAddress 成功获取了指向函数的指针,问题是函数返回 NULL(甚至没有 zlib 文档中列出的错误)

4

2 回答 2

5

uncompress()函数不会解压缩 gzip 数据,并且取决于“deflate”的含义,它也可能不会解压缩。

您指的是三种可能的格式,它们是实际的压缩数据,可能带有一些短的标头和尾标,以识别流并在最后提供一些检查数据。如RFC 1951所述,有原始的放气数据。RFC 1950定义了 zlib 包装的放气数据。有 gzip 包装的放气数据,由RFC 1952定义。

uncompress()只会解压缩 zlib 包装的 deflate 数据。它不会解压缩 gzip 包装的数据或原始 deflate 数据。

您没有为您尝试做的事情提供上下文。但是,当您说“gzip/deflate”时,我可能会猜到您指的是 HTTP 内容编码选项的名称。在这种情况下,由于名称选择不当,“deflate”内容编码指的是 zlib 包装的 deflate 数据,而不是原始数据。 uncompress()将解压缩正确传递的 HTTP deflate 内容编码数据。

我说“正确交付”,因为它可能不是。再次由于不幸的名称选择,以及 Microsoft 程序员无法实际阅读 HTTP 规范,当客户端接受 deflate 内容编码时,IIS 服务器将错误地传递原始 deflate 数据而不是 zlib 包装的数据。这导致客户端必须尝试以两种方式解码 deflate 内容编码并查看其中一种是否有效,或者更好的方法是首先根本不接受 deflate 编码。如果客户端只接受 gzip 内容编码,那么没有问题。

您可以使用zlib 的inflateInit2()inflate()inflateEnd()函数来解码提到的任何格式,即 gzip-wrapped、zlib-wrapped 和 raw。请阅读文档zlib.h以了解如何操作。

顺便说一句,该uncompress()函数返回一个整数,而不是指针。所以当你说函数返回NULL而不是它应该返回的时候,我只能假设该zlib函数的接口没有正确定义。

于 2012-05-27T15:26:55.683 回答
-3

为什么在您的 GetProcAddress 中使用“解压缩”,但尝试解压缩?您获得了“解压缩”程序的地址!!!

于 2012-05-27T12:57:32.387 回答