4

Perl でrawソケットを取得するにはどうすればよいでしょうか? また、それを使用するためのパケットを構築する最良の方法は何ですか?

4

7 に答える 7

7

Cで行うのと同じ方法...ソケットを作成するときにソケットタイプを設定します。

CPANの例では、 SOCK_DGRAM (UDP) またはSOCK_STREAM (TCP)ではなく、SOCK_RAWを使用します。

注: raw ソケットの作成には通常、管理者権限 (つまり、UNIX の root) が必要です。Windows OS では、raw ソケットを作成する機能が無効になっている可能性があります。テストして確認する必要があります。

于 2008-10-13T20:52:08.190 に答える
6

おそらくCPANを検索すると役立つでしょうか? IO::ソケットが思い浮かびます。

于 2008-10-13T20:39:48.417 に答える
5

最初は、以前の回答のほとんどが質問に反応していないと思っていました。さらに考えてみると、著者はおそらく正しい質問をしていないと思います。

アプリケーションを作成している場合、通常、「パケットの構築」について考えることはありません。ソケットを開き、データ ペイロードをフォーマットするだけで、データでパケットを構築するのはプロトコル スタックです。OK、データグラムを使用している場合は、ペイロードを定義、生成、および解析する必要があります。しかし、通常はネットワーク レベル (例: IP ヘッダーの追加) またはリンク レイヤー (例: イーサネット フレームの追加) でカーネルにカプセル化させます。通常、pcap は使用しません。場合によっては、パックしてアンパックするだけで、おそらく vec で十分です。

アクティブな敵対的攻撃ツール、man-in-the-middle プロセス、またはトラフィック シェーピング デバイスなどの異常なパケット プロセッサを作成している場合は、「パケットを作成」して 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

raw ソケットを使用して SYN パケットの山を送信しようとしていて、「ソケットを使用する」だけであることに注意してください。それはあなたのARPテーブルをいっぱいにし、「利用可能なバッファスペースがありません」と「netstat」の「CLOSE_WAIT」エントリのスタックで爆撃します(これにより、マシンは、それらのいくつかが解放されるまで、あらゆる種類の接続を停止します)。

言い換えれば、Net::RawIP が本当に必要なのです - それが違いを生むのです。

于 2014-03-13T04:12:16.360 に答える