我有一个应用程序通过TCP连接将数据发送到生产服务器。我需要嗅探TCP连接的内容并将其重新发送到调试服务器。
我对此非常接近:
from scapy.all import *
packets = 0
def dup_pkt(pkt):
global packets
read = raw(pkt[TCP].payload)
print(str(packets))
s.sendall(read)
print("connecting")
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(("x.x.x.x", 12345))
print("connected")
print("sniffing")
pkts = sniff(prn=dup_pkt, filter="tcp dst port 12345 and not host x.x.x.x") # don't sniff the packets we're resending
问题是数据包在前两个标头中似乎缺少数据。我已将调试服务器设置为将每个收到的数据包保存到文件中,并将应用程序设置为直接连接到调试服务器,以将已知良好的数据包数据与嗅探器发送的数据进行比较。在第一个数据包中,前1546/2079字节是好的,但在此之后,每个字节为零而不是正确的数据。在第二个数据包中,前11个字节丢失,但其余的都很好。
有趣的是,在最初的两个大设置数据包之后,其余的TCP数据包似乎被正确地嗅探 - 也许是因为它们通常更简单,每个都少于40个字节。
有更好的方法来读取数据包数据吗?我错过了什么吗?不幸的是我没有访问应用程序的源代码,因此我无法判断它是否正在对我遇到问题的两个大数据包执行任何特殊操作。
答案 0 :(得分:0)
第一个数据包的问题可能表明您的操作系统的TCP堆栈w.r.t中存在问题。片段重组。
在任何情况下,请尝试使用其他工具(如tcpdump
或wireshark
)来捕获数据包。如果他们遇到同样的问题,问题在于您的操作系统。如果没有,则可能是scapy
的错误或配置问题。
答案 1 :(得分:0)
这也可能意味着您的IP数据包已碎片化。 Scapy不会自动对数据包进行碎片整理,但会将其分段。
您需要在收到的数据包列表中使用defrag
函数或defragment
(请查看帮助(碎片整理))。
也许你正在检查的数据包是一个片段