解析BPF汇编:字节偏移起始位置技术咨询
搞懂BPF中$data的字节偏移起始位置
嘿,我来帮你理清楚这个问题——BPF里的字节偏移起始点其实是跟你的捕获上下文直接挂钩的,不是固定死的,我结合你给的代码片段拆解一下:
首先,经典BPF(也就是你代码里用的这种)里的$data,它的起始锚点就是你捕获的数据包的最开头:
- 如果是从网卡直接抓链路层包(比如tcpdump默认的抓包方式),
$data就指向以太网帧的第一个字节(也就是目的MAC地址的第一个字节)。 - 如果是在网络栈的更高层(比如IP层之后)挂载BPF程序,那
$data会直接指向对应协议头的第一个字节(比如IPv4头的第一个字节)。
再看你给出的代码片段:
0000: 0x28 0x00 0x00 0x00000004 ldh $data[4]
0001: 0x15 0x00 0x61 0x00000028 jeq 40 true:0002 false:0099
这里ldh是加载2字节的半字,然后判断这个值是不是十进制40。如果是链路层起始的话,偏移4对应的是目的MAC的第5个字节,取2字节的话就是目的MAC最后一个字节加源MAC第一个字节,这显然跟判断40没啥关系,所以你的场景里,$data肯定是从IPv4头的第一个字节开始计数的。
那偏移4对应的就是IPv4头里的标识(Identification)字段的起始位置(这个字段占2字节,用来标识分片的数据包)。后面的ldb $data[13]则是取IPv4头偏移13的字节,对应到IPv4头结构里,是标志位的最后1位加片偏移的前5位。
最后给你划个重点:
- 偏移量的0号位置永远是
$data指向的第一个字节,搞清楚捕获的起始层,就能精准对应到报文的具体位置。 - 要是不确定的话,可以结合协议头的结构反向推导,就像我们刚才分析你的代码那样。
内容的提问来源于stack exchange,提问作者John Conrad Geenty
相关产品推荐
相关产品推荐

