错误:scapy.error.Scapy_Exception: Failed to compile filter expression xxx(-1)

前情提要

这是楼主在流量分析的时候发现的一个迟迟无法解决的错误,四处搜寻都没有找到答案,当然此处也没有给出解决方案,因为这属于一个久远的问题,而且已经被更正过一次了的,如果有,请详细阅读我的分析。

问题出现原因

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,然后在分析过程把所有包过滤,提取自己需要的数据包,作为一种开销比较大的平替方式吧。

希望大家不要做太多无谓的工作,克服不了就老老实实采用笨方法。

最后,如果您有新发现,请踹我一脚。

  • 27
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值