Разделы презентаций


Основные функции библиотеки pcap

pcap_t *pcap_open_live(char *device, int snaplen, int promisc, int to_ms, char *ebuf) Функция возвращает дескриптор открытого сетевого интрефейса. Что делается с полученным? Происходит перехват пакетов с заданного первым аргументом, второй

Слайды и текст этой презентации

Слайд 1char *pcap_lookupdev(char *errbuf) Данная функция возвращает имя сетевого интерфейса, установленного

по умолчанию; в случае ошибки возвращает NULL и в аргумент

функции записывает причину ошибки. Пример:
#include
char err[PCAP_ERRBUF_SIZE]; /* буфер для записи ошибок */
char *device; /* буфер, в котором будет находиться название интрефейса */
device = pcap_lookupdev(err);
int pcap_lookupnet(char *device, bpf_u_int32 *netp, bpf_u_int32 *maskp, char *errbuf) Функция позволяет получить номер/маску сети на сетевом интерфейсе заданным первым параметром, в случае ошибки возвращает -1 и записывает причину ошибки в последний аргумент.
(bpf_u_int32 это unsigned int)
if ((pcap_lookupnet(device, &net, &mask, err)) < 0)
{ /* Обработка ошибки*/}

Основные функции библиотеки pcap

char *pcap_lookupdev(char *errbuf)   Данная функция возвращает имя сетевого интерфейса, установленного по умолчанию; в случае ошибки

Слайд 2pcap_t *pcap_open_live(char *device, int snaplen, int promisc, int to_ms, char

*ebuf) Функция возвращает дескриптор открытого сетевого интрефейса. Что делается с

полученным? Происходит перехват пакетов с заданного первым аргументом, второй аргумент это максимальная длинна обрабатываемого пакета, обычно данное значение равняется MTU на открываемом интерфейсе.
Следующий аргумент задает: переводить ли интерфейс в PROMISC режим работы (1 - да, 0 - нет).
Идущий далее параметр задает таймаут чтения с сетевого интерфейса в миллисекундах.
Последний параметр - это буфер, куда, при возникновении ошибок, будут записываться причины (при ошибке функция возвращает NULL).
if ((fd = pcap_open_live(device, MAXLEN, 1, TIMEOUT, err)) == NULL)
{
printf("Cant open device %s\n", err);
exit(0);
}

Основные функции библиотеки pcap

pcap_t *pcap_open_live(char *device, int snaplen, int promisc, int to_ms, char *ebuf)   Функция возвращает дескриптор открытого

Слайд 3Тип данных pcap_t это структура:
struct pcap {

int fd;

/* видимо реальный дескриптор интерфейса */
int snapshot;
int linktype; /* тип интерфейса, можно и не использовать, pcap_datalink,
а узнать тип интерфейса, просто pcap_t->linktype */
int tzoff; /* оффсет временой зоны */
int offset; /* оффсет для правильной регулировки (чего?) */
struct pcap_sf sf;
struct pcap_md md;
int bufsize;
u_char *buffer;
u_char *bp;
int cc;
u_char *pkt; /* указатель на следующий пакет */
struct bpf_program fcode; /* структура для регулярного выражения
bpf, если bpf не встроен в ядро */
char errbuf[PCAP_ERRBUF_SIZE]; /* буфер для хранения информации об ошибках */
};
Тип данных pcap_t это структура: struct pcap {    int fd;

Слайд 4int pcap_stats(pcap_t *p, struct pcap_stat *ps) Данная функция используется для

получения статистики сетевого интерфейса во время работы нашей программы, первый

её аргумент - это дескриптор открытого сетевого интерфейса, второй это указатель на стуркутуру pcap_stat.
struct pcap_stat {
u_int ps_recv; /* кол-во принятых пакетов */
u_int ps_drop; /* кол-во отброшенных пакетов */
u_int ps_ifdrop; /* отброшено определенным интерфейсом (пока не работает) */
};

int pcap_datalink(pcap_t *p) Эта функция отображает тип открытого сетевого интерфейса, заданного его дескриптором. Например возвращает DLT_EN10MB, это означает, что сетевой интерфейс - 10мбит Ethernet, или DLT_PPP - PPP интерфейс (данная функция удобна для получения информации об используемом канальном уровне на данном интерфейсе).
if (pcap_datalink(fd) != DLT_EN10MB)
{
printf("Only ethernet supported\n");
pcap_close(fd); // закрываем интерфейс
exit(0);
}
int pcap_stats(pcap_t *p, struct pcap_stat *ps)   Данная функция используется для получения статистики сетевого интерфейса во

Слайд 5int pcap_loop(pcap_t *p, int cnt, pcap_handler callback, u_char *user)

Данная

функция используется для создания цикла для обработки захватываемых пакетов, первым

параметром задается дескриптор открытого интерфейса, вторым - количество пакетов, которое необходимо обработать, если параметр отрицательный то число пакетов не ограничено и цикл будет бесконечным, если не возникнет ошибка или пройдет время чтения с интерфейса заданный в функции pcap_open_live. Третий параметр функции это указатель на функцию которая будет вызвана для обработки нового пакета. Прототип функции для обработчика сообщений, имеет следующей вид:
void handler(char *, struct pcap_pkthdr *, u_char *)
int pcap_loop(pcap_t *p, int cnt, pcap_handler callback, u_char *user) Данная функция используется для создания цикла для обработки

Слайд 6int pcap_compile(pcap_t *p, struct bpf_program *fp, char *str, int optimize,

bpf_u_int32 netmask) Используется для занесения в структуру bpf_program строки, заданной

3им аргументом, в которой
записано регулярное выражение в стиле bpf (Berkley Packet Filter). Данная возможность позволяет достаточно легко задавать свои правила фильтрации захватываемых пакетов, без того, чтобы писать самому сложные условия обработчика пакетов.
Пример третьего аргумента на следующем слайде

Четвертый аргументом в функции выглядит так: 1, если оптимизировать код, 0, если нет. Следует добавить, что при оптимизации программа ест гараздо больше ресурсов.
int pcap_compile(pcap_t *p, struct bpf_program *fp, char *str, int optimize, bpf_u_int32 netmask)   Используется для занесения

Слайд 7Например нам нужно, чтобы в нашу программу попадали только пакеты

по протоколу TCP, идущие на порт 21: ip proto TCP

and port 21 Или например я хочу получать только пакеты с адреса 192.168.0.1 на адрес 192.168.0.2 по протоколу icmp src 192.168.0.1 and dst 192.168.0.2 and ip proto ICMP Хотим видеть весь траффик, исключая TCP-траффик на 22 порт: proto TCP and not port 22 Показывать пакеты по протоколу ICMP или UDP пакеты на порт 31337: ip proto ICMP or ip proto UDP and port 31337 Пакеты идущие с хоста www.gov.ru:
src host www.gov.ru Для получения более подробной информации по регулярным выражениям bpf, читайте tcpdump(1).

/* встриваем фильтр на IPv4 TCP порт 21 */
if ((pcap_compile(fd, &bpf_fil, "ip proto TCP and port 21", 1, mask)) < 0)
{
pcap_perror(fd, "pcap_compile ");
pcap_close(fd);
exit(0);
}

Например нам нужно, чтобы в нашу программу попадали только пакеты по протоколу TCP, идущие на порт 21:

Слайд 8int pcap_setfilter(pcap_t *p, struct bpf_program *fp) Данная функция используется для

применения фильтра, встроенного функцией pcap_compile в структуру bpf_program. Функция возвращает

-1 при ошибке, и 0 при удачном выполнении функции.
struct bpf_program bpf_fil; /* структура для фильтра */
/* применяем фильтр */
if ((pcap_setfilter(fd, &bpf_fil)) < 0)
{
pcap_perror(fd, "pcap_setfilter ");
pcap_close(fd);
exit(0);
}
char *pcap_geterr(pcap_t *p) Вернёт строку ошибки и будет использована для получения информации об ошибках, в таких функциях как: pcap_setfilter(), pcap_compile(), pcap_loop() и др. Первым аргументом прописывается дескриптор открытого интерфейса.
int pcap_setfilter(pcap_t *p, struct bpf_program *fp)   Данная функция используется для применения фильтра, встроенного функцией pcap_compile

Слайд 9void pcap_perror(pcap_t *p, char *prefix) Выдаёт произошедшую ошибку на экран,

используется для получения ошибок в функциях: pcap_setfilter(), pcap_compile(), pcap_loop() и

др. Первым аргументом задается дескриптор открытого интерфейса.
u_char *pcap_next(pcap_t *p, struct pcap_pkthdr *h)
Функция возвращает указатель на следующий захваченный пакет. Вторым аргументом функции, задается указатель на достаточно полезную структуру pcap_pkthdr, которая будет заполнена данными после выполнения функции. Так же рассматриваемая структура используется в обработчике пакетов, вызываемом функцией pcap_loop.
struct pcap_pkthdr {
struct timeval ts; /* время захвата пакета */
bpf_u_int32 caplen; /* длина пакета */
bpf_u_int32 len; /* размер текущего захваченного пакета */
};

void pcap_close(pcap_t *p) Данная функция закрывает открытый интерфейс.

Основные функции библиотеки pcap (продолжение)

void pcap_perror(pcap_t *p, char *prefix)   Выдаёт произошедшую ошибку на экран, используется для получения ошибок в

Слайд 10int pcap_loop(pcap_t *p, int cnt, pcap_handler callback, u_char *user)

Третий

аргумент - имя callback-функции (только имя, без скобок)
Прототип нашей

callback-функции должен быть таким:

void got_packet(u_char *args, const struct pcap_pkthdr *header, const u_char *packet);

Первое - функция возвращает пустое значение (void).
Первый аргумент совпадает с последним аргументом pcap_loop().
Второй аргумент - заголовок pcap, который содержит информацию о том, когда был перехвачен пакет, его размер и т.д.
Последний аргумент callback-функции содержит, собственно, весь пакет, перехваченный с помощью pcap_loop().

void handler(char *, struct pcap_pkthdr *, u_char *); /* обработчик пакетов */
process = (pcap_handler) handler; // получаем указатель на функцию обработчик
if (pcap_loop(fd, -1, process, NULL))
{
pcap_perror(fd, "pcap_loop ");
pcap_close(fd);
exit(0);
}

Callback

int pcap_loop(pcap_t *p, int cnt, pcap_handler callback, u_char *user) Третий аргумент - имя callback-функции (только имя, без

Слайд 11#include
#include

#define MAXLEN 1500
#define TIMEOUT 500
#define

IP_H sizeof(struct ip)
#define ETH_H 14
#define TCP_H sizeof(struct tcphdr)

pcap_t

*fd;

int main(int argc, char **argv)
{
struct bpf_program bpf_fil;
char err[PCAP_ERRBUF_SIZE];
char *device;
bpf_u_int32 net, mask;

Пример-программа 1

#include #include  #define MAXLEN 1500 #define TIMEOUT 500 #define IP_H sizeof(struct ip) #define ETH_H 14 #define

Слайд 12device=pcap_lookupdev(err);
printf("Using device: %s\n", device);

if((fd=pcap_open_live(device, MAXLEN, 1, TIMEOUT, err))==NULL){

printf("Cant open device %s\n",err);

exit(0);
}

if((pcap_lookupnet(device,&net,&mask, err))<0)
{
printf("pcap_lookupnet error: %s\n", err);
pcap_close(fd);
exit(0);
}
printf("Net number: %s\n", inet_ntoa(net));
printf("Mask: %s\n", inet_ntoa(mask));
return 0;
}

Пример-программа 1 (продолжение)

device=pcap_lookupdev(err); printf(

Слайд 13#include
...
pcap_t *handle;

// хэндл сессии
char dev[] = "eth0";

// интерфейс, на котором мы будем слушать
char errbuf[PCAP_ERRBUF_SIZE]; // Строка с ошибкой
struct bpf_program filter; // Скомпилированное выражение для фильтра
сhar filter_app[] = "port 23"; // Выражение для фильтра

bpf_u_int32 mask; // Сетевая маска нашего интерфейса
bpf_u_int32 net; // IP адрес нашего интерфейса

pcap_lookupnet(dev, &net, &mask, errbuf);
handle = pcap_open_live(dev, BUFSIZ, 1, 0, errbuf);
pcap_compile(handle, &filter, filter_app, 0, net);
pcap_setfilter(handle, &filter);

Пример-программа 2

Эта программа подготавливает перехватчик для пакетов, идущих на или с 23-го порта, в promiscuous режиме, на интерфейсе eth0. Пример содержит функцию pcap_lookupnet(), которая возвращает сетевой адрес и маску сети для устройства, имя которого передано ей как параметр. Ее использование необходимо, так как для того, чтобы наложить фильтр, мы должны знать адрес и маску сети

#include ...pcap_t *handle;    		     // хэндл сессииchar dev[] =

Слайд 14Пример-программа 3
#include
#include
int main()
{
pcap_t *handle;

// хэндл сессии
char *dev; // устройство, на котором будем
// перехватывать траффик
char errbuf[PCAP_ERRBUF_SIZE]; // строка с описанием ошибки
struct bpf_program filter; // скомпилированный фильтр

char filter_app[] = "port 23"; // фильтр
bpf_u_int32 mask; // наша сетевая маска
bpf_u_int32 net; // наш ip адрес
struct pcap_pkthdr header; // заголовок пакета,
// который заполнит pcap
const u_char *packet; // сам пакет

Эта программа перехватывает пакеты на устройстве, которое возвращает pcap_lookupdev(), переводя его в pormiscuous режим. Она обнаруживает пакет, который идет через 23-ий порт (telnet) и выводит его размер в байтах. Вызов pcap_close() закрывает открытую сессию перехвата.

Пример-программа 3#include #include int main() { pcap_t *handle;

Слайд 15// определим интерфейс
dev = pcap_lookupdev(errbuf);

// получим сетевой адрес

и маску интерфейса
pcap_lookupnet(dev, &net, &mask, errbuf);

// откроем сессию

перехвата в promiscuous режиме
handle = pcap_open_live(dev, BUFSIZ, 1, 0, errbuf);

// скомпилируем и применим пакетный фильтр
pcap_compile(handle, &filter, filter_app, 0, net);
pcap_setfilter(handle, &filter);
// перехватим пакет
packet = pcap_next(handle, &header);

// выведем его длину в консоль
printf("Jacked a packet with length of [%d]\n", header.len);
// закроем сессию
pcap_close(handle);
return(0);
}

Пример-программа 3 (продолжение)

// определим интерфейс dev = pcap_lookupdev(errbuf); // получим сетевой адрес и маску интерфейса pcap_lookupnet(dev, &net, &mask, errbuf);

Слайд 16Лекция закончена!

Лекция закончена!

Обратная связь

Если не удалось найти и скачать доклад-презентацию, Вы можете заказать его на нашем сайте. Мы постараемся найти нужный Вам материал и отправим по электронной почте. Не стесняйтесь обращаться к нам, если у вас возникли вопросы или пожелания:

Email: Нажмите что бы посмотреть 

Что такое TheSlide.ru?

Это сайт презентации, докладов, проектов в PowerPoint. Здесь удобно  хранить и делиться своими презентациями с другими пользователями.


Для правообладателей

Яндекс.Метрика