Scapy用户手册建议使用sr()
或sr1()
函数发送数据包并接收答案:
sr()
函数用于发送数据包并接收答案。该函数返回数据包和答案的一对,以及未被回答的数据包。函数sr1()
是一个变体,仅返回一个已回答发送数据包(或数据包集)的数据包。数据包必须是第3层协议数据包(IP,ARP等)。函数srp()
与此类似,但适用于第2层协议数据包(Ethernet,802.3等)。
官方API文档指定了它们的完整签名。这些似乎是这种用例的相关参数:
retry
:如果是正数,则重新发送未回复的数据包的次数。如果是负数,则在放弃之前连续未回答的探测次数。只有负值实际上有用。
timeout
:在最后一个数据包被发送后等待多长时间。默认情况下,sr
将永远等待,用户需要在预计没有更多答案时中断(Ctrl-C)。
inter
:每个数据包发送之间等待的时间(以秒为单位)。
以下是使用sr()
函数的执行示例:
In [1]: from scapy.all import *
WARNING: No route found for IPv6 destination :: (no default route?)
In [2]: results, unanswered = sr(ARP(op=ARP.who_has, psrc='192.168.1.2', pdst='192.168.1.1'))
Begin emission:
.....*Finished to send 1 packets.
Received 6 packets, got 1 answers, remaining 0 packets
In [3]: results
Out[3]: <Results: TCP:0 UDP:0 ICMP:0 Other:1>
In [4]: result = results[0]
In [5]: result
Out[5]:
(<ARP op=who-has psrc=192.168.1.2 pdst=192.168.1.1 |>,
<ARP hwtype=0x1 ptype=0x800 hwlen=6 plen=4 op=is-at hwsrc=XX:XX:XX:XX:XX:XX psrc=192.168.1.1 hwdst=XX:XX:XX:XX:XX:XX pdst=192.168.1.2 |>)
In [6]: original_packet, answer = result
In [7]: original_packet
Out[7]: <ARP op=who-has psrc=192.168.1.2 pdst=192.168.1.1 |>
In [8]: answer
Out[8]: <ARP hwtype=0x1 ptype=0x800 hwlen=6 plen=4 op=is-at hwsrc=XX:XX:XX:XX:XX:XX psrc=192.168.1.1 hwdst=XX:XX:XX:XX:XX:XX pdst=192.168.1.2 |>
In [9]: answer.hwsrc
Out[9]: 'XX:XX:XX:XX:XX:XX'
这里是使用
sr1()
函数的执行示例:
In [10]: result = sr1(ARP(op=ARP.who_has, psrc='192.168.1.2', pdst='192.168.1.1'))
Begin emission:
.....Finished to send 1 packets.
*
Received 6 packets, got 1 answers, remaining 0 packets
In [11]: result
Out[11]: <ARP hwtype=0x1 ptype=0x800 hwlen=6 plen=4 op=is-at hwsrc=XX:XX:XX:XX:XX:XX psrc=192.168.1.1 hwdst=XX:XX:XX:XX:XX:XX pdst=192.168.1.2 |>
In [12]: result.hwsrc
Out[12]: 'XX:XX:XX:XX:XX:XX'
注意: 另一个回答该如何提取MAC地址演示了MAC地址如何被提取,这个答案也被编辑以反映这一点。
str(packet).encode("HEX")
打印出来。 - Yoelimport binascii; binascii.hexlify(bytes(packet))
应该可以使用。 - Yoel