Читаем Защита от хакеров корпоративных сетей полностью

#include

#include

#include

#include

#include

#include

#include

#include

#include

int open_interface(char *name)

{

struct sockaddr addr;

struct ifreq ifr;

int sockfd;

/* open a socket and bind to the specified interface */

sockfd = socket(AF_INET, SOCK_PACKET, htons(ETH_P_ALL));

if (sockfd < 0)

return -1;

memset(&addr, 0, sizeof(addr));

addr.sa_family = AF_INET;

strncpy(addr.sa_data, name, sizeof(addr.sa_data));

if (bind(sockfd, &addr, sizeof(addr)) != 0) {

close(sockfd);

return -1;

}

/* check to make sure this interface is ethernet, otherwise

exit */

memset(𝔦, 0, sizeof(ifr));

strncpy(ifr.ifr_name, name, sizeof(ifr.ifr_name));

if (ioctl(sockfd, SIOCGIFHWADDR, 𝔦) < 0) {

close(sockfd);

return -1;

}

if (ifr.ifr_hwaddr.sa_family != ARPHRD_ETHER) {

close(sockfd);

return -1;

}

/* now we set promiscuous mode */

memset(𝔦, 0, sizeof(ifr));

strncpy(ifr.ifr_name, name, sizeof(ifr.ifr_name));

if (ioctl(sockfd, SIOCGIFFLAGS, 𝔦) < 0) {

close(sockfd);

return -1;

}

ifr.ifr_flags |= IFF_PROMISC;

if (ioctl(sockfd, SIOCSIFFLAGS, 𝔦) < 0) {

close(sockfd);

return -1;

}

return sockfd;

}

/* read ethernet packets, printing source and destination

addresses */

int read_loop(sockfd)

{

struct sockaddr_in from;

char buf[1792], *ptr;

int size, fromlen, c;

struct ether_header *hdr;

while (1) {

/* read the next available packet */

size = recvfrom(sockfd, buf, sizeof(buf), 0, &from,

&fromlen);

if (size < 0)

return -1;

if (size < sizeof(struct ether_header))

continue;

hdr = (struct ether_header *)buf;

/* print out ethernet header */

for (c = 0; c < ETH_ALEN; c++)

printf(“%s%02x”,c == 0 ? “” : “:“,hdr-

>ether_shost[c]);

printf(“ > ”);

for (c = 0; c < ETH_ALEN; c++)

printf(“%s%02x”,c == 0 ? “” : “:”,hdr-

>ether_dhost[c]);

printf(“ type: %i\n”, hdr->ether_type);

}

}

int main(int argc, char **argv)

{

int sockfd;

char *name = argv[1];

if (!argv[1]) {

fprintf(stderr, “Please specify an interface name\n”);

return -1;

}

if ((sockfd = open_interface(name)) < 0) {

fprintf(stderr, “Unable to open interface\n”);

return -1;

}

if (read_loop(sockfd) < 0) {

fprintf(stderr, “Error reading packet\n”);

return -1;

}

return 0;

}

BSD

Операционные системы, основанные на BSD, такие как OpenBSD, FreeBSD, NetBSD и BSDI, предоставляют интерфейс к канальному уровню посредством размещенного в ядре драйвера Berkeley Packet Filter (BPF). BPF располагает несколькими очень хорошими отличительными особенностями, которые чрезвычайно эффективны в обработке и фильтрации пакетов.

Драйвер BPF имеет в ядре механизм фильтрации. Он представляет собой встроенную виртуальною машину, состоящую из нескольких очень простых байтовых операций, позволяющих обследование каждого пакета посредством маленькой программы, загруженной в ядро пользователем. Всякий раз, когда пакет получен, данная программа оценивает его и определяет, следует ли предать его для приложения на стороне пользователя. Выражения компилируются в простой байт-код на стороне пользователя и далее загружаются в драйвер посредством вызова ioctl

Libpcap

libpcap не является интерфейсом операционной системы, точнее, он является переносимой межплатформенной библиотекой, которая значительно облегчает сетевой доступ к канальному уровню во множестве операционных систем. Библиотека libpcap первоначально была разработана в Lawrence Berkeley Laboratories (LBL). Ее целью является абстрагировать интерфейс канального уровня на различных операционных системах и создать простой стандартизованный программный интерфейс приложения (API). Это позволяет создать портативный код, который может быть написан для использования одного интерфейса вместо многочисленных на множестве операционных систем. Данный факт значительно упрощает технику написания анализаторов сетевого трафика в сравнении с объемом работ, необходимых для выполнения такого кода на разнообразных операционных системах.

Исходная версия от LBL была значительно улучшена с ее последнего официального релиза. Она имеет лицензию системы с открытым кодом (лицензия BSD) и, следовательно, может быть использована в коммерческом программном обеспечении, а также позволяет неограниченные модификации и редистрибуцию.

Исходная LBL-версия может быть найдена на ftp://ftp.ee.lbl.gov/libpcap.tar.Z. Команда tcpdump.org, принявшая разработку TCPDump, также приняла разработку libpcap. Свежая версия libpcap может быть найдена на www.tcpdump.org.

По сравнению с анализатором сетевого трафика, написанного под операционную систему Linux, используется «родной» интерфейс, анализатор сетевого трафика для Linux, использующий libpcap, намного проще, как показано далее:

Перейти на страницу:
Нет соединения с сервером, попробуйте зайти чуть позже