Scapy 是一个相当灵活的网络库,并没有限制数据包可以有多少层,使用时可以根据需要添加或删除层(注意遵循正确的协议栈顺序,逐层向上构建,不要打乱顺序,至少我把IP放在ICMP后面是ping不通的...不服可以亲自体会一下 σ`∀´)σ),以及修改每一层的参数:
from scapy.all import * # 构建一个数据包,包含多个层次
packet = ( Ether(dst="ff:ff:ff:ff:ff:ff", src="00:00:00:00:00:01") / # 以太网层 IP(dst="192.168.1.1", src="192.168.1.2") / # IP 层 TCP(dport=80, flags="S") / # TCP 层 Raw(load="GET / HTTP/1.1\r\nHost: www.example.com\r\n\r\n") # 原始数据层
) # 发送数据包
send(packet) # 嗅探数据包,并过滤出刚才发送的数据包
# sniff() 函数中的 filter 参数使用了 BPF(Berkeley Packet Filter)语法来过滤数据包
# 过滤出源 IP 地址为 "192.168.1.2" 且目的 TCP 端口为 80 的数据包
# count=1 参数指定我们只嗅探一个数据包。
sniffed_packets = sniff(filter="ip src 192.168.1.2 and tcp port 80", count=1) for packet in sniffed_packets: packet.show()
上面代码构建了一个包含四层的数据包:
- Ether 层:以太网层,包含目的和源 MAC 地址。
- IP 层:网络层,包含目的和源 IP 地址。
- TCP 层:传输层,这里是一个 TCP SYN 数据包,指定了目的端口(dport)为 80,并设置了 TCP 标志(flags)为 "S"。
- Raw 层:原始数据层,这里包含了一个简单的 HTTP GET 请求。