Python 的 scapy 库是一个非常优秀的发包工具,可以灵活构造各种报文。
1 2 3 4 5 6 7 8
| import socket import struct from scapy.all import * from scapy.layers.inet import * from scapy.layers.inet6 import *
RS = '120.55.68.91' TIMEOUT = 0.5
|
IPv4 ICMP 报文
1 2 3 4
| pkt = IP(dst=RS)/ICMP() pkt.show() print(hexdump(pkt)) sr1(pkt, timeout=TIMEOUT)
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| ###[ IP ]### version = 4 ihl = None tos = 0x0 len = None id = 1 flags = frag = 0 ttl = 64 proto = icmp chksum = None src = 192.168.1.112 dst = 120.55.68.91 \options \ ###[ ICMP ]### type = echo-request code = 0 chksum = None id = 0x0 seq = 0x0 unused = ''
0000 45 00 00 1C 00 01 00 00 40 01 FC 35 C0 A8 01 70 E.......@..5...p 0010 78 37 44 5B 08 00 F7 FF 00 00 00 00 x7D[........ None Begin emission: Finished sending 1 packets.
Received 2 packets, got 1 answers, remaining 0 packets
|
IPv4 UDP 报文
1 2 3 4
| pkt = IP(dst=RS)/UDP(sport=3000, dport=82) pkt.show() print(hexdump(pkt)) sr1(pkt, timeout=TIMEOUT)
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| ###[ IP ]### version = 4 ihl = None tos = 0x0 len = None id = 1 flags = frag = 0 ttl = 64 proto = udp chksum = None src = 192.168.1.112 dst = 120.55.68.91 \options \ ###[ UDP ]### sport = 3000 dport = 82 len = None chksum = None
0000 45 00 00 1C 00 01 00 00 40 11 FC 25 C0 A8 01 70 E.......@..%...p 0010 78 37 44 5B 0B B8 00 52 00 08 75 29 x7D[...R..u) None Begin emission: Finished sending 1 packets.
Received 9 packets, got 1 answers, remaining 0 packets
|
携带 Option 的 IPv4 UDP 报文
1 2 3 4 5
| opt = IPOption(option=0x1f, length=8, value=0) pkt = IP(dst=RS, options=opt)/UDP(sport=3000, dport=82) pkt.show() print(hexdump(pkt)) sr1(pkt, timeout=TIMEOUT)
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
| ###[ IP ]### version = 4 ihl = None tos = 0x0 len = None id = 1 flags = frag = 0 ttl = 64 proto = udp chksum = None src = 192.168.1.112 dst = 120.55.68.91 \options \ |###[ IP Option ]### | copy_flag = 0 | optclass = control | option = 31 | length = 8 | value = 0 ###[ UDP ]### sport = 3000 dport = 82 len = None chksum = None
0000 46 00 00 20 00 01 00 00 40 11 DC 19 C0 A8 01 70 F.. ....@......p 0010 78 37 44 5B 1F 08 00 00 0B B8 00 52 00 08 75 29 x7D[.......R..u) None Begin emission: Finished sending 1 packets.
Received 7 packets, got 0 answers, remaining 1 packets
|
1 2 3 4 5
| opt = HBHOptUnknown(otype=0x1f, optlen=6, optdata=0) pkt = IPv6(dst=RSV6)/IPv6ExtHdrDestOpt(options=opt)/UDP(sport=3000, dport=82) pkt.show2() print(hexdump(pkt)) sr1(pkt, timeout=TIMEOUT)
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| ###[ IPv6 ]### version = 6 tc = 0 fl = 0 plen = 16 nh = Destination Option Header hlim = 64 src = :: dst = fe02::2 ###[ IPv6 Extension Header - Destination Options Header ]### nh = UDP len = 0 autopad = On \options \ |###[ Scapy6 Unknown Option ]### | otype = 31 [00: skip, 0: Don't change en-route] | optlen = 6 | optdata = '\x01\x02\x00\x00' ###[ UDP ]### sport = 3000 dport = 82 len = 8 chksum = 0xf5cf
|