2008-10-13 30 views

回答

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; 
6

也許搜索CPAN可能有幫助嗎?想起了IO::Socket

+1

這解釋了常規套接字,但我如何構建* raw *套接字並設置其參數? – raldi 2008-10-13 21:11:16

+2

如果你知道你在做什麼,你應該可以使用IO :: Socket構造函數的socktype和protocol參數來完成它。 – 2008-10-13 21:38:08

+0

如果我知道我在做什麼,我就不會在這裏。 :) – raldi 2008-10-14 02:45:21

1

獲取套接字的基本調用是...... socket()。它帶有標準的perl 5. perl 5基本上爲您提供傳統UNIX所執行的標準socket(),bind(),listen(),accept()調用。

對於更多面向對象的模型,請查看IO :: Socket。

7

通過在創建套接字時設置套接字類型,您可以在C中執行相同的操作。

在該例子上CPAN使用SOCK_RAW而非SOCK_DGRAM(UDP)或SOCK_STREAM(TCP)。

注意:創建原始套接字通常需要管理權限(即UNIX上的root)。 Windows操作系統可能已經禁用了創建原始套接字的能力,您只需測試一下即可看到。

+0

您鏈接的頁面沒有提到原始套接字。 – raldi 2008-10-13 21:12:02

3

由於austirg和其他人說,插座將這樣做只是罰款:

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

起初我想,大多數以前的答案對這個問題沒有迴應。 經過進一步的思考,我認爲作者可能沒有提出正確的問題。

如果你正在編寫一個應用程序,你通常不會想到「構建數據包」。您只需打開套接字,格式化數據有效載荷,並且它是與您的數據一起構建數據包的協議棧。好的,如果你使用數據報,你需要定義,生成和分析你的有效載荷。但是,通常讓內核在網絡級別(例如添加IP標頭)或鏈路層(例如添加以太網幀)封裝它。你通常不使用pcap。有時候只是打包和解包,也許vec就足夠了。

如果你正在編寫一個不尋常的數據包處理器,例如一個活躍的惡意攻擊工具,一箇中間人過程或一個流量整形設備,那麼它將更有可能是「構建數據包」並使用PCAP。也許Net :: Packet也適合你。

0

請注意,如果您嘗試使用原始套接字發送一堆SYN數據包,並且您只是「使用套接字」;這將填滿你的ARP表,並用「無緩衝空間」和「netstat」中的一堆「CLOSE_WAIT」條目進行彈出(這會阻止你的機器進行任何類型的連接,直到它們中的一部分空閒)。

換句話說 - 你真的需要Net :: RawIP - 它有所作爲。