代码之家  ›  专栏  ›  技术社区  ›  John Conrad Geenty

读取BPF程序集

  •  0
  • John Conrad Geenty  · 技术社区  · 7 年前

    我正在尝试阅读一些过滤器的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地址中,那么编写自己的数据包的以太网帧是否可行?这样做的目的是编写一个客户端,该客户端将连接并传递所有BPF需求。

    1 回复  |  直到 7 年前
        1
  •  3
  •   Qeole    7 年前

    对于您的第一个问题:这取决于您在哪里以及如何附加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要求是什么意思,您能再详细一点吗?