writer:demonalex
email:demonalex@hackermail.com
想不到現(xiàn)在的‘沖擊波’系列蠕蟲蔓延得比‘SARS’(非典型肺炎)還要快,導致許多網(wǎng)絡的網(wǎng)管都把ICMP給禁止掉了。
在論壇里的網(wǎng)友們都在為找個‘小肉機’而弄得‘沸騰’起來。
“PING不到,怎么知道那臺機器在線哪臺機器不在線啊....?”
經(jīng)驗老到的網(wǎng)友就會‘祭’出X-SCAN,使用“無條件掃描’,噢,有‘東西’看了......
“為什么可以掃到呢?”筆者小神QQ里又有‘好友’的信息跳出來了......
如果您是玩過SOCKET的人您當然不會問我了。其實樓上問的只是簡單的SOCKET CONNECT掃描而已。
說說SOCKET掃描吧,其實SOCKET掃描有很多種,主要有針對低層的IP掃描(PING就是其中一種,用的是ICMP包),和針對
高層的(TCP,UDP)。而我們通常掃TCP端口的就是connect掃描、SYN掃描、FIN掃描這三種了(connect掃描與SYN掃
描可以使用X-SCAN,F(xiàn)IN掃描可以使用NMAP)。
說說最常用的connect掃描吧,它的原理就是調用SOCKET API(套接字應用程序接口)中的connect()直接向遠程
機器發(fā)送連接請求,并通過套接字是否能建立連接來辨別其端口的狀態(tài)。它的特點是:速度慢,容易被對方發(fā)現(xiàn),但準
確性高。
“不用掃描器能使用connect掃描嗎?”
可以,不過不能光依賴系統(tǒng),系統(tǒng)并沒有提供調用SOCKET API的程序,能操作SOCKET API就只能依賴有SOCKET API接口
的編程語言了。在筆者眼里玩SOCKET最方便的就莫過于PERL了?,F(xiàn)在示范一下如何使用Perl中的IO::Socket包寫單端口CON-
NECT掃描器吧(樓下‘#‘符號后為注釋部分):
#!usr/bin/perl -w #PERL程序開頭標式
use IO::Socket; #載入IO::Socket包
$remote_host=$ARGV[0]; #程序后緊跟的第一個參數(shù)為遠程主機地址
$remote_port=$ARGV[1]; #第二個參數(shù)為所要探測遠程主機的端口
$sock=IO::Socket::INET->new(PeerAddr=>$remote_host,PeerPort=>$remote_port,Timeout=>60);
#樓上一行為新建一個IO::Socket::INET對象$sock,其參數(shù)PeerAddr為遠程主機地址,參數(shù)PeerPort
#為需要探測的遠程主機端口,參數(shù)‘超時值’Timeout為60秒
if(defined $sock){ #進入條件語句,辨別$sock對象是否已被定義
print("The $remote_host -> $remote_port is opened!\n"); #被定義了,屏幕提示此主機的此端口打開
$sock->close; #關閉SOCKET對象
}else{ #條件語句的值為‘非’時
print("The $remote_host -> $remote_port is closed!\n"); #提示此主機的此端口沒有打開
}
exit 1; #退出程序
講解:樓上程序的第一行與倒數(shù)最后兩行其實可以不寫,只是筆者為了程序的可移植性與寫C程序的作風而‘硬’加上去的,
大家可以不寫。第二行載入IO::Socket包是必要的,不加載此包的話就無法定義IO::Socket::INET對象了。數(shù)組@ARGV為
PERL的保留數(shù)組,用于表示使用程序時后面緊跟的參數(shù)的。條件語句中使用‘是否定義了SOCKET對象’作為辨別條件是因
為建立SOCKET對象時其實已經(jīng)調用了connect()了,所以只要辨別樓上已建立的SOCKET對象變量$sock是否被定義了就可以
知道連接是否成功了。
完成了。那如何做一個可以掃描一個IP段的端口或掃描同一IP的一個端口段的connect()掃描程序呢?聰明的您應該會
想到循環(huán)語句了吧?!由于本文的篇幅有限,小神就不再對此多說了,如果您想知道更多的資料或了解更多關于PERL與PERL
SOCKET API的知識的話,可以到小神的主頁http://demonalex.cnhacker.cn去看看哦:)
本站僅提供存儲服務,所有內容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權內容,請
點擊舉報。