如何用scapy创建新层或新协议?

时间:2017-09-16 20:53:30

标签: python python-3.x layer scapy network-protocols

我想用scapy创建一个新图层,我创建了一个新图层但是当我将它发送到另一台计算机时它丢失了,wireshark也无法识别它。 我怎么能解决这个问题?

SELECT

4 个答案:

答案 0 :(得分:2)

当您使用scapy创建新协议或新图层时,使用其他网络工具,例如wireshark(以及其他网络工具),因为他们了解您的协议的细节将无法自动正确解析它。

如果您想尝试新协议,则必须创建自己的本地解码器。以下示例甚至是最小的,它演示了以上所有内容:

#!/usr/bin/env python 

from scapy.all import *

# create a simple protocol 
# (example similar with the one in the scapy docs...)
class Exmpl(Packet):
    name = "myprotocol"
    fields_desc=[ ShortField("fld1",5),
                  XByteField("fld2",3) ]

from scapy.utils import PcapWriter

# write data in a pcap file to examine later with
# 1 -> scapy
# 2 -> wireshark
print '\n[+] Writing net.pcap file...'
cap = PcapWriter("net.pcap", append=True, sync=True)
for i in range(10):
    packet = Exmpl(fld1=i)
    cap.write(packet)

# read the data and examine them with scapy
# scapy is aware of the "Exmpl" protocol (e.g. its fields etc...) 
# and how to decode it, while wireshark is not
print '[+] Examining net.pcap file...\n'
packets = rdpcap('net.pcap')
for p in packets: 
    Exmpl(str(p)).show()

上述脚本的输出如下:

[+] Writing net.pcap file...
[+] Examining net.pcap file...

###[ myprotocol ]###
  fld1      = 0
  fld2      = 0x3
###[ myprotocol ]###
  fld1      = 1
  fld2      = 0x3
###[ myprotocol ]###
  fld1      = 2
  fld2      = 0x3
...skip...

正如您所看到的,知道协议,因此可以正确解析数据。现在,如果您尝试使用wireshark检查“net.pcap”文件,您将看到以下内容:

enter image description here

不了解您的协议,因此无法正确解析它。

注意:正如您所理解的,即使您在其他设备中发送这些数据包(实际上也是这样,您还必须实现其他一些东西),那么该设备也必须知道您的协议,否则将无法正确解析它。这就是为什么当你试图将数据包从一台计算机发送到另一台计算机时,接收器无法成功解码它们。

答案 1 :(得分:0)

您是否将新图层/协议绑定到上一层/协议?例如。如果OMER层紧跟在Ether层之后, bind_layers(Ether,OMER)

答案 2 :(得分:0)

您已完成自定义图层。但是,您应该记住,在您编写内核级别的网络之前,操作系统将无法识别此自定义层,并且该层必须存在于每个操作系统中。因此,在另一台主机上,您编写了另一个python脚本,该脚本告诉操作系统相应地剖析包含您的自定义层的数据包。编写您自己的嗅探器数据包,然后初始化您的自定义图层类,以便在嗅探时您在剖析数据包时实际使用该类,然后可以在您的自定义层中查看该数据包。 请注意,您需要将图层,新图层与处于泡沫中的图层绑定在一起。看起来好像您已经构造了正确的数据包,但是,当它到达另一个主机时,它仅在您绑定该层后才能解码。仅当您绑定它时,您的操作系统才知道在ip层或udp层等之后解剖包。

也可以在两个众所周知的协议之间挤压您的自定义层,例如带有端口53的udp,默认情况下运行,它将dns绑定到udp端口53。如果您想在udp和dns之间注入新层,请说,您需要首先解除udp和dns的绑定,然后对udp说,我希望遵循我的自定义层而不是dns层。只需使用split_layers解除udp和dns的绑定,然后将您的自定义层绑定到udp,然后将dns绑定到新的自定义层即可。

答案 3 :(得分:0)

将其视为学习外语。假设您的家人只会说英语。

  • 您学习汉语,现在可以用汉语说句子(这是通过在船头中创建图层并构建数据包而完成的操作
  • 您的家人可以听到中文句子(wireshark可以接收数据包)
  • 但是您的家人无法理解这些句子,因为它们仍然只会说英语(wireshark无法解剖数据包,因为它不知道您的协议)
  • 如果您完全希望您的家人在说中文时理解您,那么您就必须教他们(在wireshark中实现解剖器)

希望很清楚:-)