Scapy 设置类属性的问题

1 投票
2 回答
726 浏览
提问于 2025-04-16 21:50

我正在使用scapy,并且有一个与scapy和python相关的问题。我尝试用变量来作为scapy的字段名称。下面是我尝试做的代码片段(但它没有成功):

class Test(Packet):
    name = "Test23"
    def __init__(self,foo=None):
        self.foo=foo

    fields_desc = [
                BitField(self.foo, 0x0, 4),
                BitField("bar", 0x3, 4)
                ]

现在我想问题可能出在fields_desc是一个类属性,而不是类变量。那么,我该如何实现我想要的呢?(在运行时或类初始化时设置self.foo的名称?)

我非常感谢任何帮助。 祝好

编辑:加一个计数器就足够了。我尝试过:

class Counter:
     count = 0    
     def __init__(self):
         self.__class__.count += 1 
     foo = [ 
            "lala"+str(count)
            ]   
     print foo 


a=Counter()
a.count
print a.foo
b=Counter()
b.count
print b.foo

但似乎不行。如果你能给我指个正确的方向就太好了,我有点迷茫。

2 个回答

1

我猜你想做的是根据你用'getfield'解析的原始数据来改变第一个BitField的名字?这有点难判断……

不过,从函数 pre_dissect 来看,你可以查看原始数据,并根据需要将字段添加到self.fields_desc中。使用pre_dissect时,确保在函数结束时返回未修改的原始数据包。

根据我的经验,这种做法很少是正确的,通常使用ConditionalField和类重载在长远来看效果会更好。

祝你好运

1

认为类的属性是在类的构造函数运行之前就被初始化了,所以在创建fields_desc的时候,self.foo还没有被赋值。你可以试着把fields_desc声明为一个空数组,然后在你的__init__函数里面把BitField对象添加到这个数组里。

我不太清楚你继承的Packet类是怎么工作的,但你可能也想看看这个super()函数

编辑:也许你在寻找这样的东西?

class Counter:
    i = 0
    foo = []
    def count(self):
        self.__class__.i += 1
        self.__class__.foo.append(['lala' + str(self.__class__.i)])

a = Counter()
a.count()
print Counter().foo
b = Counter()
b.count()
print Counter().foo

输出

[['lala1']]
[['lala1'], ['lala2']]

关于类变量的更多信息可以在这里找到

撰写回答