一个端口就是一个潜在的通信通道,也是一个入侵通道。对计算机进行端口扫描能得到许多有用的信息。进行扫描的方法有多种,可以手动进行扫描,也可以用端口扫描软件进行。在手工进行扫描时,需要熟悉各种命令,对命令执行后的输出进行分析。用扫描软件进行扫描时,扫描软件可以做相应的数据分析功能。
本文介绍了扫描器工作原理及技术优点,最后用程序制作一个简单扫描器。
二、扫描器工作原理及技术优点
扫描器是一种自动检测远程或本地主机安全性弱点的程序,通过使用扫描器可以不留痕迹地发现远程服务器的各种TCP端口的分配及提供的服务和它们所使用的软件版本!这些信息可以间接地了解远程主机所存在的安全问题。
扫描器的工作原理是:通过连接远程TCP/IP不同端口,并记录目标给予的应答。通过这种方法,可以搜集到很多有关主机的各种信息(是否能够匿名登录;是否有可写的FTP目录;是否能用TELNET;HTTPD是用ROOT还是nobady在运行……)。
扫描器的一个主要功能就是发现一个主机或网络并检查有什么服务正运行在这台主机上,更进一步还能测试这些服务,发现系统漏洞。要实现这些功能,只需要采用罪简单的TCP connect()扫描。操作系统提供的connect()系统调用,用来与每一个目标计算机端口进行连接。如果端口处于侦听状态,那么connect()就能够成功;否则这个端口不能使用,即没有提供服务。
这个技术的最大有点是:无需任何权限。系统中的任何用户都有权利使用这个调用。另一个好处是速度,如果对每个目标端口以线性的方式,使用单独的connect()调用,那将会花费相当长的时间。我们可以同时打开多个socket,从而加速扫描。使用非阻塞I/O允许设置一个较低的时间用尽周期,同时观察多个socket。
三、程序实现步骤
① 用AppWizard建立一个基于对话框的应用程序,注意,程序需要选择支持WinSocket。
为对话框添加资源,得到如下图一个界面。上面为一个IP地址,下面为一个编辑框,添加按钮“扫描”,它的ID为ID_SCAN。
② 添加控制变量,如下表:
③ 添加函数TestConnection
函数主要通过建立一个SOCKET,然后通过CONNECT方法测试端口是否打开。主要代码如下:
bool CPortScanDlg ::TestConnection (CString IP , UNIT nPort)
{
CSocket* pSocket;
pSocket = new CSocket;
ASSERT ( pSocket );
If ( !pSocket -> Create ( ) )
{
delete pSocket;
pSocket = Null;
return FALSE;
}
while ( ! pSocket ->Connect ( IP , nPort ) )
{
delete pSocket ;
pSocket = NULL ;
return FALSE ;
}
pSocket -> close ( );
delete pSocket ;
return TRUE ;
}
④ 为ID_SCAN 添加函数。
简单接受数据,并调用TestConnection ( ip , port ) 函数就可以了。
至此,端口扫描程序就完成了,它实现了很简单的检测端口的功能。