主机存活性探测系统设计报告.docx
《主机存活性探测系统设计报告.docx》由会员分享,可在线阅读,更多相关《主机存活性探测系统设计报告.docx(12页珍藏版)》请在冰豆网上搜索。
主机存活性探测系统设计报告
网络主机的存活性探测系统设计与实现
一、概要
1.1课设目的
《TCP/IP原理与应用》是一门实践性较强的网络基础课程,为了学好这门课程,必须在掌握相关基本协议的同时,加强上机实践。
本课程设计的目的就是要达到理论与实际应用相结合,使同学们能够根据熟悉TCP/IP的相关基本协议,学会基本的C-S编程方法,能够用网络编程解决实际的网络通信问题,并培养良好的程序设计技能。
1.2设计要求
1、通过这次设计,要求了解TCP/IP的基本协议的工作原理和基本的网络编程知识,利用单(多)线程技术、API函数等编写服务和客户端应用程序,利用MFC提供的类编写较为复杂网络应用程序。
同时,在程序设计方法以及上机操作等基本技能和科学作风方面受到比较系统和严格的训练。
2、学生必须仔细研读《TCP/IP原理与应用》课程设计(实习)要求,以学生自学为主、指导教师指导为辅,认真、独立地完成课程设计的任务,有问题及时主动与指导教师沟通。
3、本次课程设计按照教学要求需要在两周时间内独立完成,学生要发挥自主学习的能力,充分利用时间,安排好课设的时间计划,并在课程设计过程中不断检测自己的计划完成情况,及时地向指导教师汇报。
4、每个题目最多四个人。
5、编程语言自定。
1.3设计题目
网络主机的存活性探测系统设计与实现
1)任务(ping,arptest)
设计并实现能够探测局域网、广域网内主机存活情况的应用系统。
2)要求
⏹要能够实现单IP(或域名)和IP段(连续或不连续)的网络主机存活性探测。
⏹探测结果只显示存活主机情况,要有一定的图形显示。
⏹局域网内的主机存活性探测速度要快。
⏹最好具备一定穿越防火墙的能力(特别是探测局域网内主机的存活性时)
⏹除发送ICMP数据包实现网络主机存活性探测外,建议使用SYNPing、ACKPing、FinPing、NullPing方式实现,参考设计流程如下:
二、需求分析
在网络安全形势日益严峻的情况下,针对网络入侵手段日益复杂、操作系统漏洞不断涌现等问题,预先评估网络信息系统的安全问题已成为网络管理员的重要需求。
基于网络的安全扫描主要扫描设定网络内的服务器、路由器、网桥、交换机、访问服务器、防火墙等设备的安全漏洞,并可设定模拟攻击,以测试系统的防御能力,这种技术可模拟入侵者的攻击行为,从系统外部进行扫描,以探测是否存在可被入侵者利用的系统安全薄弱之处。
主机存活性探测的核心功能是防火墙穿越,即在对方已安装防火墙的情况下探测主机的存活性。
传统探测远程主机存活性的方法是通过ICMP协议中的回显应答报文来实现。
基于ICMP协议的主机存活性探测技术主要利用了ICMP回应请求和回显应答报文来实现。
但是随着对安全越来越多了解和重视,很多主机为了避免被扫描器探测,通过防火墙将ICMP包屏蔽,从而达到在网络中隐藏的目的。
因此采用基于ICMP协议无法准确探测远程主机的存活性。
依据目标主机受到ARP请求后一定返回自身物理地址的工作原理,设计并实现了一种新的主机存活性探测系统。
测试结果表明该系统能穿越防火墙探测主机的存活性,局域网内探测结果的准确率100%,为网络安全扫描工具的设计提供了一种新方法。
三、系统分析与设计
3.1基本思想
ARP协议是“AddressResolutionProtocol”(地址解析协议)的缩写,主要完成那个IP地址到MAC地址的动态映射,以实现信息送往目的主机。
在以太网中,一个主机要和另一个主机进行直接通信,必须要知道目标主机的MAC地址(硬件地址),任何时候当主机或者路由器需要找出另一个主机或者路由器在此网络上的物理地址时,就发送一个ARP查询分组。
因为发送站不知道接收站的物理地址,查询就在网络上广播,每一个在网络上的主机或者路由器都接受和处理这个ARP查询分组,但只有意图中的接受者才是别其IP地址,并发回ARP响应分组。
这个分组直接用单播发送给查询者,并使用接收到的查询分组中所用的物理地址。
据此,向局域网内的目标主机发送ARP请求时,无论对方是否安装防火墙,对方都会返回MAC地址。
所以,局域网内通过ARP协议探测主机存活的准确率理论值是100%。
3.2系统总体设计
基于ARP协议的主机存活性探测系统主要包括域名解析和IP地址的转换、ARP请求发送与处理两大模块,各模块的功能简述如下:
域名解析及IP地址转换:
调用inet_addr将输入的点分十进制数表示的IP地址转换为网络字节顺序的IP地址;获取主机名:
调用gethostbyaddr获取存活主机的主机名;
ARP请求发送与处理:
调用sendARP函数向目标地址发送ARP请求;获取MAC地址,判断ARP返回的MAC地址转换成易读的形式,并将存活主机IP写入文档。
3.3系统详细设计
依据上述原理分析,设计的基于ARP协议的主机存活性探测流程图如下所示:
四、系统实现
4.1实现环境
采用VC++6.0实现基于ARP的主机存活性探测系统,系统主要包括动态链接库ArdDLL的主程序。
主要代码如下:
DLL部分主要包挎DLL输出函数Arp
ARPDLL_APIDWORDARP(char*ip,BYTE*mac){};
该函数的主要功能是通过向目标主机发送ARP请求返回目标主机MAC地址达到探测主机存活性的目的。
SendARP()函数原型如下:
DWORDSendArp(
IPAddrDestIP,//目标地址
IPAddrSrcIP,//源IP地址
PULONGpMacAddr,//返回MAC地址指针
PULONGPhyAddrLen//返回MAC地址长度);
主程序是一个基于对话框的VC++工程。
在对话框中通过两个IP地址控件输入起始探测地址和中指探测地址,在对网段中的每个IP地址调用DLL中得函数获得MAC:
BYTEMAC[6];
LPTSTRpIP=strip.GetBuffer(16);
HRESULThr=Arp(pIP,Mac);
调用gethostbyaddr()函数获取主机名:
Hostent*remoteHostent=(hostent*)malloc(sizeof(hosten));
remoteHostent=gethostbyaddr((char*)&ipAddr,sizeof(in_addr),AF_INET);
if(remoteHosten)
hn=remoteHosten->h_name;
4.2实现结果
基于ARP协议的主机存活性探测系统实现后的主界面如下:
4.3测试实验结果对比分析
传统的主机存活性探测方法是Ping命令,而如果用ping命令测试目标主机结果如下:
从图可以看出ping命令无法探测目标主机125.219.181.178和125.219.181.179的存活性。
因为ping命令被目标主机的防火墙阻挡了。
由此可见,传统的通过发送和监控ICMPPing数据包探测目标主机的存活性时误报率极高。
五、心得体会
本次课程设计任务是做网络主机的存活性探测。
做课程设计过程中遇到很多问题,通过老师的指导和上网查阅资料慢慢的得到了解决。
六、参考文献
[1]中原工学院院报
[2]CSDN论坛
七、附录
Ex_Arp1Dlg.cpp中主要代码:
====================================================
voidCEx_Arp1Dlg:
:
ScanHost(CStringstrIP)
{
//调用DLL中的函数获得MAC
BYTEMac[6];
LPTSTRpIP=strIP.GetBuffer(16);
HRESULThr=Arp(pIP,Mac);
if(hr==0)
{
CStringstr;
CStringstrMac("");
inti;
for(i=0;i<5;i++)
{
str.Format("%02X:
",Mac[i]);
strMac+=str;
}
str.Format("%02X",Mac[i]);
strMac+=str;
IPAddripAddr;
charbuf[256];
CStringhn;
ipAddr=inet_addr(pIP);//IP->网络字节
WSADATAwsadata;
if(WSAStartup(winsock_version,&wsadata))
str.Format("can'tinitializesocket");
ZeroMemory(buf,256);//将指定的内存块清零.
hostent*remoteHostent=(hostent*)malloc(sizeof(hostent));
remoteHostent=gethostbyaddr((char*)&ipAddr,sizeof(in_addr),AF_INET);//返回对应于给定地址的主机信息
if(remoteHostent)
hn=remoteHostent->h_name;
//获取列表中当前的的数据个数
intnNo=m_ctrlListData.GetItemCount();
//将数据添加进列表
str.Format("%d",nNo+1);
m_ctrlListData.InsertItem(nNo,str);
m_ctrlListData.SetItemText(nNo,1,strIP);
m_ctrlListData.SetItemText(nNo,2,strMac);
m_ctrlListData.SetItemText(nNo,3,hn);
}
strIP.ReleaseBuffer();
}
voidCEx_Arp1Dlg:
:
OnButton1()
{
//TODO:
Addyourcontrolnotificationhandlercodehere
CStringstrStartIP,strEndIP;
m_StartIP.GetWindowText(strStartIP);
m_EndIP.GetWindowText(strEndIP);
structin_addrtargetaddr;
unsignedlongips=inet_addr(strStartIP);//计算起始IP地址的网络字节
unsignedlongipe=inet_addr(strEndIP);//计算结束IP地址的网络字节
ips=ntohl(ips);//计算起始IP地址的主机字节
ipe=ntohl(ipe);//计算结束IP地址的主机字节
for(intk=ips;k<=ipe;k++)
{
targetaddr.S_un.S_addr=htonl(k);//探测指定主机是否存活
ScanHost(inet_ntoa(targetaddr));//inet_ntoa()返回点分十进制的字符串
Sleep(10);//执行挂起一段时间
}
}
ArpDll.cpp的主要代码:
=====================================================
//ArpDll.cpp:
DefinestheentrypointfortheDLLapplication.
#include"StdAfx.h"
#include"ArpDll.h"
#include
#include
#include
#include"iphlpapi.h"
#include
#pragmacomment(lib,"Iphlpapi.lib")
#pragmacomment(lib,"Ws2_32.lib")
BOOLAPIENTRYDllMain(HANDLEhModule,
DWORDul_reason_for_call,
LPVOIDlpReserved
)
{
switch(ul_reason_for_call)
{
caseDLL_PROCESS_ATTACH:
caseDLL_THREAD_ATTACH:
caseDLL_THREAD_DETACH:
caseDLL_PROCESS_DETACH:
break;
}
returnTRUE;
}
//Thisisanexampleofanexportedfunction.
ARPDLL_APIDWORDarp(char*ip,BYTE*mac)
{
charc='\n';
HRESULThr;
IPAddripAddr;
ULONGpulMac[2];
ULONGulLen;
ipAddr=inet_addr(ip);
memset(pulMac,0xff,sizeof(pulMac));
ulLen=6;
hr=SendARP(ipAddr,0,pulMac,&ulLen);
if(hr==NO_ERROR)
{
FILE*stream;
stream=fopen("host.txt","a");
fprintf(stream,"%s%c",ip,c);
fclose(stream);
size_ti,j;
PBYTEpbHexMac=(PBYTE)pulMac;
//
//ConvertthebinaryMACaddressintohuman-readable
//
for(i=0,j=0;i{
mac[i]=pbHexMac[i];
}
return0;
}
else
{
returnhr;
}
}