AF_PACKET, Win32 raw sockets
От: milkpot Россия  
Дата: 29.11.18 10:53
Оценка:
Здравствуйте,
есть устройство, взаимодействие с которым идёт по ethernet каналу в пакетном режиме.
Посылаются и принимаются пакеты размером 72 байта.
Стоит задача посылать пакет / принимать пакет(ы) с использованием сырых (raw) сокетов.
Под linux есть AF_PACKET для функции socket, под Windows нет.

socket(AF_PACKET, SOCK_RAW, ...);

Единственно, что нашел 1,2 , что под Windows стоит использовать WinPcap.
Re: AF_PACKET, Win32 raw sockets
От: Maniacal Россия  
Дата: 29.11.18 11:02
Оценка:
Здравствуйте, milkpot, Вы писали:

M>Здравствуйте,

M>есть устройство, взаимодействие с которым идёт по ethernet каналу в пакетном режиме.
M>Посылаются и принимаются пакеты размером 72 байта.
M>Стоит задача посылать пакет / принимать пакет(ы) с использованием сырых (raw) сокетов.
M>Под linux есть AF_PACKET для функции socket, под Windows нет.

AF_PACKET зачем?

M>
M>socket(AF_PACKET, SOCK_RAW, ...); 
M>


В винде

To create a socket of type SOCK_RAW, call the socket or WSASocket function with the af parameter (address family) set to AF_INET or AF_INET6, the type parameter set to SOCK_RAW, and the protocol parameter set to the protocol number required. The protocol parameter becomes the protocol value in the IP header (SCTP is 132, for example).

Note

An application may not specify zero (0) as the protocol parameter for the socket, WSASocket, and WSPSocket functions if the type parameter is set to SOCK_RAW.

То есть к примеру
socket(AF_INET, SOCK_RAW, IPPROTO_UDP)

подойдёт. Вместо UDP можно любую цифру, которая будет в заголовке пакета в качестве протокола.
Дальше обычным способом заполняется структура пакета и отсылается sendto. В отличие от Linux'а, в Windows нельзя указывать некорректный адрес отправителя, в остальном всё так же.
Отредактировано 29.11.2018 11:04 Maniacal . Предыдущая версия .
Re: AF_PACKET, Win32 raw sockets
От: Kernan Ниоткуда https://rsdn.ru/forum/flame.politics/
Дата: 29.11.18 11:04
Оценка:
Здравствуйте, milkpot, Вы писали:

M>Под linux есть AF_PACKET для функции socket, под Windows нет.

А разве raw сокеты не запрещены на 7+ винде?
Sic luceat lux!
Re[2]: AF_PACKET, Win32 raw sockets
От: Maniacal Россия  
Дата: 29.11.18 11:09
Оценка:
Здравствуйте, Kernan, Вы писали:

K>Здравствуйте, milkpot, Вы писали:


M>>Под linux есть AF_PACKET для функции socket, под Windows нет.

K>А разве raw сокеты не запрещены на 7+ винде?

Нет, на всех версиях правила одинаковы, но для использования нужны права администратора и адрес отправителя должен быть правильным (типа так позаботились о невозможности разработки софта для syn-flood DoS атак).
Re[3]: AF_PACKET, Win32 raw sockets
От: Kernan Ниоткуда https://rsdn.ru/forum/flame.politics/
Дата: 29.11.18 11:47
Оценка:
Здравствуйте, Maniacal, Вы писали:

M>Нет, на всех версиях правила одинаковы, но для использования нужны права администратора и адрес отправителя должен быть правильным (типа так позаботились о невозможности разработки софта для syn-flood DoS атак).

Можешь привести ссылку на подтверждение?
Вот моя

Limitations on Raw Sockets
On Windows 7, Windows Vista, Windows XP with Service Pack 2 (SP2), and Windows XP with Service Pack 3 (SP3), the ability to send traffic over raw sockets has been restricted in several ways:
TCP data cannot be sent over raw sockets.
UDP datagrams with an invalid source address cannot be sent over raw sockets. The IP source address for any outgoing UDP datagram must exist on a network interface or the datagram is dropped. This change was made to limit the ability of malicious code to create distributed denial-of-service attacks and limits the ability to send spoofed packets (TCP/IP packets with a forged source IP address).
A call to the bind function with a raw socket for the IPPROTO_TCP protocol is not allowed.

По сути, ничего толком сделать будет нельзя.
ЕМНИП, когда я это дело инвестигировал, пришёл к выводу что нужно писать свой минифильтр/драйвер чтобы всё это работало.
Sic luceat lux!
Re[4]: AF_PACKET, Win32 raw sockets
От: Maniacal Россия  
Дата: 29.11.18 12:16
Оценка:
Здравствуйте, Kernan, Вы писали:

K>

K>Limitations on Raw Sockets
K>On Windows 7, Windows Vista, Windows XP with Service Pack 2 (SP2), and Windows XP with Service Pack 3 (SP3), the ability to send traffic over raw sockets has been restricted in several ways:
K> TCP data cannot be sent over raw sockets.
K> UDP datagrams with an invalid source address cannot be sent over raw sockets. The IP source address for any outgoing UDP datagram must exist on a network interface or the datagram is dropped. This change was made to limit the ability of malicious code to create distributed denial-of-service attacks and limits the ability to send spoofed packets (TCP/IP packets with a forged source IP address).
K> A call to the bind function with a raw socket for the IPPROTO_TCP protocol is not allowed.

K>По сути, ничего толком сделать будет нельзя.
K>ЕМНИП, когда я это дело инвестигировал, пришёл к выводу что нужно писать свой минифильтр/драйвер чтобы всё это работало.
Я и говорю, всего два ограничения: нельзя обратный адрес не свой указывать для UDP и в качестве протокола использовать TCP. Всё чтобы хакерам палки в колёса вставить. Так было с самого начала, т.е. с Windwows XP SP2 в котором ввели поддержку RAW-scokets. Кроме DoS-атак такая функциональность ни к чему.
Re[2]: AF_PACKET, Win32 raw sockets
От: milkpot Россия  
Дата: 30.11.18 13:53
Оценка:
Здравствуйте, Maniacal, Вы писали:

M>Здравствуйте, milkpot, Вы писали:


M>>Здравствуйте,

M>>есть устройство, взаимодействие с которым идёт по ethernet каналу в пакетном режиме.
M>>Посылаются и принимаются пакеты размером 72 байта.
M>>Стоит задача посылать пакет / принимать пакет(ы) с использованием сырых (raw) сокетов.
M>>Под linux есть AF_PACKET для функции socket, под Windows нет.

M>AF_PACKET зачем?

Есть исходный текст приложения под linux как пример, где используется socket c параметром AF_PACKET.
Сам планирую использовать в своём приложении сокет с параметром AF_INET.
M>>
M>>socket(AF_PACKET, SOCK_RAW, ...); 
M>>


M>В винде

M>

M>To create a socket of type SOCK_RAW, call the socket or WSASocket function with the af parameter (address family) set to AF_INET or AF_INET6, the type parameter set to SOCK_RAW, and the protocol parameter set to the protocol number required. The protocol parameter becomes the protocol value in the IP header (SCTP is 132, for example).

M>Note

M>An application may not specify zero (0) as the protocol parameter for the socket, WSASocket, and WSPSocket functions if the type parameter is set to SOCK_RAW.

M>То есть к примеру
M>
M>socket(AF_INET, SOCK_RAW, IPPROTO_UDP)
M>

M>подойдёт. Вместо UDP можно любую цифру, которая будет в заголовке пакета в качестве протокола.
M>Дальше обычным способом заполняется структура пакета и отсылается sendto. В отличие от Linux'а, в Windows нельзя указывать некорректный адрес отправителя, в остальном всё так же.
Re[5]: AF_PACKET, Win32 raw sockets
От: ononim  
Дата: 30.11.18 15:17
Оценка:
M>Я и говорю, всего два ограничения: нельзя обратный адрес не свой указывать для UDP и в качестве протокола использовать TCP. Всё чтобы хакерам палки в колёса вставить. Так было с самого начала, т.е. с Windwows XP SP2 в котором ввели поддержку RAW-scokets. Кроме DoS-атак такая функциональность ни к чему.
В XP SP2 не поддержку RAW sockets ввели, а ограничили их.
Я лично на RAW socket-тах TCP пакеты руками делал еще на NT4.02000й. И не (только ) для syn attack.
И да, с выходдом ХР СП2 — пришлось переехать на winpcap.
Как много веселых ребят, и все делают велосипед...
Отредактировано 30.11.2018 20:05 ononim . Предыдущая версия . Еще …
Отредактировано 30.11.2018 15:23 ononim . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.