如何编写正确的BPF过滤器以接收源MAC等于传输MAC的数据包?
正确的BPF过滤器:匹配源MAC与传输MAC相等的802.11数据包
要过滤源MAC地址(帧的逻辑发送者)与传输MAC地址(实际无线传输的发送者,即TA)相等的数据包,最可靠的方式是使用libpcap提供的命名字段,而非手动指定字节偏移(因为传输地址的位置会随802.11帧类型变化):
wlan.sa == wlan.ta
为什么你之前的尝试没生效?
- 关于
wlan[21:12]:这个写法有两个明显问题:一是MAC地址是6字节长度,不是12;二是传输地址(TA)的偏移量并非固定在21,它会根据帧控制字段里的ToDS和FromDS位变化——比如在FromDS=1的帧中,TA对应第二个地址字段(偏移10-15),而在某些WDS帧中可能对应其他位置。手动指定偏移很容易因帧类型不同而失效。 - 关于
wlan.addr2:wlan.addr2只是帧头中的第二个地址字段,它并不总是等于传输地址TA。比如当帧是从AP转发到STA(FromDS=1)时,wlan.addr2是AP的MAC(也就是TA),但如果是其他特殊帧类型,wlan.addr2的含义可能发生变化。直接用wlan.ta才能准确获取传输地址,而wlan.sa是逻辑源地址,这样的比较才是准确的。
补充:如果需要手动字节偏移的场景(不推荐)
如果你一定要用字节偏移,需要先判断帧类型,再指定对应的偏移。比如对于大多数普通数据帧和管理帧,可以这样写(但覆盖场景有限):
(wlan[0] & 0x0c) == 0x00 and wlan[10:6] == wlan[10:6] # ToDS=0, FromDS=0,TA=addr2 or (wlan[0] & 0x0c) == 0x04 and wlan[10:6] == wlan[10:6] # ToDS=1, FromDS=0,TA=addr2 or (wlan[0] & 0x0c) == 0x08 and wlan[10:6] == wlan[10:6] # ToDS=0, FromDS=1,TA=addr2
但显然,使用命名字段wlan.sa == wlan.ta要简洁且可靠得多。
内容的提问来源于stack exchange,提问作者Zachary Alfakir
相关产品推荐
相关产品推荐

