scapy 中是否有 TCP 和 UDP 的常量?
Are there a constants in scapy for TCP and UDP?
scapy 中有用于 TCP 和 UDP 的常量吗?
我是说
TCP=6, UDP=17
等...
TCP 和 UDP 是 TCP/UDP 数据包的发起者。
例如:
pack = IP(dst="www.google.com") / UDP(dport=80)
pack.show()
结果:
>>> pack = IP(dst="www.google.com") / UDP(dport=80)
>>> pack.show()
###[ IP ]###
version= 4
ihl= None
tos= 0x0
len= None
id= 1
flags=
frag= 0
ttl= 64
proto= udp
chksum= None
src= 'Your local address'
dst= Net('www.google.com')
\options\
###[ UDP ]###
sport= domain
dport= http
len= None
chksum= None
>>>
a)
查找 IP
的 implementation 我们看到 IP.proto
是 ByteEnumField("proto", 0, IP_PROTOS),
。这意味着,它从 IP_PROTOS
列表中获取值,该列表仅加载您的 os /etc/protocols/
。所以你可以自己解析 /etc/protocols
或者,scapy 已经加载,直接访问 IP_PROTOS
对象:
>>> IP_PROTOS
</etc/protocols/ pim ip ax_25 esp tcp ah mpls_in_ip rohc ipv6_opts xtp st mobility_header dccp igmp ipv6_route igp ddp etherip wesp xns_idp ipv6_frag vrrp gre ipcomp encap ipv6 iso_tp4 sctp ipencap rsvp hip udp ggp hmp idpr_cmtp hopopt fc skip icmp pup manet isis rdp l2tp ipv6_icmp udplite egp ipip ipv6_nonxt eigrp idrp shim6 rspf ospf vmtp>
>>> IP_PROTOS.tcp
6
>>> IP_PROTOS.udp
17
>>> IP_PROTOS.ip
0
b) 另一种方法是直接读取 scapys 层绑定信息。这是当您(或 scapy core 本身)调用 bind_layers(lower,upper[,overload_fields])
时添加到层的信息。您可以通过以下方式轻松阅读该信息:
>>> TCP.overload_fields
{<class 'scapy.layers.inet6.IPv6'>: {'nh': 6}, <class 'scapy.layers.inet.IP'>: {'frag': 0, 'proto': 6}}
意味着,如果 TCP 是 IPv4 (scapy.layers.inet.IP
) 的有效负载,它将覆盖 IP.proto=6
。
这是 UDP
的相同信息
>>> UDP.overload_fields
{<class 'scapy.layers.inet6.IPv6'>: {'nh': 17}, <class 'scapy.layers.inet.IP'>: {'frag': 0, 'proto': 17}}
scapy 中有用于 TCP 和 UDP 的常量吗?
我是说
TCP=6, UDP=17
等...
TCP 和 UDP 是 TCP/UDP 数据包的发起者。 例如:
pack = IP(dst="www.google.com") / UDP(dport=80)
pack.show()
结果:
>>> pack = IP(dst="www.google.com") / UDP(dport=80)
>>> pack.show()
###[ IP ]###
version= 4
ihl= None
tos= 0x0
len= None
id= 1
flags=
frag= 0
ttl= 64
proto= udp
chksum= None
src= 'Your local address'
dst= Net('www.google.com')
\options\
###[ UDP ]###
sport= domain
dport= http
len= None
chksum= None
>>>
a)
查找 IP
的 implementation 我们看到 IP.proto
是 ByteEnumField("proto", 0, IP_PROTOS),
。这意味着,它从 IP_PROTOS
列表中获取值,该列表仅加载您的 os /etc/protocols/
。所以你可以自己解析 /etc/protocols
或者,scapy 已经加载,直接访问 IP_PROTOS
对象:
>>> IP_PROTOS
</etc/protocols/ pim ip ax_25 esp tcp ah mpls_in_ip rohc ipv6_opts xtp st mobility_header dccp igmp ipv6_route igp ddp etherip wesp xns_idp ipv6_frag vrrp gre ipcomp encap ipv6 iso_tp4 sctp ipencap rsvp hip udp ggp hmp idpr_cmtp hopopt fc skip icmp pup manet isis rdp l2tp ipv6_icmp udplite egp ipip ipv6_nonxt eigrp idrp shim6 rspf ospf vmtp>
>>> IP_PROTOS.tcp
6
>>> IP_PROTOS.udp
17
>>> IP_PROTOS.ip
0
b) 另一种方法是直接读取 scapys 层绑定信息。这是当您(或 scapy core 本身)调用 bind_layers(lower,upper[,overload_fields])
时添加到层的信息。您可以通过以下方式轻松阅读该信息:
>>> TCP.overload_fields
{<class 'scapy.layers.inet6.IPv6'>: {'nh': 6}, <class 'scapy.layers.inet.IP'>: {'frag': 0, 'proto': 6}}
意味着,如果 TCP 是 IPv4 (scapy.layers.inet.IP
) 的有效负载,它将覆盖 IP.proto=6
。
这是 UDP
>>> UDP.overload_fields
{<class 'scapy.layers.inet6.IPv6'>: {'nh': 17}, <class 'scapy.layers.inet.IP'>: {'frag': 0, 'proto': 17}}