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

问题描述 投票:2回答:4

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

class OMER(Packet):
    name = "OMER"
    fields_desc = [StrLenField("Omer", "", None)]
python python-3.x layer scapy network-protocols
4个回答
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

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

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


0
投票

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


0
投票

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

另外在两个众所周知的协议之间挤压你的自定义层,例如udp和端口53,默认操作将dns绑定到udp端口53.如果你想在udp和dns之间注入你的新图层,你需要首先取消绑定udp和dns,然后对udp说我希望我的自定义层被跟踪而不是dns层。只需使用split_layers取消绑定udp和dns,然后将自定义图层绑定到udp,并将dns绑定到新的自定义图层。


0
投票

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

  • 你学习中文,现在可以用中文说句子(这就是你用scapy创建图层和构建数据包所做的事情)
  • 你的家人可以听到中文句子(wireshark可以收到数据包)
  • 但你的家人无法理解句子,因为他们仍然会说英语(wireshark无法解析数据包,因为它不知道你的协议)
  • 如果您绝对希望您的家人在讲中文时了解您,那么您必须教他们(在wireshark中实施解剖器)

希望很清楚:-)

© www.soinside.com 2019 - 2024. All rights reserved.