【问题标题】:Unpacking TCP-fragment give incorrect result解包 TCP 片段给出不正确的结果
【发布时间】:2018-08-24 08:08:13
【问题描述】:

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

是不是跟路由器有关系?
我也知道在 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结果:

提前感谢您提供的任何帮助。

【问题讨论】:

    标签: python tcp packet-sniffers unpack


    【解决方案1】:

    好的,所以我设法解决了它。这是一个非常愚蠢的错误。我在解压 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:]
        }
    

    【讨论】:

      猜你喜欢
      • 2012-08-27
      • 2017-12-14
      • 2019-03-12
      • 1970-01-01
      • 1970-01-01
      • 2023-03-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多