Чтение БПФ Ассамблеи

Я пытаюсь прочитать синтаксис 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 это помещает меня в середину MAC-адреса назначения кадра 802.3? Или это в преамбуле? Откуда я начинаю в пакете, затем прошу 4 байта к моему полуслову - вот что я спрашиваю.

  1. вопрос 2

Если он находится в MAC-адресе, будет ли scapy приемлемым вариантом для записи кадра Ethernet моего собственного пакета? Целью этого является написание клиента, который будет подключаться и выполнять все требования BPF.

1 ответ

Решение

По первому вопросу: это зависит от того, где и как вы прикрепляете свою программу BPF.

  • Если вы подключите его к интерфейсу TC (управление трафиком) в качестве классификатора, он начнет работать с заголовком Ethernet L2 (MAC-адрес назначения).

  • Если вы подключите его к сокету, я думаю, что есть несколько случаев:

    • Если протокол, который вы передали при создании сокета, например, TCP, программа запускается в заголовке L3 (IP). Смотрите, например, этот вопрос.
    • Если требуемый протокол - "каждый пакет", тогда программа начинает работать с заголовком MAC. Смотрите пример в документации ядра BPF (grep для ETH_P_ALL).

    Изменить: Вместо протокола, это более вероятно, используется домен сокетов (AF_PACKET против AF_INET) это имеет значение здесь.

Что касается вашего второго вопроса, вы можете создавать заголовки и полезные данные Ethernet с помощью scapy, но я извиняюсь, я не понимаю, что вы подразумеваете под "подключайтесь и выполняйте все требования BPF"… Не могли бы вы рассказать подробнее?

Другие вопросы по тегам