C++ C++ C# C# ASP.NET Security ASP.NET Security ASM ASM Скачать Скачать Поиск Поиск Хостинг Хостинг  
  Программа для работы с LPT портом...
Язык: .NET — ©Alexey...
  "ASP.NET Atlas" – AJAX в исполнении Micro...
Язык: .NET — ©legigor@mail.ru...
  "Невытесняющая" Многопоточность...
Язык: C/C++ — ©...
  01.05.2010 — Update World C++: Сборник GPL QT исходников
  15.12.2007 — Весь сайт целиком можно загрузить по ссылкам из раздела Скачать
Хостинг:
Windows 2003, ASP.NET 2.0
бесплатный и от 80 руб./мес


   Отправить письмо
Кулабухов Артем, Беларусь




 Программирование raw сокетов под bsd / Сокеты / Сеть

Эта статья написана для того,что бы ознакомить вас с такой темой, как:программирование сырых(raw) сокетов(sockets)
нахрена нам это нужно?.это даст вам больше возможностей в сетевом программировании,вы сможете писать разнообразные
сканеры,спуферы итд. вы сможете получить полный контроль на передаваемыми пакетами.
что бы понять ту пургу,которую я буду излагать дальше, вы должны обладать базовыми знаниями в программировании
сокетов,если вы не имеете таковых советую прочитать 1 статью из 3-его Night Fall'a "Программирование сокетов"
написанную napalmed'ом.
ну что ж, поехали!
как же открыть raw socket,да очень просто int s = socket (PF_INET, SOCK_RAW, IPPROTO_TCP);
далее структуры

  struct ip *iph = (struct ip *) datagram;
  struct tcphdr *tcph = (struct tcphdr *) datagram + sizeof (struct ip);
  struct sockaddr_in sin;

теперь о структурах заголовков протоколов

1.IP-протокол служащий для доставки пакетов до нужного адреса

struct ipheader {
 unsigned char ip_hl:4, ip_v:4; это значит,что каждая часть 4 бита
 unsigned char ip_tos;
 unsigned short int ip_len;
 unsigned short int ip_id;
 unsigned short int ip_off;
 unsigned char ip_ttl;
 unsigned char ip_p;
 unsigned short int ip_sum;
 unsigned int ip_src;
 unsinged int ip_dst;
};

 общая длина IP заголовков 20 байт
-------------------------------------
ip_hl:длина заголовка в 32 бита октет.это значение 5 для hl в 4 бита,бывают и другие значения
в случае доп. опций в заголовке.

ip_v: версия ip на момент написания статьи 4
ip_tos:обычно 0. первые 3 бита представляют приоритеты роутинга,следующие тип сервиса.
ip_len:общая длина ip датаграммы
ip_id:id последовательности номера пакета
ip_off:фрагментированный оффсет-определяющий переборку фрагментированных датаграм.
первые 3 бита флаги фрагмента-первый=0,второй нефрагментируемый бит,третий для флагов или далее
следующих фрагментированных пакетов
ip_ttl: time to live
ip_p:транспортный протокол(udp,tcp,icmp,igmp..)
ip_sum:контрольная сумма
ip_src:адрес отправителя
ip_dst:адрес получателя

2.ICMP-приложение к IP для контроля над посылаемыми и получаемыми сообщениями

struct icmpheader {
 unsigned char icmp_type;
 unsigned char icmp_code;
 unsigned short int icmp_cksum;
 /* The following data structures are ICMP type specific */
 unsigned short int icmp_id;
 unsigned short int icmp_seq;
};
 максимальная длина ICMP заголовка 8 байт
--------------------------------------------
icmp_type:тип ICMP сообщения(echo request..) остальные типы можно посмотреть в исходниках
icmp_code:для сообщений типа(error) нужно большe? лезь в сорцы
icmp_cksum:контрольная сумма
icmp_id:для идентификации сообщений типа echo
icmp_seq:для определения последовательности 

3.IGMP
про спецификацию протокола IGMP можно будет прочитать в этом выпуске

4.UDP-транспортный протокол передачи датаграм,нечто вроде tcp,но не имеет seq и этим плох или
хорош(spoofing ;)

struct udpheader {
 unsigned short int uh_sport;
 unsigned short int uh_dport;
 unsigned short int uh_len;
 unsigned short int uh_check;
};

 общая длина заголовка 8 байт
--------------------------------
uh_sport:порт обмена данными клиента
uh_dport:тоже самое для сервера
uh_len:длина заголовка
uh_check:контрольная сумма

4.TCP-no comments
struct tcpheader {
 unsigned short int th_sport;
 unsigned short int th_dport;
 unsigned int th_seq;
 unsigned int th_ack;
 unsigned char th_x2:4, th_off:4;
 unsigned char th_flags;
 unsigned short int th_win;
 unsigned short int th_sum;
 unsigned short int th_urp;
};

 общая длина заголовка 20 байт
---------------------------------
th_sport:порт клиента
th_dport:порт сервера
th_seq:последовательность tcp
th_ack:сообщение подтверждения запроса на соединение
th_x2:не используется(0)
th_off:сегмент оффсета определяющий длину TCP заголовка
th_flags:эта область состоит из шести двоичных флагов используемых в заголовках(th_flags=FLAG1)
далее различные флаги из названия которых нетрудно догадаться их предназначение:

TH_URG:,TH_ACK:,TH_PSH:,TH_RST:,TH_SYN:,TH_FIN:

th_win:сумма байтов посылаемых прежде ACK

th_sum:контрольная сумма

к статье прилагается прога с демонстрацией полученных знаний


p.s это статья писалась для BSD систем,но весь код можно с легкостью переколбасить под линукс