Как установить libpcap на linux
Старая статья, снифер на С с использованием libpcap
Послушаем?
Libpcap.
Библиотека libpcap предоставляет следующие базовые функции:
В качестве фильтра можно использовать следующие выражения:
pcap_compile(handle, &fp, "ip proto tcp", 0, net);
pcap_setfilter(handle, &fp);
Для перехвата пакетов библиотека libpcap предоставляет два пути. Первый считывать один пакет в момент времени используя функцию pcap_next() или организовать цикл с использованием функции pcap_loop().
. . . .
struct pcap_pkthdr *header;
const u_char *packet;
В бой.
Вооружившись этой информацией можно приступать к программированию.
Функция handle_tcp()(см. 108), также будет иметь тип void. В строке 111, обьявляется указатель на структуру *tcp, для хранения TCP заголовка. Далее идет определение переменной data для хранения данных передаваемых в пакете. В строках 113, 114 выполняем вычисление суммы длинн ethernet и ip заголовков, которую присваеваем переменной iplen, и длинна этих заголовков, плюс длинна tcp заголовка, и присваиваем переменной tcplen. Далее вырезаем TCP заголовок (см. 116). Теперь выводим интересующую нас информацию (см. 117, 118).
Если кроме информации из ethernet, ip, tcp и так далее заголовков нам необходимо увидеть передаваемые данные, то необходимо в вызове функции handle_tcp() из фукции handle_ip()(см. 102) добавить еще один параметр, длинну пакета(ip->ip_len), и соответсвенно изменить прототип фукции handle_tcp() добавив параметр u_int16_t len (см. 108). Эта информация необходима, чтобы вычислить размер передаваемых данных (см. 120). Вырезать данные из пакета можно налогично тому как, это мы делали с ethernet, ip, tcp заголовками ранее. Поскольку в полученных данных будут непечатаемые символы, то просто распечатать содержание *data не получится, кроме этого, хотелось, что бы вывод данных был красиво структурирован. Для этого можно воспользоваться фукцией ascii_print_with_offset()(см. 40-80), эта функция заимствована мной из исходников tcpdump, разработчиками tcpdump из кода NetBSD.
Заключение.
Как видите создать простой снифер с использованием библиотеки libpcap дело нескольких минут. К тому же этот снифер будет работать и на Linux и на Solaris и на FreeBSD, на любой системе на которую перенесена libpcap.
Читайте также: