Весь сайт целиком можно загрузить по ссылкам из раздела Скачать
Программирование 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 систем,но весь код можно с легкостью переколбасить под линукс