Scapy UDP十六进制数据收发转义处理及解码问题求助
问题
使用Scapy发送UDP十六进制数据后,解码时遇到格式问题:发送的原始十六进制字符串为000ad74340b81e4941002900020202000200,但接收端获取到的负载是带双反斜杠转义的字符串"\\x00\\n\\xd7C@\\xb8\\x1eIA\\x00)\\x00\\x02\\x02\\x02\\x00\\x02\\x00",无法直接转回原始十六进制格式。
发送端代码如下:
from scapy.all import * from scapy.layers.l2 import Ether from scapy.layers.inet import IP, UDP test_data = ["000ad74340b81e4941002900020202000200"] # 实际从文件读取 source_ip = "192.168.1.12" destination_ip = "192.168.1.4" source_mac = "70:85:c2:f3:18:8e" destination_mac = "80:ce:62:f2:94:22" source_port = 5005 destination_port = 5005 tmp = [] byte_str = [(test_data[0][i:i + 2]) for i in range(0, len(test_data[0]), 2)] for i in range(len(byte_str)): tmp.append(int(f"0x{byte_str[i]}", 16)) data_to_send = bytearray(tmp) print("b'" + ''.join(f'\\x{c:02x}' for c in data_to_send) + "'") pkt = Ether(dst=destination_mac, src=source_mac)/\ IP(dst=destination_ip, src=source_ip, flags=2)/\ UDP(dport=destination_port, sport=source_port)/data_to_send del pkt[IP].chksum del pkt[UDP].chksum pkt.show2() sendp(pkt)
发送的数据包负载显示为:
###[ Raw ]### load = '\x00\n\\xd7C@\\xb8\x1eIA\x00)\x00\x02\x02\x02\x00\x02\x00'
需求是将接收的带双反斜杠的字符串转换为正确的字节串b'\x00\n\xd7C@\xb8\x1eIA\x00)\x00\x02\x02\x02\x00\x02\x00',最终还原为原始十六进制字符串。
解决方案
方法1:使用ast.literal_eval解析转义字符串
Python的ast模块可以安全解析字符串形式的字节串,自动处理双反斜杠转义:
import ast # 接收的带双反斜杠的字符串 received_str = "\\x00\\n\\xd7C@\\xb8\\x1eIA\\x00)\\x00\\x02\\x02\\x02\\x00\\x02\\x00" # 包装成字节串字面量格式 byte_literal = f"b'{received_str}'" # 解析得到正确的字节串 correct_bytes = ast.literal_eval(byte_literal) # 还原为原始十六进制字符串 hex_str = ''.join(f'{b:02x}' for b in correct_bytes) print(hex_str) # 输出:000ad74340b81e4941002900020202000200
方法2:直接从Scapy数据包读取原始字节
如果接收端用Scapy抓包,不要读取负载的字符串表示,直接获取Raw层的load属性(本身就是字节类型):
# 假设接收到的数据包为pkt received_data = pkt[Raw].load # 直接转换为十六进制字符串 hex_str = received_data.hex() print(hex_str) # 输出原始十六进制字符串
方法3:手动处理转义字符(不推荐,易出错)
若必须处理字符串形式的转义内容,可通过编码转换实现:
received_str = "\\x00\\n\\xd7C@\\xb8\\x1eIA\\x00)\\x00\\x02\\x02\\x02\\x00\\x02\\x00" # 先解码unicode转义,再编码为字节 correct_bytes = received_str.encode('utf-8').decode('unicode_escape').encode('latin-1')
内容的提问来源于stack exchange,提问作者B3st0fth3w0rst
相关产品推荐
相关产品推荐

