使用dpkt解析IP地址

4 投票
1 回答
12573 浏览
提问于 2025-04-18 17:42

我正在使用dpkt库来解析pcap文件,但我对如何提取目标IP地址感到困惑。我通过使用eth = dpkt.ethernet.Ethernet(buf)来解析数据包,这样会返回一个以太网对象,格式如下:

Ethernet(src='\x00\x1a\xa0kUf', dst='\x00\x13I\xae\x84,', data=IP(src='\xc0\xa8\n\n',
off=16384, dst='C\x17\x030', sum=25129, len=52, p=6, id=51105, data=TCP(seq=9632694,
off_x2=128, ack=3382015884, win=54, sum=65372, flags=17, dport=80, sport=56145)))

我有两个问题。

  1. 我应该获取以太网中的dst字段,还是IP中的那个(即Ethernet.data)?
  2. 我该如何将这些奇怪的字符串转换成格式为x.x.x.x的IP地址,其中x是0到255之间的整数?

我尝试过一个解决方案,比如将“小端”十六进制字符串转换为Python中的IP地址,但这两个dst字段有时似乎包含一些无法解析为IP地址的数据,比如_daQ(_daQ是怎么解析成地址的?)或者RT\x00\x125\x02(RT是什么?)或者33\x00\x01\x00\x03(开头的33是什么,为什么看起来像5个字节而不是4个字节?)

1 个回答

10
  1. eth.dst这个字段会包含目标的MAC地址(比如说01:23:45:67:89:ab),而不是目标的IP地址。你需要使用ip.dst字段。
  2. 这些字符串是字节字符串,而不是可以直接阅读的ASCII字符字符串。

试试这个:

ip_hdr = eth.data
ip_hdr.dst  # will contain your destination IP address in BINARY

# adapted from http://www.commercialventvac.com/dpkt.html#mozTocId303989
import socket
dst_ip_addr_str = socket.inet_ntoa(ip_hdr.dst)

撰写回答