阅读 BPF 汇编

Reading BPF Assembly

我正在尝试阅读过滤器的一些 BPF 语法,以尝试弄清楚它的作用。我找不到的一件事是 "byte offset starts" 在哪里。意思是,如果我们有以下汇编代码:

 0000: 0x28 0x00 0x00 0x00000004   ldh $data[4]
 0001: 0x15 0x00 0x61 0x00000028   jeq 40   true:0002 false:0099
 0002: 0x30 0x00 0x00 0x0000000d   ldb $data[13]
 0003: 0x14 0x00 0x00 0x00000033   sub 51
 0004: 0x15 0x00 0x5e 0x00000006   jeq 6    true:0005 false:0099
  1. 问题 1

对于字节偏移量 4,这是否会将我置于 802.3 帧的目标 MAC 地址的中间?或者它在序言中?我从数据包中的哪里开始,然后走 4 个字节到我的半字就是我要问的。

  1. 问题 2

如果它在 MAC 地址中,scapy 是否是一个可行的选项来编写我自己的数据包的以太网帧?这样做的目的是编写一个连接并通过所有 BPF 要求的客户端。

对于您的第一个问题:这取决于您在何处以及如何附加 BPF 程序。

  • 如果你将它作为分类器附加到 TC(交通控制)接口,它将开始工作 L2 以太网 header(目标 MAC 地址)。

  • 如果附加到socket上,我觉得有几种情况:

    • 如果您在创建套接字时传递的协议是,例如 TCP,那么程序将在 L3 (IP) header 上启动。例如参见 [​​=13=].
    • 如果所需的协议是“每个数据包”,则程序开始在 MAC header 上工作。请参阅示例 in the BPF kernel documentation(grep for ETH_P_ALL)。

    编辑:而不是协议,这更可能是中的套接字使用 (AF_PACKET vs. AF_INET) 在这里有所不同。

对于你的第二个问题,你可以使用 scapy 构建以太网 headers 和 payloads,但是很抱歉,我不明白你所说的“连接并通过所有 BPF 要求”是什么意思…你能再详细一点吗?