Настольная книга компьютерного исследователя


Программирование raw сокетов

Эта статья написана для того,что бы ознакомить вас с такой темой, как программирование сырых(raw) сокетов(sockets). Для чего это нужно? Это даст вам больше возможностей в сетевом программировании, вы сможете писать разнообразные сканеры, спуферы и т.д. Вы сможете получить полный контроль на передаваемыми пакетами.

Чтобы понять ту пургу, которую я буду излагать дальше, вы должны обладать базовыми знаниями в программировании сокетов, если вы не имеете таковых советую прочитать 1 статью  »Программирование сокетов».

Ну что ж, поехали!

Как же открыть 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: для определения последовательности

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 это статья писалась для *nix систем,но весь код можно с легкостью переколбасить под другую операционную систему



©2015 Журнал Хакера Entries (RSS) and Comments (RSS)