writer:demonalex email:demonalex@hackermail.com 想不到现在的‘冲击波’系列蠕虫蔓延得比‘SARS’(非典型肺炎)还要快,导致许多网络的网管都把ICMP给禁止掉了。 在论坛里的网友们都在为找个‘小肉机’而弄得‘沸腾’起来。 “PING不到,怎么知道那台机器在线哪台机器不在线啊....?” 经验老到的网友就会‘祭’出X-SCAN,使用“无条件扫描’,噢,有‘东西’看了...... “为什么可以扫到呢?”笔者小神QQ里又有‘好友’的信息跳出来了...... 如果您是玩过SOCKET的人您当然不会问我了。其实楼上问的只是简单的SOCKET CONNECT扫描而已。 说说SOCKET扫描吧,其实SOCKET扫描有很多种,主要有针对低层的IP扫描(PING就是其中一种,用的是ICMP包),和针对 高层的(TCP,UDP)。而我们通常扫TCP端口的就是connect扫描、SYN扫描、FIN扫描这三种了(connect扫描与SYN扫 描可以使用X-SCAN,FIN扫描可以使用NMAP)。 说说最常用的connect扫描吧,它的原理就是调用SOCKET API(套接字应用程序接口)中的connect()直接向远程 机器发送连接请求,并通过套接字是否能建立连接来辨别其端口的状态。它的特点是:速度慢,容易被对方发现,但准 确性高。 “不用扫描器能使用connect扫描吗?” 可以,不过不能光依赖系统,系统并没有提供调用SOCKET API的程序,能操作SOCKET API就只能依赖有SOCKET API接口 的编程语言了。在笔者眼里玩SOCKET最方便的就莫过于PERL了。现在示范一下如何使用Perl中的IO::Socket包写单端口CON- NECT扫描器吧(楼下‘#‘符号后为注释部分): #!usr/bin/perl -w #PERL程序开头标式 use IO::Socket; #载入IO::Socket包 $remote_host=$ARGV[0]; #程序后紧跟的第一个参数为远程主机地址 $remote_port=$ARGV[1]; #第二个参数为所要探测远程主机的端口 $sock=IO::Socket::INET->new(PeerAddr=>$remote_host,PeerPort=>$remote_port,Timeout=>60); #楼上一行为新建一个IO::Socket::INET对象$sock,其参数PeerAddr为远程主机地址,参数PeerPort #为需要探测的远程主机端口,参数‘超时值’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; #退出程序 讲解:楼上程序的第一行与倒数最后两行其实可以不写,只是笔者为了程序的可移植性与写C程序的作风而‘硬’加上去的, 大家可以不写。第二行载入IO::Socket包是必要的,不加载此包的话就无法定义IO::Socket::INET对象了。数组@ARGV为 PERL的保留数组,用于表示使用程序时后面紧跟的参数的。条件语句中使用‘是否定义了SOCKET对象’作为辨别条件是因 为建立SOCKET对象时其实已经调用了connect()了,所以只要辨别楼上已建立的SOCKET对象变量$sock是否被定义了就可以 知道连接是否成功了。 完成了。那如何做一个可以扫描一个IP段的端口或扫描同一IP的一个端口段的connect()扫描程序呢?聪明的您应该会 想到循环语句了吧?!由于本文的篇幅有限,小神就不再对此多说了,如果您想知道更多的资料或了解更多关于PERL与PERL SOCKET API的知识的话,可以到小神的主页http://demonalex.去看看哦:) |
|