Как использовать сырые сокеты в Perl? - PullRequest
4 голосов
/ 14 октября 2008

Как вы можете получить raw сокет в Perl, и как лучше всего построить пакет для использования с ним?

Ответы [ 7 ]

7 голосов
/ 14 октября 2008

Так же, как вы делаете это в C ..., устанавливая тип сокета при создании сокета.

В примере на CPAN используйте SOCK_RAW вместо SOCK_DGRAM (UDP) или SOCK_STREAM (TCP).

ПРИМЕЧАНИЕ. Для создания сырых сокетов обычно требуются права администратора (т. Е. Root в UNIX). В ОС Windows может быть отключена возможность создания необработанных сокетов, вам просто нужно проверить это и посмотреть.

6 голосов
/ 14 октября 2008

Возможно, поиск CPAN может помочь? IO :: Socket приходит на ум.

5 голосов
/ 14 октября 2008

Сначала я думал, что большинство предыдущих ответов не отвечали на вопрос. После дальнейших размышлений, я думаю, что автор, вероятно, не задает правильный вопрос.

Если вы пишете приложение, вы обычно не думаете о «сборке пакетов». вы просто открываете сокеты, форматируете полезную нагрузку данных, и это стек протоколов, который создает пакеты с вашими данными. Хорошо, если вы используете дейтаграммы, вам нужно определить, сгенерировать и проанализировать ваши полезные нагрузки. Но вы обычно позволяете ядру инкапсулировать его на сетевом уровне (например, добавить заголовок IP) или на канальном уровне (например, добавить кадрирование Ethernet). Вы обычно не используете pcap. Иногда просто упакуйте и распакуйте, и, возможно, достаточно vec.

Если вы пишете необычный пакетный процессор, такой как активный инструмент враждебной атаки, процесс «человек посередине» или устройство формирования трафика, то с большей вероятностью будет «собирать пакеты» и использовать pcap , Может, Net :: Packet и для вас.

4 голосов
/ 14 октября 2008

Как сказали austirg и другие, Socket сделает это очень хорошо:

use Socket;

socket my $socket, PF_INET, SOCK_RAW, 0 or die "Couldn't create raw socket: $!";

send $socket, $message, $flags, $to or die "Couldn't send packet: $!";

my $from = recv $socket, $message, $length, $flags or die "Couldn't receive from socket: $!";
4 голосов
/ 14 октября 2008

Похоже, Net :: RawIP было то, что я искал:

use Net::RawIP;
$a = new Net::RawIP;
$a->set({ip => {saddr => 'my.target.lan',daddr => 'my.target.lan'},
         tcp => {source => 139,dest => 139,psh => 1, syn => 1}});
$a->send;

$a->ethnew("eth0");
$a->ethset(source => 'my.target.lan',dest =>'my.target.lan');      
$a->ethsend;

$p = $a->pcapinit("eth0","dst port 21",1500,30);
$f = dump_open($p,"/my/home/log");
loop $p,10,\&dump,$f;
1 голос
/ 14 октября 2008

Основной вызов для получения сокета - это ... socket (). Стандартно поставляется с Perl 5. Perl 5 в основном дает вам стандартные вызовы socket (), bind (), listen (), accept (), которые делает традиционный UNIX.

Для более объектно-ориентированной модели, проверьте IO :: Socket.

0 голосов
/ 13 марта 2014

Имейте в виду, что если вы пытаетесь использовать необработанные сокеты для отправки стопки пакетов SYN, и вы просто "используете Socket;" это приведет к заполнению ваших таблиц ARP и получению «Нет доступного буферного пространства» и стека записей «CLOSE_WAIT» в «netstat» (что останавливает вашу машину при выполнении любых других подключений, пока некоторые из них не освободятся).

Или другими словами - вам действительно нужен Net :: RawIP - это имеет значение.

...