簡體   English   中英

根據Scapy上的ICMPv6類型使IPv6更新plen字段

[英]Making IPv6 update plen field according to ICMPv6 type on Scapy

在我的程序中,我使用scapy創建/解析數據包,但實際程序是C ++。 由於用戶只需要與所有ICMPv6數據包相同的ICMPv6的前幾個字段,因此我在C ++端創建了一個ICMPv6類(使用ICMPv6Unknown)。

我的問題是,盡管它們可以與ICMPv6的字段配合使用,但是IPv6中的plen字段無法根據我放入ICMPv6標頭中的類型正確更新。

我不確定我可以在IPv6類中進行什么編輯以使其根據下一個ICMPv6類型更改字段,現在可以:

    def post_build(self, p, pay):
    p += pay
    if self.plen is None:
        l = len(p) - 40
        p = p[:4]+struct.pack("!H", l)+p[6:]
    return p

失敗是因為ICMPv6Unknown返回len的4,所以它不會根據我的type字段更改大小。 我知道以太會根據字段更改類型,但是我無法為ICMPv6復制它

為了解決這個問題,我在這種情況下向IPv6添加了一個if,它不使用len(p),方式如下:

    def post_build(self, p, pay):
    p += pay
    if self.plen is None:
        if self.nh == 58:
            icmp_type = ord(pay[0])
            l = icmpv6_len(icmp_type)
            print "len is: " + str(l)
    else:
    l = len(p) - 40
        p = p[:4]+struct.pack("!H", l)+p[6:]
    return p

其中icmpv6_len靜態返回類型的長度。

我通過重載build_payload()來解決此問題:

def build_payload(self):
        if isinstance(self.payload, ICMPv6Unknown): 
            icmp_type = ord(str(self.payload)[0]) 
            icmp_class = eval(icmp6typescls[icmp_type]) 
            if self.payload.haslayer(Raw): #create actual class from the first 2 fields of the ICMPv6Unknown (type and code, ignoring the checksum) and add the other layers if there are any
                self.payload = icmp_class(str(self.payload[0])[0:2]) / self.payload[1:]
        else:
                self.payload = icmp_class(str(self.payload[0])[0:2])
        return super(IPv6 ,self).build_payload()

基本上,這會將ICMPv6Unknown層中的前兩個字段重新解析為所需的層。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM