使用 Python 解压缩数据包的 gzip 有效负载

2024-05-04

我目前正在开发一个程序,该程序采用 .pcap 文件并使用 scapy 包按 ip 分离出所有数据包。我想解压缩使用 gzip 包压缩的有效负载。我可以判断有效负载是否经过 gzip 压缩,因为它包含

Content-Encoding: gzip

我正在尝试使用

fileStream = StringIO.StringIO(payload)
gzipper = gzip.GzipFile(fileobj=fileStream)
data = gzipper.read()

解压缩有效负载,其中

payload = str(pkt[TCP].payload)

当我尝试这样做时,我收到错误

IOError: Not a gzipped file

当我打印第一个有效负载时,我得到

HTTP/1.1 200 OK
Cache-Control: private, max-age=0
Content-Type: text/html; charset=utf-8
P3P: CP="NON UNI COM NAV STA LOC CURa DEVa PSAa PSDa OUR IND"
Vary: Accept-Encoding
Content-Encoding: gzip
Date: Sat, 30 Mar 2013 19:23:33 GMT
Content-Length: 15534
Connection: keep-alive
Set-Cookie: _FS=NU=1; domain=.bing.com; path=/
Set-Cookie: _SS=SID=F2652FD33DC443498CE043186458C3FC&C=20.0; domain=.bing.com; path=/
Set-Cookie: MUID=2961778241736E4F314E732240626EBE; expires=Mon, 30-Mar-2015 19:23:33 GMT; domain=.bing.com; path=/
Set-Cookie: MUIDB=2961778241736E4F314E732240626EBE; expires=Mon, 30-Mar-2015 19:23:33 GMT; path=/
Set-Cookie: OrigMUID=2961778241736E4F314E732240626EBE%2c532012b954b64747ae9b83e7ede66522; expires=Mon, 30-Mar-2015 19:23:33 GMT; domain=.bing.com; path=/
Set-Cookie: SRCHD=D=2758763&MS=2758763&AF=NOFORM; expires=Mon, 30-Mar-2015 19:23:33 GMT; domain=.bing.com; path=/
Set-Cookie: SRCHUID=V=2&GUID=02F43275DC7F435BB3DF3FD32E181F4D; expires=Mon, 30-Mar-2015 19:23:33 GMT; path=/
Set-Cookie: SRCHUSR=AUTOREDIR=0&GEOVAR=&DOB=20130330; expires=Mon, 30-Mar-2015 19:23:33 GMT; domain=.bing.com; path=/

?}k{?H????+0?#!?,_???$?:?7vf?w?Hb???ƊG???9???/9U?\$;3{9g?ycAӗ???????W{?o?~?FZ?e ]>??<??n????׻?????????d?t??a?3?
?2?p??eBI?e??????ܒ?P??-?Q?-L?????ǼR?³?ׯ??%'
?2Kf?7???c?Y?I?1+c??,ae]?????<{?=ƞ,?^?J?ď???y??6O?_?z????_?ޞ~?_?????Bo%]???_?????W=?

有关其他信息,这是一个已隔离的数据包,因为它包含来自项目提供的示例 .pcap 文件的 Content-Encoding: gzip。


为了解码 gzip 压缩的 HTTP 响应,您只需解码该响应body,而不是标题。

The payload在您的情况下,是整个 TCP 有效负载,即包括标头和正文的整个 HTTP 消息。

HTTP 消息(请求和响应)是RFC 822 https://www.ietf.org/rfc/rfc0822.txt消息(与电子邮件消息 (RFC 2822) 所基于的通用消息格式相同)。

822消息的结构非常简单:

  • 零个或多个标题行(键/值对由:), 由 CRLF 终止
  • 空行(CRLF(回车、换行等)'\r\n')
  • 消息正文

您现在可以自己解析此消息以隔离正文。但我宁愿建议你使用Python已经为你提供的工具。这httplib https://docs.python.org/2/library/httplib.html模块(Python 2.x)包括HTTPMessage https://docs.python.org/2/library/httplib.html#httplib.HTTPMessage使用的类httplib内部解析 HTTP 响应。它并不意味着直接使用,但在这种情况下我可能仍然会使用它 - 它将为您处理一些 HTTP 特定细节。

以下是如何使用它来将正文与标题分开:

>>> from httplib import HTTPMessage
>>>
>>> f = open('gzipped_response.payload')
>>>
>>> # Or, if you already have the payload in memory as a string:
... # f = StringIO.StringIO(payload)
...
>>> status_line = f.readline()
>>> msg = HTTPMessage(f, 0)
>>> body = msg.fp.read()

The HTTPMessage类的工作方式类似rfc822.Message https://docs.python.org/2/library/rfc822.html#rfc822.Message does:

  • 首先,您需要读取(或丢弃)状态行(HTTP/1.1 200 OK),因为这不是 RFC822 消息的一部分,也不是标头。

  • 然后你实例化HTTPMessage带有打开文件的句柄和seekable参数设置为0。文件指针存储为msg.fp

  • 实例化后它调用msg.readheaders(),它读取所有标题行,直到遇到空行 (CRLF)。
  • 在那时候,msg.fp已前进到标题结束和正文开始的位置。因此您可以致电msg.fp.read()阅读消息的其余部分 - 正文。

之后,解压缩 gzip 正文的代码就可以正常工作:

>>> body_stream = StringIO.StringIO(body)
>>> gzipper = gzip.GzipFile(fileobj=body_stream)
>>> data = gzipper.read()
>>>
>>> print data[:25]
<!DOCTYPE html>
<html>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Python 解压缩数据包的 gzip 有效负载 的相关文章

随机推荐

  • 场景 - 根据 iPad 或 iPhone 使用专用故事板

    Apple 现在希望我们使用 场景 而不是窗口和屏幕来显示 iPad 和 iPhone 的内容 现在添加了对场景的支持 我似乎失去了使用故事板定位 iPad 或 iPhone 的能力 I set my scenes inside plist
  • 突然我无法为 iPhone 模拟器构建

    有时人们真的很讨厌苹果的开发环境 说真的 有必要这么复杂吗 我的问题是这样的 我无法再在模拟器上构建我的项目 我收到以下错误 我意识到这是一个链接器错误 我不明白的是 1 为什么它突然不再工作 2 它为什么不会选择正确的 SDK 这是链接器
  • 检测字符串中的所有大写字母

    我在尝试在 JavaScript 中编写正则表达式时遇到问题 该正则表达式可以检测以全部大写字母键入的至少 2 个字符的整个单词 这是我尝试过的并且似乎有效 b Wa z0 9 b 但是 我会检测用户是否开始字符串 我喜欢你 因为 I 是大
  • Objective-C 中如何检查一个字符是否为数字?

    我需要检查一个字符是否是数字 NSString strTest Test55 char c strTest characterAtIndex 4 我需要找出 c 是否是数字 我怎样才能在 Objective C 中实现这个检查 Note 返
  • Android 模拟器冻结

    在上一个 SDK 版本发布之前 我的 Android 模拟器在 x86 架构上运行得非常好 安装了 Intel HAXM 并在 AVD Manager 中为设备启用了 GPU 使用最新的 SDK 版本 我重新安装了 Windows 从 8
  • 如何点击粘贴?它适用于谷歌文档

    我希望能够在用户单击时启动真正的粘贴事件 我可以理解这可能是一个安全问题 因为如果任何网页可以访问用户剪贴板 那就不好了 所以我认为所有浏览器都不允许访问剪贴板数据 但例如在 google 文档 在类似 word 的应用程序中 中 我可以从
  • 如何使水平条形图可滚动?

    目前正在尝试使用 MPAndroidChart 实现 Horizo ntalBarChart 但是 条形图太多 无法全部显示在屏幕上 仅当我放大时 Horizo ntalBarChart 才会滚动 但永远不会超过屏幕上已有的内容 不确定这是
  • Powershell send-mailmessage - 向多个收件人发送电子邮件

    我有这个 powershell 脚本来发送带有附件的电子邮件 但是当我添加多个收件人时 只有第一个收件人收到消息 我已经阅读了文档 但仍然无法弄清楚 谢谢 recipients Marcel lt email protected cdn c
  • 地图中的最大元素数

    GO 中的 Map 最多可以存储多少个元素 如果我需要经常从 Map 访问数据 那么在长时间运行的程序中不断向 Map 添加项目并从中检索项目是一个好主意吗 除了map length类型的最大值之外 map中的元素数量没有理论上的限制 in
  • Python 原始字符串和尾随反斜杠[重复]

    这个问题在这里已经有答案了 我曾经遇到过一些东西 想知道它是否是一个 Python bug 或者至少是一个错误功能 我很好奇是否有人知道这种行为的任何理由 我刚刚在阅读 Code Like a Pythonista 时想到了这一点 到目前为
  • 在龙卷风下运行 Pyramid WSGI 应用程序

    Pyramid 使用它自己的 Waitress Web 服务器进行开发 但我想在 Tornado 下为我的 WSGI 应用程序提供服务 我想我应该使用 pserve ini 文件配置它 但我无法让它工作 Pyramid 应用程序可以轻松地从
  • 如何选择使用 C# 的 CodeDom 编译器的目标框架?

    因此 我有一个用 C 编写的 CodeDOM 编译器 它应该根据其资源之一编译另一个应用程序 如何更改资源 或编译器输出的可执行文件 的目标 NET 框架 您可以使用以下命令将选项传递给编译器以下构造函数 http msdn microso
  • 是否可以在我的 Azure DevOps 构建管道“发布工件”任务中有条件地设置工件名称?

    我想知道是否可以在 Azure DevOps 构建管道 发布工件 任务中有条件地设置构建工件的名称 我想根据构建管道的输入生成不同的工件 比如说 根据输入管道变量 我想生成三个工件之一 红色 蓝色 绿色 是否可以根据输入变量指定在我的 发布
  • django-storages boto3 访问私有文件的文件 url

    我正在尝试在我创建的测试模型中获取文件的生成 URL 我正在尝试通过以下方式获取文件的正确网址 modelobject file url如果文件是公开的 它确实会给我正确的网址 但是如果文件是私有的 它不会自动为我生成签名的网址 这通常是如
  • 如何获取 C# 项目之间的依赖关系图

    我有一个相当复杂的应用程序 它已分解为多个组件 每个组件都有一个解决方案文件 其中包含一堆项目 所以我喜欢将其视为一个包含多个项目 dll 的组件 还有一个 通用 组件 所有其他组件都依赖于 common 所以编译是这样的 nant com
  • 我应该测试 Spring Boot 应用程序的 main() 方法吗?如何测试?

    当我创建 Spring Boot 应用程序时 它会生成 2 个类 SpringBootApplication public class App public static void main String args SpringApplic
  • Mongoose Date.now 时间不准确

    在过去的两个小时里 我一直在抓狂 起初我以为 Moment js 是没有返回正确时间的罪魁祸首 但其实是 mongoose Date now 做了一些邪恶的事情 这是代码 const moment require moment const
  • D3:使用 d3-tile 缩放到边界框

    我已成功将 D3 矢量 地图分层到从 Mapbox 提取图块的 d3 tile 光栅 地图之上 手动缩放效果非常好 矢量和光栅都是同步的 我现在正在尝试实施迈克 博斯托克 缩放到边界框 https bl ocks org mbostock
  • 复杂C语法的含义[重复]

    这个问题在这里已经有答案了 可能的重复 这个C语句是什么意思 https stackoverflow com questions 8249483 what does this c statement mean 这个表达是什么意思 char
  • 使用 Python 解压缩数据包的 gzip 有效负载

    我目前正在开发一个程序 该程序采用 pcap 文件并使用 scapy 包按 ip 分离出所有数据包 我想解压缩使用 gzip 包压缩的有效负载 我可以判断有效负载是否经过 gzip 压缩 因为它包含 Content Encoding gzi