在Python中提取tcp套接字中接收到的数据

2024-05-14 14:28:45 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个客户发送了一个包,其中有一个用Scapy创建的自定义层“Reservation”

客户端.py

#!/usr/bin/env python

import socket
from scapy.all import *


class Reservation(Packet):
    name = "ReservationPacket"
    fields_desc=[ ShortField("id", 0),
            BitField("type",None, 0),
            X3BytesField("update", 0),
            ByteField("rssiap", 0)]


pkt = IP(len=16384, src='192.168.240.5', dst='192.168.240.198',
id=RandShort(), ttl=2)/TCP(sport=5005,
dport=5005, flags="S", window=200,
options=[('MSS', 1460), ('WScale',    2)])/Reservation(id=11)/"HELLO"

spkt = bytes(pkt)
spkt += '\x00'*20

s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_RAW)
s.setsockopt(socket.SOL_IP, socket.IP_HDRINCL, 1)

s.sendto(spkt, ('192.168.240.198', 5005))

s.close()

数据包已正确发送。在

如何访问数据包的特定字段?如何解释接收到的数据?我想用类似于卫星识别号以检索该字段的值。有可能吗?在

编辑 我已经到了这个地步: 我正在通过tcp套接字发送pcaket。其结构如下:

^{pr2}$

其中ReservationPacket是自定义层。 数据包被接收,并且

    data = conn.recv(BUFFER_SIZE)
    if not data: break
          print "received data:", data
          by = str.encode(data)             
          pkt_hex = by.encode('hex')
          hexdump(by)
          container = IP(data)
          container.show()

我填充集装箱包装,其定义为

container = IP()/TCP()/Reservation()

的输出

container.show()

###[ IP ]###
version   = 4L
ihl       = 5L
tos       = 0x0
len       = 16384
id        = 56856
flags     = 
frag      = 0L
ttl       = 2
proto     = tcp
chksum    = 0x3987
src       = 192.168.240.5
dst       = 192.168.240.1
\options   \
###[ TCP ]###
 sport     = 5005
 dport     = 5005
 seq       = 0
 ack       = 0
 dataofs   = 7L
 reserved  = 0L
 flags     = S
 window    = 200
 chksum    = 0xd962
 urgptr    = 0
 options   = [('MSS', 1460), ('WScale', 2), ('EOL', None)]
###[ Raw ]###
    load      = '\x00\t\x00\x00\x00\x00PROVA'

显然保留层没有被识别和解释为原始的。我怎样才能建立与传输的相同的数据包?在


Tags: importipiddatabycontainersocket数据包
1条回答
网友
1楼 · 发布于 2024-05-14 14:28:45

您可以使用s=str(packet)来序列化scapy 2中的数据包,并使用packet=Layer(s)强制将bytestream反序列化为Layer。在

在您的情况下:

rdata = sock.recv(8192)
layer = Reservation(rdata)
layer.show()
print layer.id

请注意,您还可以使用bind_layers()绑定scapys autodissect/payload猜测层,使其与sniff()或tcp/Reservation bytestreams(具有保留有效负载的tcp包)分离。以下行绑定TCP.dport=5005去预定。在

^{pr2}$

更新:具体回答您的问题。在

您不必关心IP/TCP层,因为这一切都是在套接字中处理的。socket.recv接收到的数据是TCP的有效负载,因此您所要做的就是强制scapy将接收到的{}反序列化为Reservation。在

TCP套接字:

data=[]
while True:
    chunk = conn.recv(BUFFER_SIZE)
    if not chunk: 
        break
    print "received data:", chunk
    data.append(chunk)
layer = Reservation(''.join(data))
layer.show()
print layer.id

此外,您可以指示scapy尝试根据一个简单的规则自动剖析您的层,例如TCP.dport==5005,并调用bind_layers()。这样,它也可以与sniff一起工作,或者在您收到完整的IP/TCP/Reservation/Raw字节流时使用。在

原始套接字:

bind_layers(TCP, Reservation, dport=5005) # bind Reservation as nextlayer to TCP.dport=5005
# ...
data, peer = s.recvfrom(BUFFER_SIZE)
print "received data:", peer, repr(data)
layer = IP(data)                # dissection automagic based on rules registered with bind_layers
layer.show()
print layer[Reservation].id

相关问题 更多 >

    热门问题