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