代码之家  ›  专栏  ›  技术社区  ›  raldi

如何在Perl中使用原始套接字?

  •  4
  • raldi  · 技术社区  · 16 年前

    你怎么能得到 未经加工的 Perl中的socket,那么构建一个用于它的包的最佳方法是什么?

    7 回复  |  直到 11 年前
        1
  •  7
  •   oz10    16 年前

    就像你在C中做的那样…通过在创建套接字时设置套接字类型。

    在上的示例中 CPAN 使用 索克生 而不是 Sokkgdg (UDP)或 Sok溪 (TCP)。

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

        2
  •  6
  •   brian d foy    15 年前

    也许是搜索 CPAN 有帮助吗? IO::Socket 浮现在脑海中。

        3
  •  5
  •   Liudvikas Bukys    16 年前

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

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

    如果你正在写一个不寻常的包处理器,比如一个活跃的恶意攻击工具,一个处于中间进程的人,或者一个流量整形设备,那么你更有可能正在“构建包”并使用PCAP。也许网:包也是给你的。

        4
  •  4
  •   Leon Timmermans    16 年前

    正如Austig和其他人所说,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
  •  4
  •   brian d foy    15 年前

    看起来像 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;
    
        6
  •  1
  •   edebill    16 年前

    获取套接字的基本调用是…SoCK()它是Perl5的标准配置。Perl5基本上提供了传统Unix所做的标准socket()、bind()、listen()、accept()调用。

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

        7
  •  -1
  •   cnd    11 年前

    请注意,如果您试图使用原始套接字发送一堆SYN数据包,而您只是“使用套接字”;这将填充您的ARP表,并用“没有可用缓冲空间”和“netstat”中的一堆“close-wait”(关闭等待)条目进行轰炸(这将停止您的机器进行任何类型的连接,直到其中一些释放)。

    或者换句话说——你确实需要net::rawip——这会有所不同。