关于python中的struct.unpack()

2024-03-17

级别:初级。我目前正在使用原始套接字使用 python 来开发嗅探器。 我有一个关于 struct 模块提供的 unpack() 中使用的格式说明符的一般性问题。当我们使用此方法根据指定的格式说明符解包数据时。我见过很多嗅探器程序使用 unpack() 从十六进制形式解码数据包信息。 例如,为了提取以太网标头信息,可以使用以下代码:

ethHeader = struct.unpack("!6s6s2s", ethernetHeader)

这里的 ethernetHeader 是变量,包含之前从原始套接字捕获的实际以太网标头数据。现在我的问题是如何知道标题使用哪种格式说明符?我如何提前知道以太网地址是字符串格式还是其他格式?是否也有这方面的文档。我阅读了与 unpack() 相关的 python 文档,但没有找到任何信息。类似地,对于 IP 地址,代码如下:

ipAddresses = struct.unpack("!12s4s4s", IPAddresses)

这里的 IPAddresses 是变量,包含之前从原始套接字捕获的实际 IP 地址信息。我怎么知道我必须使用字符串作为格式说明符(!12s4s4s)。 谢谢。


感谢 J.F. Sebastian 的提示。我终于弄清楚了,并将花一些时间在这里解释它。通常,我们必须在每个标头的结构中查找 C 类型,以了解数据包的不同标头中的每个字段使用什么 C 类型。那么稍后我们就可以使用这个table http://docs.python.org/2/library/struct.html#format-characters了解哪个格式说明符将代表哪种 C 类型。例如,对于 IP 标头,结构如下所示:

struct ipheader {
 unsigned char ip_hl:4, ip_v:4; /* this means that each member is 4 bits */
 unsigned char ip_tos;
 unsigned short int ip_len;
 unsigned short int ip_id;
 unsigned short int ip_off;
 unsigned char ip_ttl;
 unsigned char ip_p;
 unsigned short int ip_sum;
 unsigned int ip_src;
 unsigned int ip_dst;
}; 

例如:unsigned char 表示为“B”,unsigned int 表示为“I”。现在我们可以使用此方法来了解 struct.unpack() 中应使用什么格式说明符来获取 IP 标头的字段值。如果是 IP 标头,则如下所示:

struct.unpack('!BBHHHBBHII')

但你会注意到大多数程序都使用struct.unpack('!BBHHHBBH4s4s').

那么问题来了,为什么在这种情况下unsigned int ip_src; & unsigned int ip_dst;使用“s”代替“I”作为格式说明符struct.unpack()。原因是如果“I”用作格式说明符,则unpack()方法以整数形式返回 IP 地址(例如:3232267778)。然后你必须将其转换为实际的IP地址形式(例如:10.0.0.1)。通常在互联网上可用的嗅探器程序中只需使用socket.inet_ntoa()用于获取实际的IP地址。此方法接受字符串类型而不是整数类型。这就是为什么在 unsigned int ip_src 的情况下; & 无符号 int ip_dst;在 struct.unpack() 中使用“s”代替“I”作为格式说明符,以便稍后可以将结果提供给 socket.inet_ntoa() 以获取实际 IP 地址格式的 IP 地址。以太网标头的情况也是如此。我们在 struct.unpack() 中使用“s”而不是“B”,因为我们需要一个可以稍后输入的字符串binascii.hexlify()以获取实际 MAC 地址格式的 MAC。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

关于python中的struct.unpack() 的相关文章

随机推荐

  • Rails 6 中的自动加载和 Zeitwerk 模式

    Rails 6 中的 Zeitwerk 模式中是否有任何代码被折旧 class Application lt Rails Application Initialize configuration defaults for originall
  • 执行批量插入 SQLAlchemy 的最佳方法

    我有一张桌子叫products 其中有以下列id product id data activity id 我本质上想做的是复制大量现有产品并更新它activity id并在产品表中创建新条目 例子 我已经有 70 个 Activity id
  • MATLAB 奇怪的“输入参数太多”错误

    对于一个项目 我尝试使用 matlab 调用另一个 m 文件中的函数 然而 它说 没有足够的输入参数 即使我确实传递了我相当确定是足够的输入参数 在 eval square m 中 function f eval square x fitn
  • AWS Cloudwatch 未触发 API 调用

    我试图在任何 API 调用上创建规则触发器以进行创建 但没有取得任何成功 我有另一个规则 每当 ec2 实例运行时就会触发该规则 但该规则不会针对 RunInstances 触发 尽管我在 API 日志中看到带有 RunInstances
  • emacs 跨帧跟随模式

    有没有一种方法可以像在跟随模式中那样获得行为 但可以在单独的框架中跨越多个窗口 我必须处理一些令人讨厌的遗留代码 这些代码有七页砖块 八层深度的嵌套 for 循环 其中有很多 goto 它有助于查看尽可能多的代码 以便充分理解和重写它 而不
  • Symfony2 表单用数据预填充字段

    暂时假设该形式使用了一个虚构的Animal文档对象类来自ZooCollection只有两个属性 名称 和 颜色 symfony2 questions tagged symfony2 我正在寻找一个工作简单愚蠢的解决方案 to pre fil
  • Streambuf到底是什么?我该如何使用它?

    我正在尝试更多地了解 I O 流在 C 中如何工作 但我真的很困惑何时使用什么 到底什么是streambuf 我什么时候使用streambuf 与string an istream or a vector 我已经知道最后三个 但不知道如何s
  • 如何在 Odoo 模板语言中使用 if

    我正在尝试使用与 Django 中相同的功能 div class 在 Odoo 我有 div
  • 使用 Runtime.getRuntime().exec(command) 时用户向命令行输入;

    我认为这是不可能的 但我一直在使用 Process p Runtime getRuntime exec command 在命令行上运行命令 但现在我遇到了一种情况 我正在运行的命令会要求一些用户输入 例如用户名 这无法通过正在执行的命令的参
  • 如何从 emberjs 中的操作返回值

    如何从操作中返回一些值 我试过这个 var t this send someAction params actions someAction function return someValue 操作不返回值 仅返回 true false u
  • 在java中选择特定类型的文件

    我使用以下代码在 java 中选择文件 File folder new File path to folder File listOfFiles folder listFiles 现在如果我只想选择图像文件该怎么办 使用以下版本之一File
  • 如何从 DSpace 反馈页面的修改版本中获取引用页面(项目)的标题?

    如何从反馈页面的修改版本中获取项目的标题 就像 jspui 中的 推荐此项目 一样 我希望也能生成页面的结果网址 如下所示http example com feedback handle 123456789 123 http example
  • 在pygame中打印用户的输入

    我几乎已经完成了我正在为学校项目制作的一款游戏 但现在我在游戏的一小部分上遇到了困难 我能够获取用户的姓名并使用它来将其写入排行榜 csv 文件 但我想要这样做 以便无论用户键入什么 游戏都会将用户的输入打印到屏幕上 就像您键入时一样在搜索
  • 如何在Python中计算NTLM哈希值?

    如何在 python 中计算密码的 NTLM 哈希值 有任何库或示例代码吗 我想要它用 python 编写 NTLM 强力工具 如 Cain 和 Abel 它的使用其实非常简单hashlib here http docs python or
  • 如何从 Sass 样式表中仅导入变量和 mixin?

    我正在使用 Zurb Foundation 4 S CSS 框架 并且遇到了大量重复样式的问题 这是因为在每个文件中我 import foundation 中 Foundation 中的所有样式也会导入 规则body row button和
  • Visual Studio 2012 - 从解决方案资源管理器中隐藏文件夹?

    是否可以在 Visual Studio 2012 解决方案资源管理器窗口中隐藏文件夹 我有多个不打算使用的文件夹 文件 它们只是让界面变得混乱 而且很难找到东西 您可以切换 显示隐藏文件 但实际上无法隐藏任何文件 这似乎很不合逻辑 Exam
  • Plone - 在页面中何处存储图像和文件附件的最佳实践?

    我们正在使用 Plone 4 1 3 构建一个 Intranet 网站 并想知道是否有 Plone 最佳实践来存储附加到页面的文件和图像 我们的内联网更像是一个协作站点 用户可以在其中发布新闻项目和其他文章 因此 用户将插入图像 使用 Ti
  • Taskkill /f 不会终止进程

    当我从 VS 启动 VS 的实验实例进行调试并停止调试 有时直接从父 VS 时 zombile devenv exe 进程仍在运行 我无法杀死它 它保留了我的许多 dll 当我以管理员身份登录到这台 64 位 Win7 机器时 我希望能够终
  • 防止点击文件输入的标签打开文件浏览器

    我有一个用户可以上传图像的表单 我正在使用
  • 关于python中的struct.unpack()

    级别 初级 我目前正在使用原始套接字使用 python 来开发嗅探器 我有一个关于 struct 模块提供的 unpack 中使用的格式说明符的一般性问题 当我们使用此方法根据指定的格式说明符解包数据时 我见过很多嗅探器程序使用 unpac