4

您如何在 Perl 中获得原始套接字,那么构建用于它的数据包的最佳方法是什么?

4

7 回答 7

7

与在 C 中所做的相同...通过在创建套接字时设置套接字类型。

CPAN的示例中,使用SOCK_RAW而不是SOCK_DGRAM (UDP) 或SOCK_STREAM (TCP)。

注意:创建原始套接字通常需要管理权限(即 UNIX 上的 root)。Windows 操作系统可能禁用了创建原始套接字的功能,您只需对其进行测试并查看即可。

于 2008-10-13T20:52:08.190 回答
6

也许搜索CPAN可能会有所帮助? 我想到了IO::Socket 。

于 2008-10-13T20:39:48.417 回答
5

起初我认为大多数以前的答案都没有回应这个问题。经过进一步思考,我认为作者可能没有问对正确的问题。

如果您正在编写应用程序,您通常不会想到“构建数据包”。您只需打开套接字,格式化数据有效负载,它就是使用您的数据构建数据包的协议栈。好的,如果您使用数据报,您确实需要定义、生成和解析您的有效负载。但是您通常让内核将其封装在网络级别(例如添加 IP 标头)或链路层(例如添加以太网帧)。您通常不使用 pcap。有时只需打包和解包,也许 vec 就足够了。

如果您正在编写一个不寻常的数据包处理器,例如主动恶意攻击工具、中间人进程或流量整形设备,那么更有可能是“构建数据包”并使用 pcap。也许 Net::Packet 也适合你。

于 2008-10-13T23:35:21.557 回答
4

看起来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;
于 2008-10-13T21:05:55.337 回答
4

正如 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: $!";
于 2008-10-13T22:12:44.563 回答
1

获取套接字的基本调用是...socket()。它是 perl 5 的标准配置。perl 5 基本上为您提供了传统 UNIX 所做的标准 socket()、bind()、listen()、accept() 调用。

对于更面向对象的模型,请查看 IO::Socket。

于 2008-10-13T20:44:42.837 回答
0

请注意,如果您尝试使用原始套接字发送一堆 SYN 数据包,那么您只需“使用 Socket;” 这将填满您的 ARP 表并用“没有可用的缓冲区空间”和“netstat”中的一堆“CLOSE_WAIT”条目轰炸(这会阻止您的机器进行任何类型的更多连接,直到其中一些被释放)。

或者换句话说 - 你确实需要 Net::RawIP - 它会有所作为。

于 2014-03-13T04:12:16.360 回答