gpt4 book ai didi

python - 关于 python 中的 struct.unpack()

转载 作者:行者123 更新时间:2023-11-28 21:21:47 24 4
gpt4 key购买 nike

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

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

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

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

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

最佳答案

感谢 J.F. Sebastian 的提示。我终于弄明白了,将花一些时间在这里解释。通常我们必须在每个 header 的结构中查找 C 类型,以了解数据包不同 header 中的每个字段使用的是什么 C 类型。然后我们可以使用这个 table知道哪个格式说明符将代表哪个 C 类型。例如,在 IP header 的情况下,结构如下所示:

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 header 的字段值。在 IP header 的情况下,它变成如下:

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)。通常在 Internet 上可用的嗅探器程序中,只需使用 socket.inet_ntoa() 来获取实际的 ip 地址。此方法接受字符串类型而不是整数类型。这就是为什么在 unsigned int ip_src 情况下的原因; & 无符号整数 ip_dst;在 struct.unpack() 中使用 's' 代替 'I' 作为格式说明符,以便稍后可以将结果馈送到 socket.inet_ntoa() 以获取实际 IP 地址格式的 IP 地址。与以太网头的情况类似。我们在 struct.unpack() 中使用“s”而不是“B”,因为我们需要一个字符串,稍后可以将该字符串提供给 binascii.hexlify() 以获取实际 MAC 地址格式的 MAC .

关于python - 关于 python 中的 struct.unpack(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20768107/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com