拆封TCP片段会产生错误的结果

时间:2018-08-23 22:52:22

标签: python tcp packet-sniffers unpack

我的数据包嗅探器有问题。在我的嗅探器中,目标端口和源端口似乎是错误的。在wireshark中,端口与我的嗅探器完全不同。没有结果包含TLS所需的端口443。 (整个tcp片段可能是错误的。)

与路由器有关吗?
我也知道在Windows中进行嗅探存在一些问题。还是我的拆箱代码只是错误的?我是否在ip-header和tcp-fragment之间缺少一些偏移量?

套接字代码:https://pastebin.com/tMuHgz0R

解包代码:https://pastebin.com/9ZVfYNEE(完整代码)

  # Unpack tcp fragment
    def tcp_fragment(raw_data):
        tcp_header = struct.unpack('!HHLLBBHHH', raw_data[:20])
        source_port = tcp_header[0]
        destionation_port = tcp_header[1]
        sequence_number = tcp_header[2]
        acknowledgement_number = tcp_header[3]
        offset = tcp_header[4] >> 4
        reserved = tcp_header[4] & 0xF
        flags = get_tcp_flags(tcp_header[5])
        window = tcp_header[6]
        checksum = tcp_header[7]
        pointer = tcp_header[8]

        return {
            TCP_SOURCE_PORT: source_port,
            TCP_DESTINATION_PORT: destionation_port,
            TCP_SEQUENCE_NUMBER: sequence_number,
            TCP_ACKNOWLEDGEMENT_NUMBER: acknowledgement_number,
            TCP_OFFSET: offset,
            TCP_RESERVED: reserved,
            TCP_FLAGS: flags,
            TCP_WINDOW: window,
            TCP_CHECKSUM: checksum,
            TCP_POINTER: pointer,
            TCP_PAYLOAD_DATA: raw_data[20:]
        }

TCP标头结果:https://pastebin.com/7xhaEGer

相同数据包的Wireshark结果: wshark

在此先感谢您提供的帮助。

1 个答案:

答案 0 :(得分:0)

好的,所以我设法解决了。这是一个非常愚蠢的错误。我在拆包tcp时忘记考虑ip-header位。

固定的代码如下所示:

# Unpack tcp & ip
def ip_tcp(raw_data):
    iph = ip_header(raw_data)
    iph_length = iph[IP_IHL] * 4

    tcp = tcp_fragment(raw_data, iph_length)

    return (iph, tcp)


# Unpack tcp fragment
def tcp_fragment(raw_data, iph_length):
    tcp_header = struct.unpack('!HHLLBBHHH', raw_data[iph_length:iph_length + 20])
    source_port = tcp_header[0]
    destionation_port = tcp_header[1]
    sequence_number = tcp_header[2]
    acknowledgement_number = tcp_header[3]
    offset = tcp_header[4] >> 4
    reserved = tcp_header[4] & 0xF
    flags = get_tcp_flags(tcp_header[5])
    window = tcp_header[6]
    checksum = tcp_header[7]
    pointer = tcp_header[8]

    return {
        TCP_SOURCE_PORT: source_port,
        TCP_DESTINATION_PORT: destionation_port,
        TCP_SEQUENCE_NUMBER: sequence_number,
        TCP_ACKNOWLEDGEMENT_NUMBER: acknowledgement_number,
        TCP_OFFSET: offset,
        TCP_RESERVED: reserved,
        TCP_FLAGS: flags,
        TCP_WINDOW: window,
        TCP_CHECKSUM: checksum,
        TCP_POINTER: pointer,
        TCP_PAYLOAD_DATA: raw_data[iph_length + 20:]
    }