Исследование программных интерфейсов приложений операционных систем

Исследование программных интерфейсов приложений операционных систем

Операционные системы предоставляют или не предоставляют интерфейсы с уровнем сетевых соединений. Рассмотрим несколько операционных систем, для того чтобы определить, как они взаимодействуют с их уровнем сетевых соединений.

Linux

Linux предоставляет интерфейс с уровнем сетевых соединений посредством интерфейса сокета. Он является одним из самых простых интерфейсов, предоставляемых любой операционной системой. Следующая программа иллюстрирует, насколько он прост. Программа открывает указанный интерфейс, устанавливает «безразличный» режим и далее приступает к чтению Ethernet-пакетов из сети. Когда пакет прочитан, в дополнение к типу пакета запоминаются MAC-адреса источника и получателя.

#include <stdio.h>

#include <stdlib.h>

#include <sys/types.h>

#include <sys/socket.h>

#include <netinet/in.h>

#include <linux/if_arp.h>

#include <linux/if_ether.h>

#include <linux/sockios.h>

#include <net/ethernet.h>

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(&ifr, 0, sizeof(ifr));

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

if (ioctl(sockfd, SIOCGIFHWADDR, &ifr) < 0) {

close(sockfd);

return -1;

}

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

close(sockfd);

return -1;

}

/* now we set promiscuous mode */

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

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

if (ioctl(sockfd, SIOCGIFFLAGS, &ifr) < 0) {

close(sockfd);

return -1;

}

ifr.ifr_flags |= IFF_PROMISC;

if (ioctl(sockfd, SIOCSIFFLAGS, &ifr) < 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 ”, 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 ”);

return -1;

}

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

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

return -1;

}

if (read_loop(sockfd) < 0) {

fprintf(stderr, “Error reading packet ”);

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, намного проще, как показано далее:

#include <stdio.h>

#include <stdlib.h>

#include <sys/types.h>

#include <net/ethernet.h>

#include <pcap/pcap.h>

pcap_t *open_interface(char *name)

{

pcap_t *pd;

char ebuf[PCAP_ERRBUF_SIZE];

/* use pcap call to open interface in promiscuous mode */

d = pcap_open_live(name, 1600, 1, 100, ebuf);

f (!pd)

return NULL;

return pd;

}

int read_loop(pcap_t *pd)

{

const unsigned char *ptr;

int size, c;

struct pcap_pkthdr h;

struct ether_header *hdr;

while (1) {

/* read the next available packet using libpcap */

ptr = pcap_next(pd, &h);

if (h.caplen < sizeof(struct ether_header))

continue;

hdr = (struct ether_header *)ptr;

/* 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 ”, hdr->ether_type);

}

}

int main(int argc, char **argv)

{

pcap_t *pd;

char *name = argv[1];

if (!argv[1]) {

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

return -1;

}

pd = open_interface(name);

if (!pd) {

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

return -1;

}

if (read_loop(pd) < 0) {

fprintf(stderr, “Error reading packet ”);

return -1;

}

return 0;

}

Windows

К сожалению, операционные системы семейства Windows не предоставляют функциональной возможности доступа к сети на канальном уровне. Мы должны приобрести и установить пакет драйвера стороннего производителя для получения доступа к данному уровню. До недавнего времени не существовало общедоступных драйверов, для которых не нужна лицензия. BPF-образный драйвер на данный момент уже написан и поддерживает BPF-механизм фильтрации в ядре. Также существует портация библиотеки libpcap, которая в сочетании с драйвером предоставляет интерфейс, такой же простой его UNIX, как аналог. Драйвер, портация libpcap, так же как и Windows-версия TCPDump, доступны на http://netgroup-serv.polito.it/windump.

Поделитесь на страничке

Следующая глава >

Похожие главы из других книг:

Основные возможности операционных систем

Из книги автора

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


Обзор операционных систем и ядер

Из книги автора

Обзор операционных систем и ядер Из-за неуклонного роста возможностей и не очень качественного построения некоторых современных операционных систем, понятие операционной системы стало несколько неопределенным. Многие пользователи считают, что то, что они видят на


Книги по основам построения операционных систем

Из книги автора

Книги по основам построения операционных систем В этих книгах рассмотрены принципы работы операционных систем в объеме учебных курсов. В них описываются основные понятия, алгоритмы и проблемы, связанные с построением высокофункциональных операционных систем, а также


Книги о ядрах других операционных систем

Из книги автора

Книги о ядрах других операционных систем Понимать врагов, точнее не врагов, а конкурентов, — никогда не повредит. В этих книгах обсуждаются основы работы и особенности реализации операционных систем, отличных от операционной системы Linux. Смотрите, что у них хорошо, а


Глава 9 Прошлое и настоящее сетевых операционных систем

Из книги автора

Глава 9 Прошлое и настоящее сетевых операционных систем Извечной и зловещей мечтой вирусов является абсолютное мировое господство, и, как ни ужасны методы, коими они в настоящее время пользуются, им нельзя отказать в настойчивости, изобретательности и способности к


Глава 38 Сосуществование операционных систем

Из книги автора

Глава 38 Сосуществование операционных систем Как бы мы ни старались, а полностью жить в операционной системе Linux в современном мире не получается. Так сложилась жизнь, что множество программ написаны под операционные системы MS Windows или DOS. И зачастую по тем или иным


2.7.2. Установка других операционных систем после Linux

Из книги автора

2.7.2. Установка других операционных систем после Linux При инсталляции MS-DOS и Windows 95/98 ее стандартный загрузчик независимо от вашего желания записывается в Master Boot Record (MBR), а признак активности в таблице разделов ставится на раздел MS-DOS (Windows 95/98). А стандартный загрузчик MS-DOS и Windows


2.4. Установка нескольких операционных систем

Из книги автора

2.4. Установка нескольких операционных систем Прежде чем устанавливать несколько операционных систем на одном компьютере, сделайте резервное копирование важной информации, т.к. процесс установки операционной системы включает в себя переразбиение жесткого диска на


Применение «родных» программных интерфейсов

Из книги автора

Применение «родных» программных интерфейсов Всесторонний программный интерфейс Qt удовлетворяет большинству требований на всех платформах, но при некоторых обстоятельствах нам может потребоваться базовый, платформозависимый программный интерфейс. В данном разделе


3.2. Сравнение операционных систем

Из книги автора

3.2. Сравнение операционных систем Логика выбора конструкции Unix становится более очевидной в сравнении с другими операционными системами. Ниже приводится только общий обзор конструкций19.На рис. 3.1. отражены генетические связи между рассматриваемыми операционными


3.2. Сравнение операционных систем

Из книги автора

3.2. Сравнение операционных систем Логика выбора конструкции Unix становится более очевидной в сравнении с другими операционными системами. Ниже приводится только общий обзор конструкций[23].На рис. 3.1. отражены генетические связи между рассматриваемыми операционными


Платформы для операционных систем

Из книги автора

Платформы для операционных систем Платформы сервера Firebird включают следующие операционные системы, но не ограничиваются только ими.* Linux, FreeBSD и другие варианты ОС UNIX.* Платформы Microsoft Windows, поддерживающие сервисы: NT 4, Windows 2000 (сервер или рабочая станция), XP Professional и Server 2003.


Новогоднее исследование защищенности внешних интерфейсов Homo sapiens Рустем Хайретдинов

Из книги автора

Новогоднее исследование защищенности внешних интерфейсов Homo sapiens Рустем Хайретдинов Опубликовано 31 декабря 2013 В канун нового года аналитическое агентство NegativeWatch Lab представило аналитический отчёт о результатах многолетнего исследования


Глава 6 АРХИТЕКТУРА ПРОГРАММНЫХ СИСТЕМ

Из книги автора

Глава 6 АРХИТЕКТУРА ПРОГРАММНЫХ СИСТЕМ 6.1. ПОНЯТИЕ АРХИТЕКТУРЫ ПРОГРАММНОЙ СИСТЕМЫ Разработка архитектуры системы — это процесс разбиения большой системы на более мелкие части. Для обозначения этих частей придумано множество названий: программы, компоненты,


12.1. УПРАВЛЕНИЕ РАЗРАБОТКОЙ ПРОГРАММНЫХ СИСТЕМ

Из книги автора

12.1. УПРАВЛЕНИЕ РАЗРАБОТКОЙ ПРОГРАММНЫХ СИСТЕМ Управление разработкой программных систем (software management) — это деятельность, направленная на обеспечение необходимых условий для работы коллектива разработчиков программного обеспечения (ПО), на планирование и контроль


Дыроверт операционных систем

Из книги автора

Дыроверт операционных систем ОпСистема «Юних» всегда держалась провокационно на фоне войн операционных систем, подобно Русской Армии. Большинство людей знают только ее репутацию, и предположения о ее репутации, по типу как в мультфильме про Дильберта, смутны. Но все