前情提要
这是楼主在流量分析的时候发现的一个迟迟无法解决的错误,四处搜寻都没有找到答案,当然此处也没有给出解决方案,因为这属于一个久远的问题,而且已经被更正过一次了的,如果有,请详细阅读我的分析。
问题出现原因
from scapy.all import *
def Filter_test():
file_path = "AIM_Chat.pcap"
pkts = sniff(offline = file_path, filter = "not arp")
print(pkts[0].show())
if __name__ == '__main__':
Filter_test()
这只是一个样例,错误点发生在sniff函数中的filter,再用sniff处理离线pcap文件时,如果想使用伯克利过滤器处理,就有可能产生这个问题。
考证过程
在网上找,只有很少的相关内容,几乎找不到是什么原因。
这个人在github上提出了isuue,据他描述说重装scapy就能解决问题:
在stackoverflow上有人说到了这点:link
然后他还给出了官方文档的解释:官方文档,在第51页提到了这个问题:
我在FAQ的10.1.6找到了这个问题描述,他说这是常见问题,这是因为使用BPF过滤器的时候要用到libpcap而不是原生的linux插件。说实话很唬人,我libpcap和tcpdump都安装了,还是没有解决这个问题。
然后在github的scapy官方找到了更为相关的内容:scapy官方issue
大概意思就是描述了类似的问题,提到了linktype参数的问题。但是我看了2021年的那一版代码,参数中就没有提到linktype,反而是我们现在的库文件中已经有了这个新参数。确实是当时发现了这个问题,然后有大佬去更新了库文件,在21年的四月左右这个问题就被解决了,然后scapy估计也更新了。我在24年初遇到的这个问题的时候,库已经更新迭代过了的,所有看起来问题相似,其实是已经被解决了的问题。
并没有解决方案
在一层一层回套源码,最后到了非常底层的地方,确实我没办法看懂,大概意思就是说在filter编译失败,还跟linktype有关系,总而言之,没有合理的解决方案,几乎成了一个死题。
如果你还是执着于这个问题,那我只能告诉你我自己的推测:
1. 你传入的BPF语句有错误,建议查一下怎么构造过滤语句(我样例中使用的not arp是正确的用法);
2. 没有安装libpcap,兴许安装了可能有效;
3. 重装一下scapy,可能是哪里发生了冲突之类的;
4. 到这里估计就是和我一样的问题了。我猜测是pcap流量文件自身的问题,因为有一些流量文件能正常使用,而有些则不能,估计就是在加载offline文件的时候,linktype对不上,导致这个函数返回值为-1(这个函数直接走的是库文件,不是那种规整的函数结构,我暂时无能为力分析)。如果必须要进行流量分析,我建议直接将filter设置为None,然后在分析过程把所有包过滤,提取自己需要的数据包,作为一种开销比较大的平替方式吧。
希望大家不要做太多无谓的工作,克服不了就老老实实采用笨方法。
最后,如果您有新发现,请踹我一脚。