我正在尝试向 Scapy 添加一个新的自定义协议层,并且遇到了一些字段问题。
我添加了一个 X6BytesField 字段,如下所示:
class X6BytesField(XByteField):
def __init__(self, name, default):
Field.__init__(self, name, default, "!Q")
def addfield(self, pkt, s, val):
return s+struct.pack(self.fmt, self.i2m(pkt,val))[2:8]
def getfield(self, pkt, s):
return s[2:], self.m2i(pkt, struct.unpack(self.fmt, "\x00\x00"+s[2:])[0])
这似乎工作正常(hexdump 显示 6 个字节至少出现在正确的位置)。现在我需要添加一个 32 字节的字段来存储数据包的 sha256 哈希。用来存储它的最佳字段是什么?我更愿意将它显示为字节列表,但我还没有找到一种方法来做到这一点。我想知道是否可以使用 Python 字节数组或 StrFixedLenField?
我遇到的另一个问题是尝试自动计算数据包上的 sha(使用 Python hashlib.sha256())。我在协议类中添加了以下方法:
def post_build(self, p, pay):
if self.sha_hash is None:
self.sha_hash=calculate_sha(p)
l = len(p) - len(self.sha_hash)
p = p[:l]+struct.pack("!s", self.sha_hash)
return p + pay
在哪里,
def calculate_sha(data):
return sha256(data).hexdigest()
但是,当我使用 str() 创建数据包时,似乎没有计算哈希值(显然在这里遗漏了一些东西:()。
我希望有一些 Scapy 大师可以让我走上正确的轨道:)