python中的固定帧验证条件
我认为大多数python用户都可以回答这个问题,而且在知识方面是相当普遍的,但对我来说,我无法理解 代码如下:python中的固定帧验证条件,python,validation,networking,scapy,Python,Validation,Networking,Scapy,我认为大多数python用户都可以回答这个问题,而且在知识方面是相当普遍的,但对我来说,我无法理解 代码如下: if ssid in net and p.addr2 not in clients: count +=1 get_oui(p.addr2) net.append(ssid) checkmac(p.addr2)
if ssid in net and p.addr2 not in clients:
count +=1
get_oui(p.addr2)
net.append(ssid)
checkmac(p.addr2)
mps+=1
print str(count)+'>',p.addr2+' ('+G+macf+W+') <--Probing--> '+O+ssid+W+' < '+Y+'MPS'+W
if args.log:
wr_log(p.addr2,ssid,macf)
elif ssid not in net and p.addr2 in clients:
count +=1
net.append(ssid)
get_oui(p.addr2)
clients.append(p.addr2)
mpm+=1
print str(count)+'>',p.addr2+' ('+G+macf+W+') <--Probing--> '+O+ssid+W+' < '+Y+'MPM'+W
if args.log:
wr_log(p.addr2,ssid,macf)
elif ssid not in net and p.addr2 not in clients:
count +=1
net.append(ssid)
get_oui(p.addr2)
checkmac(p.addr2)
print str(count)+'>',p.addr2+' ('+G+macf+W+') <--Probing--> '+O+ssid+W
if args.log:
wr_log(p.addr2,ssid,macf)
对于第一种情况,第三个条件成立
对于第二种情况,第二个条件成立
对于第三个场景,第一个条件成立
对于第四个条件,所有条件都不成立,对吗?因为当使用“not in”和“in”操作数检查列表时,它会发现客户机和ssid都已经存在,因此会丢弃数据包,而这是一个有效的条件,意味着基本上有两个客户机正在寻找相同的ssid,我希望打印它。但如果我这样做:
elif ssid in net and p.addr2 in clients:
get_oui(p.addr2)
checkmac(p.addr2)
print str(count)+'>',p.addr2+' ('+G+macf+W+') <--Probing--> '+O+ssid+W
elif ssid在网络中,p.addr2在客户端中:
获取信息(p.addr2)
checkmac(p.addr2)
打印str(count)+'>',p.addr2+'('+G+macf+W++')'+O+ssid+W
重复数据包开始打印出来,因为每个客户端发送多个具有相同数据的数据包,而这种情况可能会出现。我如何实现一个条件,以便在客户端[]中的多个客户端正在网络[]中查找多个ssid的情况下进行验证
根据cmidi的建议:我试着使用字典,并试图以这种方式访问它,它仍然会给我重复
if count > 0:
for k,v in obs.items():
if k and v != p.addr2 and ssid:
count +=1
get_oui(p.addr2)
net.append(ssid)
checkmac(p.addr2)
obs[p.addr2] = ssid
mps+=1
print str(count)+'>',p.addr2+' ('+G+macf+W+') <--Probing--> '+O+ssid+W+' < '+Y+'MPS'+W
if args.log:
wr_log(p.addr2,ssid,macf)
else:
count +=1
get_oui(p.addr2)
net.append(ssid)
checkmac(p.addr2)
obs[p.addr2] = ssid
print str(count)+'>',p.addr2+' ('+G+macf+W+') <--Probing--> '+O+ssid+W+' < '+Y+'MPS'+W
if args.log:
wr_log(p.addr2,ssid,macf)
如果计数>0:
对于obs.items()中的k,v:
如果k和v!=p、 addr2和ssid:
计数+=1
获取信息(p.addr2)
net.append(ssid)
checkmac(p.addr2)
obs[p.addr2]=ssid
mps+=1
打印str(count)+'>',p.addr2++'('+G+macf+W++')'+O+ssid+W++'<'+Y+'MPS'+W
如果args.log:
wr_日志(p.addr2、ssid、macf)
其他:
计数+=1
获取信息(p.addr2)
net.append(ssid)
checkmac(p.addr2)
obs[p.addr2]=ssid
打印str(count)+'>',p.addr2++'('+G+macf+W++')'+O+ssid+W++'<'+Y+'MPS'+W
如果args.log:
wr_日志(p.addr2、ssid、macf)
这是怎么回事
@lmz Ok所以根据要求,这就是一切工作的方式,或者说应该工作的方式:
对于我扫描的每个数据包,我获得我的SSID、MAC和制造商值。我想把这个数据保存在一起,只保存SSID和MAC,因为作为一对,它们在丢弃其他重复数据包后是唯一的。对于第一个数据包,我在不进行任何检查的情况下打印这些值,我们得到了第一组值,然后从第二个数据包开始检查是否存在重复项,并且某些条件变为活动状态。理想情况下,为了尽可能减少代码,这里应该直接检查从列表中的第一个数据包开始捕获的SSID:MAC对dict、ordereddict等。在这里,除了排序之外,他们的代码需要能够扫描所有以前的对,删除列表中与传入SSID:MAC不匹配的每一对dict。如果没有找到重复项,新的SSID:MAC对将添加到列表、dict等中。否则,如果发现重复项,循环将中断,我们将移动到第三个数据包,依此类推 我给出了一个字典示例,这样您也可以存储相关数据。如果您想要订购,只需将
dict
更改为collections.orderedict
,如图所示。既然你说它是重复输入和唯一输出,我就假设MPM
和MPS
位是无用的。如果需要,请告诉我
示例(假设您有字符串SSID&MAC):
关键是要理解,如果
ssid
和mac
都是字符串,那么元组(ssid,mac)
就是字典的一个字符串,因此不需要有多个列表。使用哈希表或字典,从crc或ssid的某个哈希函数创建密钥+mac@cmidi我不知道如何实现它,正如您从我的帖子中猜到的,我并没有编写代码的真正经验。你能给我举个例子吗?我会在谷歌上查一下,但是当我们讨论这个问题时,一个直接的例子会非常有帮助。当然,只要我接近我的目标workstation@cmidi阅读我上面的编辑,我试着这样使用字典。好吧,基本上给出了一个可能重复的列表(SSID,MAC),只返回一个唯一的列表(SSID,MAC)?我不知道你所说的“扫描所有以前的对,删除列表中的每一对,dict与传入的SSID:MAC不匹配”是什么意思。如果你这样做了,你不会得到重复的结果吗?集合是否按顺序存储数据,即:按我添加它们的相同顺序?如果是这样的话,我就不能只存储我在“seed_SSID_macs”中得到的SSID和MAC,然后执行:如果(SSID,MAC)不在seed_SSID_macs中:打印“我需要什么”??如何将变量ssid和mac中的值存储到“数据包”中?数据集没有顺序。有些字典的顺序是:。seen_ssid_macs中的if(ssid,mac)的要点是,它将(ssid,mac)
视为一个单元,因此,如果ssid已被看到,但之前具有不同的mac,则它将返回False
。我将尝试使用OrderedDict进行编辑。我查看dicts的目的是,我可以生成像['A':'S1,S2,S3','B':'S2,S3']这样的dict值,然后每次我从设备获得新数据包时都可以搜索它们,以查看是否存在具有特定已知SSID值的特定已知MAC,以及是否未找到此类MAC:SSID付费,即使在搜索了它自己的已知值(如果有的话)之后,也要打印它并添加到dict中。您想让我从脚本中发布一个更大的片段来显示如何获取ssid和mac值吗?您需要订购吗?我不认为显示ssid和mac是如何获得的是必要的,但是如果您显示了您真正想要做的事情,那就太好了
if count > 0:
for k,v in obs.items():
if k and v != p.addr2 and ssid:
count +=1
get_oui(p.addr2)
net.append(ssid)
checkmac(p.addr2)
obs[p.addr2] = ssid
mps+=1
print str(count)+'>',p.addr2+' ('+G+macf+W+') <--Probing--> '+O+ssid+W+' < '+Y+'MPS'+W
if args.log:
wr_log(p.addr2,ssid,macf)
else:
count +=1
get_oui(p.addr2)
net.append(ssid)
checkmac(p.addr2)
obs[p.addr2] = ssid
print str(count)+'>',p.addr2+' ('+G+macf+W+') <--Probing--> '+O+ssid+W+' < '+Y+'MPS'+W
if args.log:
wr_log(p.addr2,ssid,macf)
from collections import OrderedDict
packets = [
('S1', 'A'), ('S2', 'A'), ('S1', 'B'),
('S2', 'B'), ('S1', 'A'), ('S1', 'B')
]
# seen_packets = OrderedDict() # if order is required
seen_packets = dict()
for ssid, mac in packets:
print "Considering SSID ", ssid, " and MAC ", mac
ssid_mac = (ssid, mac)
if ssid_mac in seen_packets:
print "Seen this before - not adding"
else:
data_for_packet = True # your own data here (timestamp?)
print "Never seen this SSID/MAC combo before"
seen_packets[ssid_mac] = data_for_packet
print "Unique ssid,mac pairs with data:"
for (ssid, mac), data in seen_packets.iteritems():
print ssid, mac, data