2

我正在尝试向 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 大师可以让我走上正确的轨道:)

4

0 回答 0