阅读 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
对于字节偏移量 4,这是否会将我置于 802.3 帧的目标 MAC 地址的中间?或者它在序言中?我从数据包中的哪里开始,然后走 4 个字节到我的半字就是我要问的。
- 问题 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 要求”是什么意思…你能再详细一点吗?
我正在尝试阅读过滤器的一些 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
对于字节偏移量 4,这是否会将我置于 802.3 帧的目标 MAC 地址的中间?或者它在序言中?我从数据包中的哪里开始,然后走 4 个字节到我的半字就是我要问的。
- 问题 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 要求”是什么意思…你能再详细一点吗?