如何在Perl中获得原始套接字,然后构建与其一起使用的数据包的最佳方法是什么?
答案 0 :(得分:7)
与在C中执行的方式相同...通过在创建套接字时设置套接字类型。
在CPAN上的示例中,使用 SOCK_RAW 而不是 SOCK_DGRAM (UDP)或 SOCK_STREAM (TCP)。
注意:创建原始套接字通常需要管理权限(即UNIX上的root用户)。 Windows操作系统可能已禁用创建原始套接字的功能,您只需测试并查看即可。
答案 1 :(得分:6)
也许搜索CPAN可能会有所帮助?想到IO::Socket。
答案 2 :(得分:5)
起初我以为大多数先前的答案都没有回答这个问题。 经过进一步思考,我认为作者可能没有提出正确的问题。
如果您正在编写应用程序,通常不会想到“构建数据包”。你只需打开套接字,格式化数据有效负载,它就是用你的数据构建数据包的协议栈。好的,如果您正在使用数据报,则需要定义,生成和解析有效负载。但是,您通常让内核将其封装在网络级别(例如添加IP头)或链接层(例如添加以太网帧)。你通常不使用pcap。有时只需打包和打包,也许vec就足够了。
如果你正在编写一个不寻常的数据包处理器,例如主动恶意攻击工具,中间人进程或流量整形设备,那么就更有可能“构建数据包”并使用pcap 。也许Net :: Packet也适合你。
答案 3 :(得分: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;
答案 4 :(得分: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: $!";
答案 5 :(得分:1)
获取套接字的基本调用是... socket()。它标配perl 5. perl 5基本上为您提供传统UNIX所做的标准socket(),bind(),listen(),accept()调用。
对于更面向对象的模型,请查看IO :: Socket。
答案 6 :(得分:0)
请注意,如果您尝试使用原始套接字发送一堆SYN数据包,而您只是“使用Socket;”这将填满你的ARP表并用“无缓冲区空间”和“netstat”中的一堆“CLOSE_WAIT”条目进行轰炸(这会阻止你的机器再做任何类型的连接,直到它们中的一些空闲)。
或换句话说 - 你真的需要Net :: RawIP - 它会有所作为。