之前很困惑的一个问题,这两天也倒腾出来了,就是wireshark分析出来的这个
↑ ①Frame ↑②De-chunked entity body ↑③Uncompressed entity body
这三部分的关系是啥?
网上也找不到,还是请教了师兄师姐,才知道①是报文的所有内容,②是①中HTTP报文后面压缩的内容,③就是这部分压缩内容解压后的内容,也就是msgContent等等等这些需要的内容,所以我现在要做的就是截获报文之后对这部分内容进行解压(然后再提取msgContent的内容进行解密,这个之前已经做过了,只是需要整合一下了)。
1F 8B 表示采用gzip压缩格式。
在网上找了一个解压的程序,在VS里跑了一下报错,稍微修改了一下,然后提示
然后在网上看了一下,要自己去编译生成这个lib文件
于是找到这个sln文件,打开,选中zlibstat.lib,重新生成解决方案,会在/x86/ZlibStatDebug文件目录下找到生成的zlibstat.lib库文件,然后按以下步骤:
1. 包含头文件
属性--C/C++--常规--附加包含目录(添加包含.h文件的目录,也就是C:/zlib-1.2.8)
2. 定义宏
属性--C/C++--预处理器--预处理器定义:添加 ZLIB_WINAPI;ASMV;ASMINF
3. 项目包含.lib文件所在的目录:
属性--链接器--常规--附加库目录(添加C:/zlib-1.2.8/contirb/vstudio/vc10/x86/ZlibStatDebug)
4. 项目包含.lib文件
属性--链接器--输入--附加依赖项(zlibstat.lib)
5. 项目代码中 #include "zlib.h"
程序就可以正常运行啦
下一步就是把这些一步步整合起来,放在一个程序里。
附上解压使用的测试程序:
1 // gzip1.cpp : 定义控制台应用程序的入口点。 2 // 3 4 #include "stdafx.h" 5 6 7 #ifndef GZIP_H 8 #define GZIP_H 9 10 #include <stdio.h> 11 #include <stdlib.h> 12 #include "zlib.h" 13 14 /* Uncompress gzip data */ 15 /* zdata 原数据 nzdata 原数据长度 data 解压后数据 ndata 解压后长度 */ 16 int gzdecompress(Bytef *zdata, uLong nzdata, 17 Bytef *data, uLong ndata) 18 { 19 int err = 0; 20 z_stream d_stream = { 0 }; /* decompression stream */ 21 static char dummy_head[2] = { 22 0x8 + 0x7 * 0x10, 23 (((0x8 + 0x7 * 0x10) * 0x100 + 30) / 31 * 31) & 0xFF, 24 }; 25 d_stream.zalloc = NULL; 26 d_stream.zfree = NULL; 27 d_stream.opaque = NULL; 28 d_stream.next_in = zdata; 29 d_stream.avail_in = 0; 30 d_stream.next_out = data; 31 //只有设置为MAX_WBITS + 16才能在解压带header和trailer的文本 32 if (inflateInit2(&d_stream, MAX_WBITS + 16) != Z_OK) return -1; 33 //if(inflateInit2(&d_stream, 47) != Z_OK) return -1; 34 while (d_stream.total_out < ndata && d_stream.total_in < nzdata) { 35 d_stream.avail_in = d_stream.avail_out = 1; /* force small buffers */ 36 if ((err = inflate(&d_stream, Z_NO_FLUSH)) == Z_STREAM_END) break; 37 if (err != Z_OK) { 38 if (err == Z_DATA_ERROR) { 39 d_stream.next_in = (Bytef*)dummy_head; 40 d_stream.avail_in = sizeof(dummy_head); 41 if ((err = inflate(&d_stream, Z_NO_FLUSH)) != Z_OK) { 42 return -1; 43 } 44 } 45 else return -1; 46 } 47 } 48 if (inflateEnd(&d_stream) != Z_OK) return -1; 49 ndata = d_stream.total_out; 50 51 } 52 53 int main() 54 { 55 int i; 56 Bytef src[200] = { 57 0x1F, 0x8B, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x55, 0x8E, 0x41, 0x0A, 58 0xC2, 0x30, 0x14, 0x44, 0xEF, 0xF2, 0xD7, 0x59, 0xFC, 0xB4, 0x49, 0x9B, 0x66, 0xDB, 0x95, 0x3B, 59 0x17, 0x5E, 0x20, 0x34, 0xB1, 0x76, 0xD1, 0xA4, 0x34, 0x41, 0x90, 0xD2, 0xBD, 0x08, 0x82, 0xE0, 60 0x56, 0xF0, 0x24, 0xDE, 0x46, 0x7B, 0x0E, 0xD3, 0x0A, 0x05, 0x77, 0x9F, 0xF9, 0x33, 0xF3, 0x66, 61 0x80, 0xCA, 0x69, 0x03, 0x12, 0x09, 0xB4, 0xC6, 0x7B, 0x55, 0xC7, 0x1B, 0xA6, 0xFB, 0xF5, 0xFD, 62 0x7A, 0x4C, 0xE7, 0xDB, 0xE7, 0xF2, 0x04, 0x02, 0x5A, 0x05, 0x05, 0x72, 0x80, 0xD0, 0x74, 0x7E, 63 0x77, 0xEA, 0xFE, 0xDC, 0x1B, 0xBB, 0x77, 0xF3, 0xCF, 0x1B, 0xAB, 0x4D, 0x0F, 0x32, 0xA1, 0x98, 64 0x32, 0xC1, 0x08, 0xF4, 0xA6, 0x32, 0xCD, 0x71, 0x96, 0x68, 0x91, 0x30, 0x14, 0x09, 0x89, 0xF9, 65 0x36, 0x66, 0x29, 0xCB, 0x30, 0xC7, 0x0C, 0x19, 0x52, 0x5E, 0xC4, 0x1E, 0x5F, 0x97, 0xCE, 0x06, 66 0x63, 0x43, 0x04, 0x73, 0x5E, 0x60, 0x04, 0x86, 0x15, 0xE2, 0xEB, 0x8D, 0x06, 0xC9, 0x05, 0x4D, 67 0x45, 0x9E, 0xA5, 0x64, 0xC1, 0xAC, 0x13, 0x1A, 0x5F, 0xAA, 0xD6, 0xF4, 0x6A, 0x7B, 0x70, 0xC1, 68 0x2D, 0xCA, 0x8F, 0x37, 0x8E, 0xE3, 0x17, 0x6D, 0x19, 0x7E, 0x8C, 0xD7, 0x00, 0x00, 0x00 }; 69 70 Bytef dst[300] = { 0 }; 71 gzdecompress(src, 200, dst, 300); 72 for (i = 0; i<300; i++) 73 printf("%c", dst[i]); 74 system("pause"); 75 return 0; 76 } 77 78 79 #endif // GZIP_H
参考链接:
使用zlib实现gzip格式数据的压缩和解压 (这个代码有一丢丢错误,上面代码已经修改了)
Windows下zlib库和libPng库的编译和使用 (看第二步 “使用zlib静态库:zlibstat.h” 即可)