Scapy提取数据包原始字节转纯十六进制的方法咨询
解决Scapy原始字节转纯十六进制&chexdump截断的问题
我来帮你搞定这两个Scapy使用中的小问题,都是大家常遇到的情况:
一、获取纯十六进制,避免ASCII字符干扰
你看到的b"\x17\x03\x03\x00\xa3\x00\x00\x00\x00\x00\x00\x00\xd6tK\xf8\xc1itQ\xa0;"这种格式,是Python对bytes对象的默认显示方式——它会把可打印的ASCII字符直接显示出来,确实会干扰解析。有两个简单的解决方法:
方法1:用Python原生的hex()方法
Scapy提取的原始字节本质就是Python的bytes对象,直接调用它的hex()方法就能得到纯十六进制字符串,完全不会混入ASCII:
# 假设你已经拿到了原始字节数据 raw_bytes = b"\x17\x03\x03\x00\xa3\x00\x00\x00\x00\x00\x00\x00\xd6tK\xf8\xc1itQ\xa0;" pure_hex = raw_bytes.hex() print(pure_hex)
输出会是:17030300a300000000000000d6744bf8c1697451a03b,完美符合你的需求。
方法2:Scapy内置的bytes2hex()函数
如果你更习惯用Scapy自带的工具,也可以用bytes2hex()函数,效果完全一样:
from scapy.utils import bytes2hex pure_hex = bytes2hex(raw_bytes) print(pure_hex)
二、解决chexdump()只输出部分内容的问题
chexdump()默认会对较长的数据包做截断处理,这是Scapy为了避免输出刷屏的默认设置。要显示完整内容,有两种办法:
方法1:调用时指定length参数
直接把length设置为数据包的总长度就行:
chexdump(raw_bytes, length=len(raw_bytes)) # 如果是对整个Scapy数据包对象操作: # packet = sniff(count=1)[0] # chexdump(packet, length=len(packet))
方法2:全局关闭输出截断
要是你不想每次都加参数,可以修改Scapy的全局配置,让所有输出都不截断:
from scapy.all import conf conf.mesg_trunc = 0 # 0表示不截断任何内容
之后再调用chexdump()就会默认显示完整的数据包内容了。
内容的提问来源于stack exchange,提问作者Paul3
相关产品推荐
相关产品推荐

