我从http://allanrbo.blogspot.in/2011/12/raw-sockets-with-bpf-in-python.html得到代码。它工作得很好,但是我想嗅探多个TCP端口上的流量,比如端口9000
,80
,22
。。。在
所以我修改了filter_list
式的打击
filters_list = [
# Must have dst port 67. Load (BPF_LD) a half word value (BPF_H) in
# ethernet frame at absolute byte offset 36 (BPF_ABS). If value is equal to
# 67 then do not jump, else jump 5 statements.
bpf_stmt(BPF_LD | BPF_H | BPF_ABS, 36),
bpf_jump(BPF_JMP | BPF_JEQ | BPF_K, 9000, 0, 5), <===== Here I added another port
bpf_jump(BPF_JMP | BPF_JEQ | BPF_K, 80, 0, 5),
# Must be UDP (check protocol field at byte offset 23)
bpf_stmt(BPF_LD | BPF_B | BPF_ABS, 23),
bpf_jump(BPF_JMP | BPF_JEQ | BPF_K, 0x06, 0, 3), #<==Changed for TCP "0x06"
# Must be IPv4 (check ethertype field at byte offset 12)
bpf_stmt(BPF_LD | BPF_H | BPF_ABS, 12),
bpf_jump(BPF_JMP | BPF_JEQ | BPF_K, 0x0800, 0, 1),
bpf_stmt(BPF_RET | BPF_K, 0x0fffffff), # pass
bpf_stmt(BPF_RET | BPF_K, 0), # reject ]
问题是,有时它是有效的,有时它不工作,比如只在9000而不是80获得流量,有时在80得到流量。我没有完全理解代码。有什么帮助吗?在
我知道你想给你的原始套接字附加一个过滤器,这是我最近的工作。多亏了几个星期的努力工作,我找到了一个简单的方法把过滤器连接到一个原始插座上。我想与您分享:)
首先确保您已经安装了
tcpdump
(这是一个Linux系统管理器工具),如果您的平台是Linux中的发行版之一,让我们进入下一步。其次,您需要拥有
sudo or root
权限才能执行该工具。第三步,以演示为例,更改它以适合您的情况。在
让我先解释一下参数。
tcpdump
>;在网络上转储流量-i
>;指定接口enp4s0
>;网络接口-dd
>;将包匹配代码作为C程序片段转储。tcp and (port 9000 or port 80 or port 22)
>;伯克利包过滤器(BPF)语法执行此命令后,您应该生成如下所示的代码:
^{pr2}$看起来一团糟,但别担心,让我们继续勇敢吧。在
先让我弄清楚它是什么,这是一个包过滤代码,如果你以前已经学过汇编语言,你会觉得很熟悉的。在
第二,因为它是C风格的代码,它不适合我们的python用法,所以我们需要对数据进行润色,使用follow python代码
第三,现在您可以使用
macroString
与filters_list
相同。在这个方法帮助我摆脱了过滤代码的困境,希望对您有所帮助。在
据我所知,问题似乎来自前两个条件跳转的逻辑。具体来说:
指令
^{pr2}$bpf_jump(BPF_JMP | BPF_JEQ | BPF_K, <val>, <jtrue>, <jfalse>)
表示所以这两条线的意思是:
你可能想要更像:
我还没有测试过,但是为了得到这个逻辑,我想说你需要调整跳跃偏移,如下所示:
编辑1:然后过滤三个端口,将变成:
编辑2:若要在源端口(除了目标端口)上也进行筛选,您可以尝试这样的方法(我这边还没有测试):
相关问题 更多 >
编程相关推荐