如何在Scapy中从PCAP加载的UDP(ISAKMP)载荷中查找十六进制序列?
解决UDP载荷(ISAKMP)中查找特定十六进制序列的问题
这个问题我碰到过!其实不用纠结show()/show2()或者hexdump的格式化输出,直接拿UDP载荷的原始字节数据转成连续十六进制字符串就搞定了,给你两种靠谱的方法:
方法一:直接提取原始载荷并转换(最优解)
这是最简洁高效的方式,直接获取ISAKMP载荷的bytes数据,再转成无空格的连续十六进制字符串,就能直接用字符串查找操作定位目标序列了:
from scapy.all import rdpcap import binascii # 加载目标PCAP文件 packets = rdpcap("your_capture.pcap") # 遍历数据包,筛选出含UDP且带有ISAKMP载荷的包 for pkt in packets: if UDP in pkt and pkt[UDP].payload: # 获取ISAKMP载荷的原始字节数据 isakmp_raw = bytes(pkt[UDP].payload) # 转换为连续的十六进制字符串(小写,如需大写可加.upper()) hex_sequence = binascii.hexlify(isakmp_raw).decode("utf-8") # 查找你需要的特定十六进制序列,比如"a1b2c3" target_hex = "a1b2c3" if target_hex in hex_sequence: print(f"找到目标序列!数据包时间戳:{pkt.time}") print(f"完整十六进制序列:{hex_sequence}")
为什么这个方法管用?
show()/show2()返回的是格式化后的可读文本,不是原始字节数据,自然没法直接查找;binascii.hexlify()会把字节直接转成十六进制编码的bytes,再用decode()转成普通字符串,得到的就是无空格的连续十六进制序列,完美匹配你的查找需求。
方法二:从hexdump输出中提取中间列(备选方案)
如果你非要从hexdump的输出里提取中间列的十六进制字符串,也可以通过字符串分割处理实现:
from scapy.all import rdpcap, hexdump packets = rdpcap("your_capture.pcap") for pkt in packets: if UDP in pkt and pkt[UDP].payload: # 获取hexdump的输出文本(dump=True让它返回字符串而不是直接打印) dump_text = hexdump(pkt[UDP].payload, dump=True) # 按行分割并过滤空行 dump_lines = [line.strip() for line in dump_text.split("\n") if line.strip()] # 提取每行的中间十六进制部分并拼接 hex_parts = [] for line in dump_lines: # 分割成「地址、十六进制、ASCII」三部分 line_segments = line.split(" ", 2) if len(line_segments) >= 2: # 去掉十六进制部分的空格,加入列表 clean_hex = line_segments[1].replace(" ", "") hex_parts.append(clean_hex) # 拼接成连续的十六进制字符串 full_hex_str = "".join(hex_parts) # 执行查找操作 if "a1b2c3" in full_hex_str: print("找到目标序列!") print(full_hex_str)
不过这种方法需要处理格式化输出的格式,不如第一种方法直接高效,优先推荐方法一。
内容的提问来源于stack exchange,提问作者Owensteam
相关产品推荐
相关产品推荐

