【问题标题】:Reading BPF Assembly阅读 BPF 程序集
【发布时间】:2018-03-30 15:26:46
【问题描述】:

我正在尝试阅读过滤器的一些 BPF 语法,以尝试弄清楚它的作用。我找不到的一件事是“字节偏移量的开始”。意思是,如果我们有以下汇编代码:

 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 要求的客户端。

【问题讨论】:

    标签: network-programming bpf


    【解决方案1】:

    对于您的第一个问题:这取决于您附加 BPF 程序的位置和方式。

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

    • 如果将它附加到套接字上,我认为有几种情况:

      • 例如,如果您在创建套接字时传递的协议是 TCP,则程序从 L3 (IP) 标头开始。参见例如this question
      • 如果所需的协议是“每个数据包”,则程序开始处理 MAC 标头。请参阅示例 in the BPF kernel documentation(grep 为 ETH_P_ALL)。

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

    对于您的第二个问题,您可以使用 scapy 构建以太网标头和有效负载,但很抱歉,我不明白您所说的“连接并通过所有 BPF 要求”是什么意思...请您详细说明一下更多?

    【讨论】:

    • 所以如果它使用 setsockopt(3, SOL_SOCKET, SO_ATTACH_FILTER, "d\0\0\0\300\221\4\10", 8 那么我假设它将从 IP 标头开始?我的意思是我需要满足所有过滤器要求。就像它过滤掉端口 22,我需要通过端口 22 连接。
    • 对于第二个问题,我的意思是我需要满足所有过滤器要求。就像它过滤掉端口 22 一样,我需要通过端口 22 连接
    • 据我了解,对于套接字,它取决于您使用 socket(*domain*, type, protocol) 调用创建的套接字的域,而不是随后的 setsockopt()。如果您想通过端口 22 连接,请使用 scapy 或您的应用程序中可用的任何其他方法。例如,SSH 默认使用端口 22,但您可以使用 -p 更改它;其他应用程序可能有类似的选项。 Scapy 将允许您从头开始伪造您的数据包。您是否需要它取决于您要达到的目标。
    猜你喜欢
    • 2021-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多