试验目的:学会制作端口扫描器
端口扫面是网络安全或网络管理中必不可少的.想必大家经常也看到过不少功能强大的扫描器了,比如 流光,Nessus,Nmap,X-Scan等等.这些扫描器聚集了相当强大的功能,网络管理员有了他们能很方便的检测到系统运行状态,以便管理,当然也有的人用他来嗅探别人的主机企图入侵.但是不管哪种,想要更好的运用工具唯一的方法就是熟悉工具.理解他的工作原理.以下列举几点网络扫描的重要性:
-
扫描器能够暴露网络上潜在的脆弱性
-
无论扫描器被管理员利用,或者被黑客利用,都有助于加强系统的安全性.它能使得漏洞被及早发现,而漏洞迟早会被发现的.
-
发现系统存活情况,以及哪些服务在运行;用已知的漏洞测试这些系统;对一批机器进行测试,简单的迭代过程;有进一步的功能,包括操作系统辨识、应用系统识别.
-
当然,他还能满足很多人的好奇心.
下面开始介绍端口扫描器的入门制作.
试验环境:VC++6.0
端口主要有两个参数.一个是string类型ip,一个是int类型port.因此我们先来添加两个变量,如下(本来打算帖图,但是怎么也贴不上去:
控制变量 类型 成员变量
IDC_IPADDRESS CString m_ip
IDC_PORT UINT m_port
然后,我们建立一个TestConnection函数实现扫描过程.
函数主要是通过建立一个Socket,然后通过Connect方法测试端口是否打开.因此测试的结果是True or False, 所以这个TestConnection应该是返回一个bool值的函数.
bool CScanner1Dlg::TestConnection(CString IP , UINT nPort)
{
{
//注意TestConnection里面的2个参数;
CSocket* pSocket;
pSocket = new CSocket;
ASSERT ( pSocket );
if(!pSocket -> Create())
{
delete pSocket;
pSocket = NULL;
return false;
}
while(! pSocket->Connect(IP,nPort))
{
CSocket* pSocket;
pSocket = new CSocket;
ASSERT ( pSocket );
if(!pSocket -> Create())
{
delete pSocket;
pSocket = NULL;
return false;
}
while(! pSocket->Connect(IP,nPort))
{
//这里调用了Connect方法测试端口状态;
delete pSocket ;
pSocket = NULL ;
return false ;
}
pSocket ->Close();
delete pSocket ;
return true ;
}
端口扫描就完成了,下面就是生成报告了. 生成报告这里用一个listbox,listbox中用一个InsertString()函数来完成报告显示.
delete pSocket ;
pSocket = NULL ;
return false ;
}
pSocket ->Close();
delete pSocket ;
return true ;
}
端口扫描就完成了,下面就是生成报告了. 生成报告这里用一个listbox,listbox中用一个InsertString()函数来完成报告显示.
void CScanner1Dlg::OnButton1()
{
// Button1就是扫描按钮. 这里面主要是几个参数传递;
{
// Button1就是扫描按钮. 这里面主要是几个参数传递;
UpdateData(true);
CString strResult;
if (TestConnection(m_ip,m_port))
{
strResult.Format("端口%d开放!",m_port);
// MessageBox(strResult);
m_list.InsertString(-1,strResult);
}
else
{
strResult.Format("端口%d没开放!",m_port);
// MessageBox(strResult);
m_list.InsertString(-1,strResult);
}
}
CString strResult;
if (TestConnection(m_ip,m_port))
{
strResult.Format("端口%d开放!",m_port);
// MessageBox(strResult);
m_list.InsertString(-1,strResult);
}
else
{
strResult.Format("端口%d没开放!",m_port);
// MessageBox(strResult);
m_list.InsertString(-1,strResult);
}
}
检测端口状态就这么点.怎么样,是否觉得不可思议的简单呢??当然这个扫描器可不能上面列举的扫面器相比,因为我们这个扫描器只能一次扫描一个ip地址的一个端口.这当然不能用来实用.更不能用他来管理网络了.因为他的速度实在太慢了. 我们需要的是一次能扫描几十个甚至几百个IP并且要满足每个ip的所有端口都能一次扫描到,而且不影响其他程序运行.这就需要用到线程. 好了,今天就介绍到这里,下次我们要学会把线程的概念带到我们的程序中. 88!