如何解析TCP包内压缩的html页面数据?
最近在用钩子模块去抓取 在页面访问时,tcp包内传输的html文件。没料到的是,包内传输的居然是压缩后的数据,无法直接对其进行修改。wireshark在抓包后能够还原这些压缩数据作为参考。查阅资料后发现,wireshark源码在判断gzip或deflate时确实有这样的操作。我现在需要改变html文件的内容,肯定是无法修改包内的压缩数据的。那么我应该怎么做最方便最简单呢,不会去跟wireshark源码学吧??求各位大神指点一二,非常感谢! 方案1:HOOK客户端发起的HTTP请求,把request 中的Accept-Encoding: gzip, deflate参数去掉。让服务器别给你去压缩。方案2:直接在内核里解压缩也不是不可以呀。内核已经有现成的压缩和解压缩函数呀。
回复 2# Tinnal
多谢版主大神指点!方案1的话,原理上是可行,但是这估计会降低传输效率的呢?方案2的话,我在内核找到了一些相关的比如zlib_inflateInit2等函数,然后我直接把抓到的十六进制数据传参给解压函数,但是错误返回值-3好像是说传入的数据错误,就这点一直摸不着头脑,不知问题在哪??
回复 2# Tinnal
对了,还有个大的问题就是,不知道能否实时解压,还是必须得等到接收完才能解压???
回复 4# qw10371006
http在解压缩时,好像有些特别的格式改动。见:
http://blog.csdn.net/rainharder/article/details/26342919
Apache的deflate变种可能也没有zlib header,需要添加假头后处理。即MS的错误deflate (raw deflate).zlib头第1字节一般是0×78, 第2字节与第一字节合起来的双字节应能被31整除,详见rfc1950。例如Firefox的zlib假头为0×7801,python zlib.compress()结果头部为0×789c。
在http://en.wikipedia.org/wiki/HTTP_compression里有更为官方的说明:
Another problem found while deploying HTTP compression on large scale is due to the deflate encoding definition: while HTTP 1.1 defines the deflate encoding as data compressed with deflate (RFC 1951) inside a zlib formatted stream (RFC 1950), Microsoft server and client products historically implemented it as a "raw" deflated stream, making its deployment unreliable. For this reason, some software, including the Apache HTTP Server, only implement gzip encoding.
http://blog.sina.com.cn/s/blog_65db99840100kwh9.html
这里有一些案例。
建议根据具体的服务器、具体的错误返回,去多尝试。当前更为直接的方法是看看服务器生成压缩数据是怎么操作的:
http://httpd.apache.org/docs/2.2/mod/mod_deflate.html
下它的源码来看看吧。
至于你后面的问题,请看啊呢官方的Zlib说明,解压缩应该是支持的。
http://www.zlib.net/zlib_how.html 回复 5# Tinnal
讲的非常详细,多谢了!!
回复 5# Tinnal
忘了还有个问题了,文件分多个tcp数据包传输,, 修改了最后一个tcp数据包的skb,包长度,checksum这些因为我都考虑过了,但是为什么这个包不会被接收呢?
回复 7# qw10371006
在接收端用抓包软件抓下包,让它给你检查下你的包那错了吧。
另外,你改了一个TCP的包,你是怎么弄回去的,怎么压缩的?别个是一个HTTP报文整体压缩的,你只改了一个TCP包就多重压缩了?那样接收端不是不能正确解压缩了吗。
回复 2# Tinnal
方案1:HOOK客户端发起的HTTP请求,把request 中的Accept-Encoding: gzip, deflate参数去掉。让服务器别给你去压缩。
方案2:直接在内核里解压缩也不是不可以呀。内核已经有现成的压缩和解压缩函数呀。
方案1可行;
方案2只能工作在代理模式下(因为你解压当前数据包内容的时候可能需要前几个数据包和未来几个数据包才能真正解压开);
瀚海书香 发表于 2015-01-22 08:42 static/image/common/back.gif
回复 2# Tinnal
恩,这也是我在8楼要说明的。