计算机网络课程设计-基于icmptcp的网段端口扫描-c语言编写Word下载.doc
《计算机网络课程设计-基于icmptcp的网段端口扫描-c语言编写Word下载.doc》由会员分享,可在线阅读,更多相关《计算机网络课程设计-基于icmptcp的网段端口扫描-c语言编写Word下载.doc(32页珍藏版)》请在冰豆网上搜索。
网段和端口扫描程序
一、概述 1
1.1端口扫描 1
1.2端口扫描常用技术简介 2
1.2.1connect()扫描 2
1.2.2SYN扫描 3
1.2.3XMAS-TREE扫描 3
1.3网段扫描 4
二、需求分析 5
2.1设计功能 5
2.2设计要求 5
三、概要设计 5
3.1设计概念和处理流程 5
3.2结构设计 7
3.2.1数据结构及定义 7
3.2.2接口函数 8
四、细设设计 9
4.1实现原理 9
4.1.1connect()函数端口扫描的原理 9
4.1.2ICMP网段扫描的原理 11
4.2函数实现 14
4.2.1初始化winsock动态链接库 14
4.2.3地址解析 15
4.2.4计算检验和 15
4.2.5网段扫描 16
4.2.6端口扫描 17
五、总结与体会 19
5.1程序运行与调试 19
5.2体会 20
六、参考文献 21
6.1参考书目 21
6.2引用网址 21
一、概述
1.1端口扫描
端口扫描是指利用TCP协议的面向连接的特性,使用本地计算机试图与目的主机的某个端口建立连接,以此来试探目的主机的一些端口的具体状态,如是否打开,若是打开的又运行什么样的程序(利用熟知端口很容易知道)。
端口扫描有很多技术实现。
其中最常用的有:
connect()扫描,TCPSYN扫描,TCPFIN扫描,TCPNULL扫描,XMAS-TREE扫描(圣诞树扫描)等等。
在本程序中使用的是connect()扫描。
1.2端口扫描常用技术简介
1.2.1connect()扫描
此扫描的原理是,本地计算机利用TCP协议的三次握手原理(RFC793)试图与网络上一台主机或服务器建立TCP连接。
如果目的主机或服务器回送SYN/ACK则说明该端口开放,否则该端口关闭。
具体的过程:
1.Client端发送SYN
2.Server端发送SYN/ACK(该端口开放),或Server端发送RST/ACK(该端口关闭),若无应答可能目的主机或服务器不可达。
3.Client端发送ACK,连接建立。
4.Client端主动断开连接,连接关闭。
过程图如下:
1.2.2SYN扫描
SYN扫描前两步与connect()扫描相同,只是最后一步,Client端发送的不是ACK确认报文而是RST报文,这样三次握手过程就没有完成,Client与Server也就没有建立TCP连接,因此前述过程不会被Sever端记录到系统日志中,扫描更加隐蔽。
1.2.3XMAS-TREE扫描
通过发送带有以下标志位TCP数据包URG,PSH,FIN来试探主机。
在目标端口开放的情况下不放回任何信息。
端口开放:
发送URG/PSH/FIN,没有响应。
端口关闭:
1.发送URG/PSH/FIN,没有响应。
2响应RST。
1.3网段扫描
网段扫描是指利用ICMP(因特网控制报文协议)对某一网段的所有IP地址发送ICMP报文,测试IP地址所对应的主机具体情况(如是否开机等)。
所以对目的主机回答的ICMP报文进行分析是网段扫描的关键。
常见的报文类型有:
类型(type)
代码(code)
描述
差错
查询
回显回答
*
3
1
主机不可达
端口不可达
8
请求回显
二、需求分析
2.1设计功能
实现一个扫描器,使用TCPconnect、TCPSYN或TCPSYN进行端口扫描,使用ICMPecho扫描实现IP扫描,并记录结果。
2.2设计要求
Windows或Linux环境下,程序应在单机上运行。
使用端口扫描对一台主机进行扫描,并显示结果,在一定的端口范围内,该主机由哪些端口是打开的。
对一个网段进行IP扫描,显示结果,该网段的哪些主机是开机的。
友好的界面,便于用户操作,完成全部设计功能。
三、概要设计
3.1设计概念和处理流程
程序使用WindowsSocketsAPI编程,利用winsock2库函数提供的函数实现与主机间的连接,发送ICMP报文。
详见WinsockReferen:
用户首先选择要使用的功能,程序共有两大功能:
端口扫描和IP网段扫描。
端口扫描的主要功能有,根据用户输入的主机名或IP地址以及端口范围进行connect()扫描。
当用户输入完必要的信息并击确认后,程序进行扫描,不过不建议端口区间过于庞大,等待一段时间后用户界面会显示所指定IP地址主机的端口使用情况,哪些端口是打开的,哪些是关闭的。
IP网段扫描的主要功能有,用户输入某个网段起始IP地址和结束IP地址,确认后,程序根据所输入的网段号,对网段类的每一个IP地址发送ICMP请求回显报文,如果主机处于开机状态那么将会回送回答报文;
如果主机不可达(在同一个网内),则就能够判断该IP所对应的主机处于关机状态。
当用户选择退出功能时,释放资源,程序关闭。
程序流程图
3.2结构设计
3.2.1数据结构及定义
所使用的宏定义,
#defineICMP_ECHO_REQUEST_TYPE8//ICMP请求类型
#defineICMP_ECHO_REQUEST_CODE0//ICMP请求代码
#defineICMP_ECHO_REPLY_TYPE0
#defineICMP_ECHO_REPLY_CODE0
#defineICMP_MINIMUM_HEADER8
IP数据报首部,首部固定20字节,数据结构定义如下:
typedefstructip_hdr
{
unsignedchariphVerLen;
//版本号和头长度(各占4位)
unsignedcharipTOS;
//服务类型
unsignedshortipLength;
//封包总长度,即整个IP报的长度
unsignedshortipID;
//封包标识,惟一标识发送的每一个数据报
unsignedshortipFlags;
//标志
unsignedcharipTTL;
//生存时间,就是TTL
unsignedcharipProtocol;
//协议,可能是TCP、UDP、ICMP等
unsignedshortipChecksum;
//校验和
unsignedlongipSource;
//源IP地址
unsignedlongipDestination;
//目标IP地址
}IP_HDR,*PIP_HDR;
IP数据报格式
ICMP报文首部格式,8个字节,数据结构定义如下:
typedefstructicmp_hdr
unsignedcharicmp_type;
//类型
unsignedcharicmp_code;
//代码
unsignedshorticmp_checksum;
//检验和
unsignedshorticmp_id;
//唯一请求ID,通常使用进程PID
unsignedshorticmp_sequence;
//序列号
unsignedlongicmp_timestamp;
//时间戳
}ICMP_HDR,*PICMP_HDR;
3.2.2接口函数
VoidInitializeWinsock(),初始化Winsock动态链接库。
VoidResolove(charhostname[]),解析主机名(或IP地址),该函数是公共接口函数,端口扫描和IP网段扫描都使用该函数解析地址。
函数首先判断用户输入的IP是十进制点分地址还是域名地址,然后分别调用inet_addr()和gethostbyname()库函数处理成unsignedlong型数据。
VoidResoloveIPAddr(charstarthost[],charendhost[],int*start,int*end),此函数用户IP网段扫描,将用户输入的起始IP地址和结束IP地址转换为int类型数据。
Char*Assemble(charstartehost[],intcur),将当前IP地址转化为字符串类型的IP地址。
voidSegmentScan(charstarthost[],charendhost[]),通过发送ICMP,检测某个网段上主机的具体状态。
函数的两个参数starthost[]、endhost[]分别代表用户给定的起始IP地址和结尾IP地址。
该函数内部调用了InitializeWinsock()、Resolove()、ResoloveIPAddr()、Assemble()、以及库函数sendto()和recvfrom()。
通过这些函数的调用实现了对指定网络区间的ICMP扫描。
connectScan(charstartport[],charendport[],hostname),该函数把用户输入的主机名(或IP地址)写入sin_addr.s_addr,起始端口写入sin_port中。
函数调用了InitializeWinsock()、Resolove()以及库函数connect()、shutdown()。
实现了利用connect()系统函数对指定主机端口区间扫描。
四、细设设计
4.1实现原理
4.1.1connect()函数端口扫描的原理
首先要明白TCP报文段的首部格式。
现在分别介绍各个字段的具体含义。
(1)源端口和目的端口各占两个字节。
端口是运输层与应用层的服务。
(2)序号占4个字节。
TCP把传送的数据流中的每一个字节都编上一个序号。
(3)确认号占4个字节。
是指期望对方的下一个报文段的数据的第一个字