Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум программистов _ Borland C++ Builder & Kylix _ Анализатор трафика

Автор: S-haman 19:04:2008, 17:38

Здроавствуйте мне необходимо написать прогармму для анализа локального траффика, это сниффер(для получения пакетов) и потом анализ этих пакетов. Я почитал много литературы и узнал что лутчше это делать с помощью библиотеки/драйвера libpcap, а для виндовса winpcap, скачал эту библиотеку/драйвер установил, паралельно нашел как с этой библиотекой работать , начал исать программу и при подключении файла <pcap.h> компилятор выдает ошибку что неможет найти этого файла. Подскажите что я делаю не правильно.

P.S. Использую компилятор BCB 6

Автор: ReindeeR 19:04:2008, 17:55

скачайте файл pcap.h и остальные файлы.
и либу wpcap.lib,в каждом проекте используйте ее.
Далее все файлы засовывайте в папку с проектом,
и подключаете как "pcap.h",кроме этого файла,вам понадобится еще подключать
несколько файлов.
Так же придется в нескольких файлах подправить c <lalala.h> на "lalala.h"
где исправлять,пойметет,компилятор заорет что ниче не нашел.

А проще кинуть все заголовочные файлы в папку include вашего компилятора
и не парится работать как обычно)))

Автор: S-haman 19:04:2008, 18:48

Reindeer идея хорошая просто некоторых файлов отдельноя я ненашел в интернете для скачивания, может есть какието другие варианты или хотябы откуда можно их взять и их список?

Автор: ReindeeR 19:04:2008, 19:07

на официальном сайте все есть,но я брал отсюда.
https://projects.honeynet.org/capture-hpc/b...r/wpcap?rev=259
там документации,примеры,все заголовочные файлы и две либы,для никсов и винды.

Автор: S-haman 24:04:2008, 16:45

ReindeeR
Большое спасибо за заголовочные файлы +1
Только возникло два трабла в боланде не захотели подключаться, БСБ 6, а в вижуал студие 9 всё номра заработал ))
и теперь непосредственно вопрос по иблиотеке в функции pcap_open_live первый параметр это имя адаптера, насколько я понял, если да то как имя этого адаптера должено выглядить я просто перепробовал все известные имена адаптера моего на все ругается, может можно както имена эти получить функцией?

Автор: ReindeeR 24:04:2008, 18:08

я всегда делал так.

Код
pcap_if_t *alldevs,*d;
char errbuf[PCAP_ERRBUF_SIZE];
int inum;
pcap_findalldevs_ex(PCAP_SRC_IF_STRING,NULL,&alldevs,errbuf);  //находим все устройства.

     for(d=alldevs;d;d=d->next)                     // выводим информацию на экран
    {
        printf("%d. %s",++i,d->name);
        if(d->description)
            printf(" (%s)\n",d->description);
        else
            printf(" (Описание отсутствует.)\n");
    }

printf("Введите номер интерфейса:");      //вводим номер устройства.

cin >> inum;

for(d=alldevs,i=0;i<inum-1;d=d->next,i++);  // прыжок к выбранному устройству.

printf("%s\n",d->name);      //в d->name имя устройства,которое можете использовать в дальнейшем

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

Если заранее известен номер интерфейса и он не меняется,то можно сразу выбирать,не спрашивая.
Ну это уже вам решать))

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

Автор: S-haman 24:04:2008, 18:46

У меня компилятор фанкции pcap_findalldevs_ex не знает, ему известна только функция pcap_findalldevs

Автор: ReindeeR 24:04:2008, 21:31

remote-ext.h
подключили?

Автор: S-haman 28:04:2008, 19:18

Забыл ((
после подключения все заработало нормально
Вопрос таков это всё у меня получалось в вижуал студие 2005
пробовал на Рад студие(борландовской) там ругается на 2 файла "bittypes.h" и "stdint.h". первый файл это из тех которые я качал второй это стандартный борландовский.
bittypes.h пишет что "typedef signed char int8_t;" уже обявлен в файле stdint.h и там он действительно есть, подскажите как быть. В вижуал студии таких проблем нету. Я просто почему к борландовским продуктам там есть несколько компонентов которые потом понадобятся.
Плюс ков всему эта рад студия 2007 при попытке подключить файл wpcap.lib выдает ошибку
[ILINK32 Error] Error: 'C:\PROGRAM FILES\CODEGEAR\RAD STUDIO\5.0\LIB\SNIF\WPCAP.LIB' contains invalid OMF record, type 0x21 (possibly COFF)

Автор: ReindeeR 28:04:2008, 20:33

Сразу скажу что ни в Борланде,ни в вижуал студио ни разу не работал.
Для меня самое лучшее решение это Code::Blocks и Dev C++.
Монстров аля вижуал студио не люблю.
Могу просто посоветовать удалить объявление int8_t в ВинПикаповском файле.

зы.
Мне в скором времени тоже понадобится писать сниффер,
не против,если в аську обращусь?

Автор: S-haman 29:04:2008, 08:43

ReindeeR да нет не против ))

Автор: ReindeeR 29:04:2008, 12:35

Цитата(S-haman @ 28:04:2008 - 23:18) *
Плюс ков всему эта рад студия 2007 при попытке подключить файл wpcap.lib выдает ошибку
[ILINK32 Error] Error: 'C:\PROGRAM FILES\CODEGEAR\RAD STUDIO\5.0\LIB\SNIF\WPCAP.LIB' contains invalid OMF record, type 0x21 (possibly COFF)

тут я уже хз че такое,ни разу не сталкивался.

Автор: S-haman 29:04:2008, 16:20

ReindeeR там надо было конвертирвоать библиотеку(lb) с помощью программы coff2omf.exe, прогармма находитсья в папке bin,находясь в папке bin открыть консоль и дать следующие 4 команды

Код
coff2omf wpcap.lib wpcap.~lib
copy wpcap.~lib wpcap.lib  // эта команда копирует данные из wpcap.~lib в wpcap.lib можно в прнципе и без неё просто переименовать файл
coff2omf Packet.lib Packet.~lib
copy Packet.~lib Packet.lib  // эта команда копирует данные из Packet.~lib в Packet.lib можно в прнципе и без неё просто переименовать файл

после чего получившиеся файлы wpcap.lib и Packet.lib безпроблем подключаются в билдере

Автор: ReindeeR 30:04:2008, 17:41

Мне надеюсь это не понадобится smile.gif
не люблю я ни от борланда,ни от мелкомякгих среды.

зы.
Сниффер еще не готов? rolleyes.gif

Автор: S-haman 1:05:2008, 12:09

проверял программу на другом компютере, ещё не совсем готовую, и возникла ещё одна проблема, но это уже с переносимостью. При запуске прораммы на другом компютере необходимо присутствие 4 файлов: Borlndmm.dll, cc3280mt.dll, vcl100.bpl и rtl100.bpl все они должны находитсья по пути c:\\windows\sysstem32, также имееться ещё и по второй копии этих файлов вторые копии находятся по C:\Documents and Settings\All Users\Application Data\{2EB4C530-C94F-4893-ABDC-C1E05A89956E}\vclwin32runtimes\C8691228\9FAAECB7\*.bpl и C:\Program Files\CodeGear\RAD Studio\5.0\bin\**.dll можно их както подключить чтобы они находились непосредственно возле исполняемого файла?
Я пробовал через Project->"Add to Project" таким образом всеравно требует их наличие в систем32


Автор: ReindeeR 1:05:2008, 13:02

blink.gif
еще -1 к борланду с моей стороны biggrin.gif
когда я писал,чтобы перенести требовалось всего лишь поставить бибилиотека/драйвер pcap.
Если программа хотя бы стартует,то можно в самом начале проверять необходимые файлы,и если что
копировать,перемещать и т.д.
Или делать установщик,который копирует необходимые файлы.Заодно можете
ради красоты и добавить в пуск,на рабочий стол ярлыки и т.д.)))

Автор: S-haman 1:05:2008, 13:43

Проблему удалось решить следующим образом
1. Зайти в Project/Options
2. На вкладке Compiler выбирать Release
3. На вкладке Packages убирать флажок "Build with runtime packages"
4. На вкладке Linker убирать Use Dynamic RTL
5. Добавить к проекту все необходимые бпл и длл
6. Скомпилирывать.
После этого проэкт, не готовый правда, заработал на другом компе где необходимые файлы находятся рядом с экзефайлом, но после этих действий размер экзе файла вырос из 33 кб до 574 кб.

З.Ы. в прогармме на данный момент есть открытие адаптера, подключение фильтра, получение адресса IP,маски, но я заметил что программа не может октрыть ниодин адаптер, я на это обратил внимание когда мне программа стала выдавать Ап и маску равными 0. при открытии адаптера функцией pcap_open_live возникает следующяя ошибка: "Error opening adapter: Системе не удается найти указанное устройство. (20)", в качестве адаптера я передаю полностью полученое имя адаптера вида: "rpcap://\Device\NPF_{77F08C02-9410-471C-86A4-E6133522D16C}", пробовал также такой вариант: "\Device\NPF_{211439FA-7598-44EC-A677-27F448F7DB19}", я его увидел в одном сниффере как адаптер, результат тотже

Автор: ReindeeR 1:05:2008, 23:47

Можно попробовать считать название адаптера из реестра и его использовать.
Только у меня вроде не получался такой вариант,не помню почему unsure.gif

Автор: S-haman 2:05:2008, 13:42

С той проблеимой я разобрлся следующим образом,
раньше для нахождения адаптеров я использовал функцию pcap_findalldevs_ex и соответственно описание адаптера и имя приходилось обрабатывать, но всеравно не работало, после того как я воспользовался функцией pcap_findalldevs всё заработало нормально, даже смог получить маску и ап карты, но они правда както странно выглядят "65536(0x0000FFFF)- это маска, реальная маска на адаптере (255.255.0.0), 2732(0x00000AAC)- ато АП, реальный(172.10.1.14)" эти параметры получаю используя функцию pcap_lookupnet ошибок при этом нету.
все эти полученны данные я записываю в коллекцию, для каждого устройства храню его имя, описание, ап и маску ну чтоб в дальнейшем было проще работать, эту коллекцию я заполняют при загрузку форму потом в комбобоксе выбираю адаптер и по нажатию на кнопку в идеале он далжен принимать пакеты. Пробовал получать пакеты с помощью функции pcap_next, но он возвращяет какуюто ерунду наподобие "яяяяяя" и причем возвращает иногда , а иногда ничего вообще невозвращяет хотя по торренту закачка идет в полную, да и по сети. Какой функцией лутчше принимать пакеты?

Автор: ReindeeR 2:05:2008, 15:23

pcap_loop()
а потом пакет по косточкам разбирать smile.gif

Автор: S-haman 2:05:2008, 18:46

ReindeeR
спасибо за функцию у меня небыло про такую функцию написано )).
в этой функции не понятно только одно как сами данные получить, тоесть в третем параметре там где "pcap_handle callback" я вызываю функцию которая имеет три параметра:

Код
u_char *param, const pcap_pkthdr *header, const u_char *pkt_data

второй параметр это заголовок я сравнивал полученные данные с wireshark правильно определило но вот другие два параметра возвращяют пустые строки, как с ними работать? второй параметр это структура с ним безпроблем работается а те это просто строки, которые всегда пустые. Подскажите как с ними работать

Автор: ReindeeR 3:05:2008, 01:44

pcap_loop()
принимает четыре параметра.
1-дескриптор открытой сессии.
2-кол-во пакетов,-1 означает что хавает все до ошибки.
3-функция обработчик пакета.
4-используется для передачи еще каких-нить данных,если ничего не надо,то NULL
ну тут впринципе все понятно,самое главное,это функция,которая обрабатывает пакеты.
В данном случае функция-обработчик не любая попавшаяся,а заранее определенная.

Код
void packHandler(u_char *param, const struct pcap_pkthdr *header, const u_char *pkt_data)

ну это и так все ясно было.
Если не забыли,то в pcap_loop() в четвертом параметре можно чето передать.
Так вот,первый аргумент у функции-обработчика как раз и принимает то,что было передано в четвертом параметре
pcap_loop().Соответственно если передан NULL,то и не придет ничего,ради интереса можете убедиться
и послать строку,а в обработчике вывести ее на экран smile.gif
Второй параметр,структура ,на всякий случай,выглядит она так
Код
struct pcap_pkthdr {
  struct timeval ts;
  bpf_u_int32 caplen;
  bpf_u_int32 len;  
};

Третий параметр,буфер,в который помещается сам принятый пакет.
Вот его как раз и надо мучать.Определяете все структуры заголовков.
Если совсем разбирать пакет,то это примерно в таком порядке будет выглядеть:
ETHERNET
ARP
IP
TCP/UDP или чего у вас там будет.

Ну вот вроде все пока что.
зы.
ко мне на "Вы" не надо,маленький я еще для этого smile.gif

Надо еще с синтаксисом выражений для фильтра разобраться,все руки не доходят huh.gif

Автор: S-haman 3:05:2008, 14:46

ReindeeR пример хороший но одно но, третий параметр в котором хранятся данные он пустой он возвращяет пустую строку. В некоторых программах я увидел следующий пример как они получают данные они обявляют структуру в которой описываютатрибуты пакета потом присваивают переменно полученныее данные конвертированыфе в эту структуру и работают с этой структурой пример

Код
struct sniff_ip
{
#if BYTE_ORDER == LITTLE_ENDIAN
    u_int ip_hl:4, /* header length */
    ip_v:4; /* version */
#endif
#if BYTE_ORDER == BIG_ENDIAN
    u_int ip_v:4, /* version */
    ip_hl:4; /* header length */
#endif /* not _IP_VHL */
    u_char ip_tos; /* type of service */
    u_short ip_len; /* total length */
    u_short ip_id; /* identification */
    u_short ip_off; /* fragment offset field */
#define IP_RF 0x8000 /* reserved fragment flag */
#define IP_DF 0x4000 /* dont fragment flag */
#define IP_MF 0x2000 /* more fragments flag */
#define IP_OFFMASK 0x1fff /* mask for fragmenting bits */
    u_char ip_ttl; /* time to live */
    u_char ip_p; /* protocol */
    u_short ip_sum; /* checksum */
    struct in_addr ip_src,ip_dst; /* source and dest address */
};
struct sniff_ip *sip;  
sip = (struct sniff_ip*)(packet); //packet з параметр функции pcap_handle

после чего обращяясь к элементам sip работают с элементами пакета, но здесь только заголовочные фрагменты пакета
если packet не ковертирвоать в структуру то он равен концу строки тоесть '\0'
Как можно просто из этой переменной получить пакет в обычном виде:
Код
00 18 f3 5b f4 b9 00 e0  4e 09 c3 d4 08 00 45 00
00 28 d2 c1 40 00 80 06  cd dc ac 0a 01 0f ac 0a
01 0e 1f 90 06 aa f7 ca  f6 92 e6 42 ce 47 50 10
fb b4 90 cb 00 00 00 00  00 00 00 00
или подобном

Автор: ReindeeR 3:05:2008, 16:09

ну а я о чем говорил? smile.gif

Цитата
Третий параметр,буфер,в который помещается сам принятый пакет.
Вот его как раз и надо мучать.Определяете все структуры заголовков.
Если совсем разбирать пакет,то это примерно в таком порядке будет выглядеть:
ETHERNET
ARP
IP
TCP/UDP или чего у вас там будет.

вот структуры.
заголовок ethernet
Код
#define ETH_ALEN 6 /* Octets in one ethernet addr */
struct ethhdr
{
unsigned char h_dest[ETH_ALEN]; /* destination eth addr */
unsigned char h_source[ETH_ALEN]; /* source ether addr */
unsigned short h_proto; /* packet type ID field */
};

arp
Код
struct arphdr
{
  unsigned short ar_hrd;        /* format of hardware address    */
  unsigned short ar_pro;        /* format of protocol address    */
  unsigned char     ar_hln;        /* length of hardware address    */
  unsigned char     ar_pln;        /* length of protocol address    */
  unsigned short ar_op;            /* ARP opcode (command)        */
  unsigned char     ar_sha[ETH_ALEN];    /* sender hardware address    */
  unsigned char     ar_sip[4];        /* sender IP address        */
  unsigned char     ar_tha[ETH_ALEN];    /* target hardware address    */
  unsigned char     ar_tip[4];        /* target IP address        */
};

IP
Код
struct iphdr{
#if defined(__LITTLE_ENDIAN_BITFIELD)
__u8 ihl:4,
version:4;
#elif defined (__BIG_ENDIAN_BITFIELD)
__u8 version:4,
ihl:4;
#else
#error "Please fix <asm/byteorder.h>"
#endif
__u8 tos;
__u16 tot_len;
__u16 id;
__u16 frag_off;
__u8 ttl;
__u8 protocol;
__u16 check;
__u32 saddr;
__u32 daddr;
/*The options start here. */
};

TCP
Код
struct tcphdr {
__u16 source;
__u16 dest;
__u32 seq;
__u32 ack_seq;
#if defined(__LITTLE_ENDIAN_BITFIELD)
__u16 res1:4,
doff:4,
fin:1,
syn:1,
rst:1,
psh:1,
ack:1,
urg:1,
ece:1,
cwr:1;
#elif defined(__BIG_ENDIAN_BITFIELD)
__u16 doff:4,
res1:4,
cwr:1,
ece:1,
urg:1,
ack:1,
psh:1,
rst:1,
syn:1,
fin:1;
#else
#error "Adjust your <asm/byteorder.h> defines"
#endif
__u16 window;
__u16 check;
__u16 urg_ptr;
};


под себя тут можно подделать если что,брал из никсов.

Автор: S-haman 3:05:2008, 18:50

ReindeeR, а есть ли какой нибудь способ получить данные из той переменной не используя структуры, примеры со структурами хорошие, но в виндовсе нету для них хидеров. Есть ли какойто способ получить пакет целиком?

P.S. Или хотябы по какому закону заполняются элементы этих структур, те что описаны элементы совпадают по названиям с названиями в программе wireshark, но когда я пробую добавть те что мне надо выводитсмя полня ерунда

Автор: ReindeeR 3:05:2008, 19:52

Хм,тут от винды не зависит,просто я знаю где в никсах эти структуры объявлены.
Я тоже виндой пользуюсь,структуры приходиться самому объявлять.
Больше разницы нет.Пакеты-то везде одинаковые.
По какому закону?я не совсем понял,если честно,но щас попробую на примере объяснить.
Сначала объявляешь структуры.

Код
#define ETH_ALEN 6 /* Octets in one ethernet addr */
struct ethhdr
{
unsigned char h_dest[ETH_ALEN]; /* destination eth addr */
unsigned char h_source[ETH_ALEN]; /* source ether addr */
unsigned short h_proto; /* packet type ID field */
};

pcap_loop() и все что до этого опущу,начну с обработчика.
Код
void packetHandler(u_char *param, const struct pcap_pkthdr *header, const u_char *pkt_data)
{
    struct ethhdr ethernetHeader;
    memcpy((char*) &ethernetHeader,pkt_data,sizeof(struct ethhdr));    //В ethernetHeader у нас теперь находиться заголовок eth. пакета.
    printf("=====ETH. заголовок=====");
    printf("destination eth addr: %s",ethernetHeader.h_dest);
    printf("source ether addr: %s",ethernetHeader.h_source);
    printf("packet type ID field: %s",ethernetHeader.h_proto);
}

Продолжение следует... smile.gif
Просто окошко маленькое писать неудобно))

Предварительно конечно лучше вытащить информацию о пакете
из pcap_pkthdr для наглядности так сказать))

Ну вот таким образом мы разобрали Ethernet заголовок пакета.
Далее за ним следует ARP или IP заголовок.
указывается это в поле h_proto
проверяем
Код
if((ntohs(eth.h_proto) == ETH_P_ARP) ||
   (ntohs(eth.h_proto) == ETH_P_RARP)) {
//разбираем ARP заголовок.
}
if(ntohs(eth.h_proto) == ETH_P_IP)
{
//разбираем IP заголовок
}

Продолжение следует))


Разбираем заголовок ARP пакета.
Структура ARP заголовка.
Код
struct arphdr
{
  unsigned short ar_hrd;        /* format of hardware address    */
  unsigned short ar_pro;        /* format of protocol address    */
  unsigned char     ar_hln;        /* length of hardware address    */
  unsigned char     ar_pln;        /* length of protocol address    */
  unsigned short ar_op;            /* ARP opcode (command)        */
  unsigned char     ar_sha[ETH_ALEN];    /* sender hardware address    */
  unsigned char     ar_sip[4];        /* sender IP address        */
  unsigned char     ar_tha[ETH_ALEN];    /* target hardware address    */
  unsigned char     ar_tip[4];        /* target IP address        */
};

Продолжение функции обработчика пакетов.
Все это делать там,где h_proto==ETH_P_ARP

Код
struct arphdr *arpHeader;

//теперь у нас в arpHeader заголовок ARP,разбираем аналогично.
printf("====ARP заголовок=====");
printf("format of hardware address: %d",htons(arpHeader->ar_hrd));
//ну и так далее проход по нужным полям.



После ARP/IP следует TCP/UDP заголовки,или какие там еще протоколы есть.
Разбирается все аналогично.
например ip заголовок
Код
ipHeader = (struct arphdr *)(pkt_data + sizeof(struct ethhdr)+sizeof(struct arphdr));

И так же по всем полям printf)))
или че там с ними делать собрались.

Осталось написать структуру ip tcp udp и т.д. пакетов
и в путь.

зы.
Где можно почитать
о всех этих %s %d и т.д. в printf()?
а не то я кроме s и d ничего не знаю. unsure.gif

Автор: S-haman 3:05:2008, 20:38

при компилировании пишет что неизвестны переменные ETH_P_ARP, ETH_P_RARP и ETH_P_IP

Автор: ReindeeR 3:05:2008, 20:55

Код
#define ETH_P_RARP 0x8035
#define ETH_P_ARP 0x0806
#define ETH_P_IP 0x0800

объявите константы)

Автор: S-haman 4:05:2008, 12:03

Цитата(S-haman @ 3:05:2008, 20:50 ) *
Или хотябы по какому закону заполняются элементы этих структур, те что описаны элементы совпадают по названиям с названиями в программе wireshark, но когда я пробую добавть те что мне надо выводитсмя полня ерунда

по какому закону, это в смысле как выбирать имена и типы переменных в структуре, ведь если к примеру написать Source- то в эту переменну будет записано какоето левое число, также как выбирать тип для этих переменных. Я пробовал давать имена наподобие как в программе wireshark но там выводило немного не то что надо.

Автор: ReindeeR 4:05:2008, 16:14

Типы в струткурах задаются по размеру данных.
Расскажу подробнее,просто щас винда слетела,
терь до утра ***ться wacko.gif

Автор: ReindeeR 4:05:2008, 21:51

Ну вроде все работает,начнем))
Рассказывать буду напримере IP.
Первым делом идем к гуглю и спрашиваем RFC IP.
Выдает нам что rfc ip протокола номер 791.
Если траблы с английским,то ищем "RFC 791 на русском".
Идем по первой попавшейся ссылке.
http://www.free.net/Info/usmanov-01/rfc791.htm
Если вы мазохист или же нужно досконально разобраться в протоколе,то читаем все.
Находим структуру заголовка.
Там вот такая бодяга.

Код
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|Version|  IHL  |Type of Service|          Total Length         |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|         Identification        |Flags|      Fragment Offset    |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|  Time to Live |    Protocol   |         Header Checksum       |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                       Source Address                          |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                    Destination Address                        |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                    Options                    |    Padding    |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+


Как написано,каждая позиция соответствует одному биту.
Можно читать,а можно и самому крестики/плюсики считать.
Для начала объявим структуру,пока что пустую.
Ну например так.

Код
struct ip_header
{
}


Первым у нас идет поле Version,и занимает оно у нас 4 бита.

Цитата
Version (версия) 4 бита
Поле версии показывает формат заголовка Internet. Данный документ
описывает версию 4.

Значит нам нужно поле в 4 бита.

Код
struct ip_header
{
    unsigned int version: 4;
}


имя можно задавать любое,какое душе угодно,главное чтобы размер подходил.
Далее идет поле IHL,тоже 4 бита.

Цитата
IHL (длина Internet заголовка) 4 бита
Длина Internet заголовка измеряется в словах по 32 бита каждый и
указывает на начало поля данных. Заметим, что корректный заголовок
может иметь минимальный размер 5 слов.


Дополняем нашу структуру:

Код
struct ip_header
{
    unsigned int version: 4;
    unsigned int ihl: 4;
}

Далее у нас идет Type of Service-8 бит.
Для этого поля лучше создать свою структуру

Цитата
Type of Service (тип сервиса) 8 бит
Тип сервиса определяет с помощью неких абстрактных параметров тип
требуемого обслуживания. Эти параметры должны использоваться для
управления выбором реальных рабочих характеристик при передаче
датаграммы через конкретную сеть. Некоторые сети осуществляют
обслуживание с приоритетом, которое неким образом дает преимущество
для продвижения данной датаграммы по сравнению со всеми остальными.
Реально выбор осуществляется между тремя альтернативами: малой
задержкой, высокой достоверностью и высокой пропускной способностью.
биты 0-2 приоритет
бит 3 0 - нормальная задержка, 1 - малая задержка
бит 4 0 - нормальная пропускная способность,
1 - высокая пропускная способность
бит 5 0 - обычная достоверность, 1 - высокая достоверность
биты 6-7 зарезервированы
0 1 2 3 4 5 6 7
+-----+-----+-----+-----+-----+-----+-----+-----+
| приоритет | D | T | R | 0 | 0 |
+-----+-----+-----+-----+-----+-----+-----+-----+


Разъяснять написание структуры уж не буду,просто приведу ее в конце.
Структура так и будет называться TypeOfService;
Дополняем структуру IP заголовка.

Код
struct ip_header
{
    unsigned int version: 4;
    unsigned int ihl: 4;
    struct TypeOfService typeServ;
}

Total Length,Identification.
Оба по 16 бит,то есть два байта.

Цитата
Total Length (общая длина) 16 бит
Общая длина - это длина датаграммы, измеренная в октетах, включая
Internet заголовок и поле данных. Это поле может задавать длину
датаграммы вплоть до 65535 октетов. В большинстве хост-компьютеров и
сетей столь большие датаграммы не используются. Все хосты должны быть
готовы принимать датаграммы вплоть до 576 октетов длиной (приходят ли
они целиком или по фрагментам). Хостам рекомендуется отправлять
датаграммы размером более чем 576 октетов, только если они уверены,
что принимающий хост готов обслуживать датаграммы повышенного
размера.
Значение 576 выбрано с тем, чтобы соответсвующим образом
ограниченный блок данных передавался вместе с требуемой информацией в
заголовке. Например, этот размер позволяет заполнять датаграмму полем
данных размером в 512 октетов и заголовком в 64 октета. Наибольший
Internet заголовок занимает 60 октетов, а его типичный размер
составляет всего 20 октетов, что оставляет место под заголовки
протоколов более высокого уровня.
Identification (идентификатор) 16 бит
Идентификатор устанавливается отправителеим для сборки фрагментов
какой-либо датаграммы.



А два байта у нас занимает тип short.
Дописываем

Код
struct ip_header
{
    unsigned int version: 4;
    unsigned int ihl: 4;
    struct TypeOfService typeServ;
    short length;
    short id;
}


Далее поле Flags,занимает 3 бита.В переводе RFC по ссылке,которую я дал
ошибка,там написано 16 бит.На самом деле 3.

Цитата
Flags (различные управляющие флаги) 3 бита
бит 0 зарезервирован, должен быть нуль
бит 1 (DF) 0 - возможно фрагментирование, 1 - запрет фрагментации
бит 2 (MF) 0 - последний фрагмент, 1 - будут еще фрагменты
0 1 2
+----+----+----+
| 0 | DF | MF |
+----+----+----+

Дорисываем в структуру еще одно значение.

Код
unsigned int flags:3;


unsigned int везде пишу не по каким-то правилам,а так,от балды smile.gif

Далее:
Цитата
Fragment Offset (смещение фрагмента) 13 бит
Это поле показывает, где в датаграмме находится этот фрагмент.
Смещение фрагмента изменяется порциями по 8 октет (64 бита). Первый
фрагмент имеет смещение нуль.


Код
unsigned short offset: 13;


Далее у нас идет время жизни в размере 8 бит или одного байта.

Цитата
Time to Live (Время жизни) 8 бит
Это поле показывает максимальное время, в течении которого датаграмме
позволено находиться в системе Internet. Если это поле имеет значение
нуль, то датаграмма должна быть разрушена. Значение этого поля
изменяется при обработке заголовка Internet. Время измеряется в
секундах. Однако, поскольку каждый модуль, обрабатывающий датаграмму,
должен уменьшать значение поля TTL по крайней мере на единицу, даже
если он обрабатываетт эту датаграмму менне, чем за секунду, то поле
TTL следует понимать как максимальный интервал времени, в течении
которого датаграмма может сущенствовать. Внимание следует обратить на
разрушение датаграмм, не могущих достигнуть получателя, а также на
ограничение времени жизни датаграммы.

Подойдет тип char.
Дописываем.

Код
unsigned char timeLive;


Далее идет протокол в размере 8 бит,протоколы описаны в документе "Assigned Numbers".
В сети не составит труда его найти.

Цитата
Protocol (Протокол) 8 бит
Это поле показывает, какой протокол следующего уровня использует
данные из Internet датаграммы. Значения для различных протоколов
приводятся в документе "Assigned Numbers" [9].

Код
unsigned char proto;


Цитата
Header Checksum (Контрольная сумма заголовка) 16 бит
Поскольку некоторые поля заголовка меняют свое значение (например,
время жизни), это значение проверяется и повторно рассчитывается при
каждой обработке Internet заголовка.
Алгоритм контрольной суммы следующий:
Поле контрольной суммы - это 16 бит, дополняющие биты в сумме всех
16 битовых слов заголовка. Для вычисления контрольной суммы
значение этого поля устанавливается в нуль.
Контрольную сумму легко рассчитать и опытным путем доказать ее
адекватность, однако это временная мера и должна быть заменена CRC
процедурой в зависимости от дальнейшего опыта.

Дописываем поле для контрольной суммы.

Код
unsigned short ckeksum;


Далее идут адреса отправителя и получателя.
Цитата
Source Address (адрес отправителя) 32 бита
Destination Address (адрес получателя) 32 бита

Здесь не будем ничего придумывать своего,а исполльзуем уже определенную структуру
для IP адресов.
Код
struct in_addr source_addr;
struct in_addr dest_addr;


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

Ну и в конце привожу,как все это выглядит вместе.

Код
struct TypeOfService
{
    unsigned int Priority: 3;
    unsigned int D: 1;
    unsigned int T: 1;
    unsigned int R: 1;
    unsigned int reserved:2;
}

struct ip_header
{
    unsigned int version: 4;
    unsigned int ihl: 4;
    struct TypeOfService typeServ;
    unsigned short length;
    unsigned short id;
    unsigned int flags:3;
    unsigned short offset: 13;
    unsigned char timeLive;
    unsigned char proto;
    unsigned short ckeksum;
    struct in_addr source_addr;
    struct in_addr dest_addr;
}


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

©btrfly, 2008;

Автор: ReindeeR 4:05:2008, 23:35


p.s.
в некоторых импровизированных таблицах все сбилось sad.gif ,
так что лучше смотреть в оригинале.

Автор: S-haman 10:05:2008, 21:11

Спасибо хороший ответ ))
Всё изложено грамотно и доступно ))
Остался только один вопрос а как получить мак адрес получателя и отправителя, пробовал создавать структру как и для ап адресса, но забивает ерундой, в той структуре что написана там просто адресс источника и приемника 32 бита это только под ап отводится а как тогда мак достать?

Автор: ReindeeR 10:05:2008, 21:21

мак передается в ethernet заголовке.
в IP заголовке соответственно айпи получателя и отправителя.

ап.
и если ARP,то мак можно еще и оттуда выудить.

Автор: S-haman 21:05:2008, 17:17

Есть ли возможность получить имя компютера, тоесть оно передаеться в пакете или нет?
Как можно узнать конечный/начальный адресс назначения, тоесть если я к примеру получаю данные от компютера из интернета, посредством тогоже торрента, у меня сниффер получает адресс шлюза , а не той машини.

Автор: ReindeeR 1:06:2008, 13:48

Цитата(S-haman @ 21:05:2008 - 21:17) *
Есть ли возможность получить имя компютера, тоесть оно передаеться в пакете или нет?

точно не помню,но вроде можно.погуглите на этот счет.
Цитата(S-haman @ 21:05:2008 - 21:17) *
Как можно узнать конечный/начальный адресс назначения, тоесть если я к примеру получаю данные от компютера из интернета, посредством тогоже торрента, у меня сниффер получает адресс шлюза , а не той машини.

с торрентами никогда не связывался,так что предположение:
посмотрите протокол торрента,как и че там устроено.
из айпи заголовков скорее всего нельзя вытянуть,так как там указывается шлюз сервера.

Форум Invision Power Board (http://nulled.ws)
© Invision Power Services (http://nulled.ws)