为什么 Scapy 会更改最后一个字节?

问题描述 投票:0回答:1

这是一个小程序,用于嗅探 TCP 目标端口 5555 的流量。TCP 数据包含一个二进制文件。

import scapy.all as scapy
from scapy.layers.inet import IP, TCP, Ether, NoPayload

ba = bytearray()


def packet_handler(packet):
    if packet.haslayer(TCP):
        tcp_packet = packet[TCP]
        if tcp_packet.sport == 5555:
            # print(tcp_packet.flags)
            if tcp_packet.flags == 'PA':
                data = tcp_packet.payload
                ba.extend(bytes(data))


pkts = scapy.sniff(filter="tcp",  # and src port 5555
                   timeout=5,
                   prn=packet_handler,
                   iface="Software Loopback Interface 1")


with open('test.bin', 'wb') as file:
    file.write(bytes(ba))

但是每次,最后几个段都包含几个(0-4)坏字节。

source file

wireshark

terminal

一开始我以为是bytes()的问题, 但在上图中您可以看到 scapy 原始 TCP 数据的输出。

python tcp scapy
1个回答
0
投票

为了更稳健地处理这种情况,您应该重建 TCP 流,然后提取数据。

TCP 数据包可能会被分段,您可能无法在单个数据包中收到完整的文件。不完整的片段可能会导致最后几个字节不正确。

放在 with 语句之前:

# Extracting only the data from the TCP payload
data = bytes(ba).split(b'\r\n\r\n')[1]

脚本假设您的二进制文件是在双 CRLF (b' ') 在 TCP 有效负载中。根据数据的实际结构进行相应调整。

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