Protocol 43200解包后仅显基础字段,如何修改Python抓包代码?
解决Python抓包中协议43200字段无法显示的问题
你的代码仅处理了ICMP(1)、TCP(6)、UDP(17)三种常见协议,对于协议号43200这类自定义/少见协议没有对应的解析逻辑,因此只能显示IP层基础信息。需要做以下几处修改:
1. 正确获取IPv4头部的协议号
首先要确保从ipv4_packet的返回值中拿到协议号,否则后续的协议分支判断根本不会触发。假设你的ipv4_packet返回的是字典,补充协议号的赋值:
ipv4_info = ipv4_packet(data) proto = ipv4_info['proto'] # 根据实际返回结构调整,比如如果是对象就用ipv4_info.proto
同时要保证ipv4_packet函数正确解析协议字段(IPv4头部第10字节为协议号),示例实现如下:
def ipv4_packet(data): version_header_len = data[0] version = version_header_len >> 4 header_len = (version_header_len & 0x0F) * 4 ttl = data[8] proto = data[9] # 提取协议号 src_ip = socket.inet_ntoa(data[12:16]) dest_ip = socket.inet_ntoa(data[16:20]) payload = data[header_len:] return { 'version': version, 'header_length': header_len, 'ttl': ttl, 'proto': proto, 'src_ip': src_ip, 'dest_ip': dest_ip, 'payload': payload }
2. 添加协议43200的专属解析函数
根据协议43200的实际报文结构,编写对应的解析函数。比如假设该协议头部包含2字节版本号、4字节会话ID,剩余为负载:
def parse_proto_43200(data): # 按协议实际结构解析,以下为示例,需根据真实协议调整 version = int.from_bytes(data[:2], byteorder='big') session_id = int.from_bytes(data[2:6], byteorder='big') payload = data[6:] return ( f"{TAB_2}Version: {version}\n" f"{TAB_2}Session ID: {session_id}\n" f"{TAB_2}Payload (hex): {payload.hex()}" )
然后在主循环的协议判断分支中添加:
elif proto == 43200: proto_details = parse_proto_43200(ipv4_info['payload']) print(TAB_1 + 'Protocol 43200 Packet:') print(proto_details)
3. 增加未知协议的通用处理分支
为了覆盖所有未定义的协议,添加默认分支显示原始负载数据,方便后续排查:
else: print(TAB_1 + f'Unrecognized Protocol ({proto}):') print(TAB_2 + f'Payload length: {len(ipv4_info["payload"])} bytes') print(TAB_2 + f'Payload (hex): {ipv4_info["payload"].hex()}')
完成以上修改后,协议43200的数据包就能按照你定义的逻辑显示具体字段,其他未知协议也能输出负载的基础信息。
内容的提问来源于stack exchange,提问作者Taher Jhabuawala
相关产品推荐
相关产品推荐

