Вход на хостинг
IT-новости
20.04.2016 iPhone 2017 года поместят в водонепроницаемый корпус из стекла
Линейка iPhone в новом году серьезно поменяется. В этом уверен аналитический исследователь Мин Чи Ку......
30.07.2015 Ищем уникальный контент для сайта
Ищем уникальный контент для сайта Без уникального контента Ваш сайт обречен на то, что его страницы......
BPF_JMP+BPF_JSET+BPF_K pc += ( A & k ) ? jt : jf
BPF_JMP+BPF_JGT+BPF_X pc += ( A > X ) ? jt : jf
Сравнение значений аккумулятора и индексного регистра. Условный переход по смещению, заданному в поле jt при выполнении условия A > X.
BPF_JMP+BPF_JGE+BPF_X pc += ( A >= X ) ? jt : jf
BPF_JMP+BPF_JEQ+BPF_K pc += ( A == X ) ? jt : jf
BPF_JMP+BPF_JSET+BPF_K pc += ( A & X ) ? jt : jf
BPF_RET
Программа фильтрации выполняется для каждого пакета, поступающего на сетевой интерфейс. Результатом работы фильтра является целое положительное число, показывающее, сколько байт в принятом пакете будет доступно для дальнейшей обработки приложению пользователя. Если принятый пакет не удовлетворяет условиям фильтрации, он отбрасывается и программой фильтрации возвращается нулевое значение. Инструкция BPF_RET завершает выполнение программы фильтрации и возвращает число байт в пакете, доступных для дальнейшей обработки.
BPF_RET+BPF_A
Возвращаемый результат находится в аккумуляторе.
BPF_RET+BPF_K
Результат возвращается в виде константы.
BPF_MISC
Инструкция BPF_MISC служит для копирования значения индексного регистра в аккумулятор и наоборот.
BPF_MISC+BPF_TAX X <- A
BPF_MISC+BPF_TXA A <- X
Пример реализации пакетного фильтра
Здесь мы с помощью фильтра модифицируем исходный код анализатора сетевого трафика (см. «Анализатор сетевого трафика», «Системный администратор» №1, октябрь 2002 г.). Все изменения необходимо внести только в главную функцию. Перед тем как приступить к реализации пакетного фильтра, необходимо определить условия фильтрации. В нашем примере условия следующие: обрабатываться будут пакеты IP-протокола, адрес отправителя – 192.168.1.2, транспортный протокол – TCP, порт источника – 23.
Алгоритм реализации следующий:
n определить необходимые переменные и заголовочные файлы;
n составить программу фильтрации в кодах языка BPF;
n привязать полученный фильтр к сокету.
Переменные и заголовочные файлы
Нам необходим один заголовочный файл:
# include <linux/filter.h>
и структура:
struct sock_fprog *Filter;
– непосредственно сам подключаемый фильтр.
Программа фильтрации
Программа фильтрации представляет собой массив структур struct sock_filter. При ее составлении воспользуемся макросами BPF_STMP и BPF_JUMP, которые определены в заголовочном файле <linux/filter>.
struct sock_filter BPF_code [ ] = {