1、网段和端口扫描程序一、 概述11.1端口扫描11.2端口扫描常用技术简介21.2.1 connect()扫描21.2.2 SYN扫描31.2.3 XMAS-TREE扫描31.3网段扫描4二、需求分析52.1 设计功能52.2 设计要求5三、概要设计53.1设计概念和处理流程53.2 结构设计73.2.1 数据结构及定义73.2.2 接口函数8四、细设设计94.1 实现原理94.1.1 connect()函数端口扫描的原理94.1.2 ICMP网段扫描的原理114.2 函数实现144.2.1 初始化winsock动态链接库144.2.3地址解析154.2.4 计算检验和154.2.5 网段扫描1
2、64.2.6 端口扫描17五、 总结与体会195.1 程序运行与调试195.2 体会20六、 参考文献216.1 参考书目216.2 引用网址21一、 概述1.1端口扫描端口扫描是指利用TCP协议的面向连接的特性,使用本地计算机试图与目的主机的某个端口建立连接,以此来试探目的主机的一些端口的具体状态,如是否打开,若是打开的又运行什么样的程序(利用熟知端口很容易知道)。端口扫描有很多技术实现。其中最常用的有:connect()扫描,TCP SYN扫描,TCP FIN扫描,TCP NULL扫描,XMAS- TREE扫描(圣诞树扫描)等等。在本程序中使用的是connect()扫描。1.2端口扫描常用
3、技术简介1.2.1 connect()扫描此扫描的原理是,本地计算机利用TCP协议的三次握手原理(RFC 793)试图与网络上一台主机或服务器建立TCP连接。如果目的主机或服务器回送SYN/ACK则说明该端口开放,否则该端口关闭。具体的过程:1. Client端发送SYN2. Server端发送SYN/ACK(该端口开放),或Server端发送RST/ACK(该端口关闭),若无应答可能目的主机或服务器不可达。3. Client端发送ACK,连接建立。4. Client端主动断开连接,连接关闭。过程图如下:1.2.2 SYN扫描SYN扫描前两步与connect()扫描相同,只是最后一步,Clie
4、nt端发送的不是ACK确认报文而是RST报文,这样三次握手过程就没有完成,Client与Server也就没有建立TCP连接,因此前述过程不会被Sever端记录到系统日志中,扫描更加隐蔽。1.2.3 XMAS-TREE扫描通过发送带有以下标志位TCP数据包URG,PSH,FIN来试探主机。在目标端口开放的情况下不放回任何信息。端口开放:发送URG/PSH/FIN,没有响应。端口关闭:1.发送URG/PSH/FIN,没有响应。2响应RST。1.3网段扫描网段扫描是指利用ICMP(因特网控制报文协议)对某一网段的所有IP地址发送ICMP报文,测试IP地址所对应的主机具体情况(如是否开机等)。所以对目
5、的主机回答的ICMP报文进行分析是网段扫描的关键。常见的报文类型有:类型(type)代码(code)描述差错查询回显回答*31主机不可达端口不可达8请求回显二、需求分析2.1 设计功能实现一个扫描器,使用TCP connect、TCP SYN或TCP SYN进行端口扫描,使用 ICMP echo扫描实现IP扫描,并记录结果。2.2 设计要求Windows或Linux环境下,程序应在单机上运行。使用端口扫描对一台主机进行扫描,并显示结果,在一定的端口范围内,该主机由哪些端口是打开的。对一个网段进行IP扫描,显示结果,该网段的哪些主机是开机的。友好的界面,便于用户操作,完成全部设计功能。三、概要设
6、计3.1设计概念和处理流程程序使用Windows Sockets API编程,利用winsock2库函数提供的函数实现与主机间的连接,发送ICMP报文。详见Winsock Referen:用户首先选择要使用的功能,程序共有两大功能:端口扫描和IP网段扫描。端口扫描的主要功能有,根据用户输入的主机名或IP地址以及端口范围进行connect()扫描。当用户输入完必要的信息并击确认后,程序进行扫描,不过不建议端口区间过于庞大,等待一段时间后用户界面会显示所指定IP地址主机的端口使用情况,哪些端口是打开的,哪些是关闭的。IP网段扫描的主要功能有,用户输入某个网段起始IP地址和结束IP地址,确认后,程序
7、根据所输入的网段号,对网段类的每一个IP地址发送ICMP请求回显报文,如果主机处于开机状态那么将会回送回答报文;如果主机不可达(在同一个网内),则就能够判断该IP所对应的主机处于关机状态。当用户选择退出功能时,释放资源,程序关闭。程序流程图3.2 结构设计3.2.1 数据结构及定义所使用的宏定义,#define ICMP_ECHO_REQUEST_TYPE 8 /ICMP请求类型#define ICMP_ECHO_REQUEST_CODE 0 /ICMP请求代码#define ICMP_ECHO_REPLY_TYPE 0#define ICMP_ECHO_REPLY_CODE 0#define
8、 ICMP_MINIMUM_HEADER 8IP数据报首部,首部固定20字节,数据结构定义如下:typedef struct ip_hdrunsigned char iphVerLen; / 版本号和头长度(各占4位)unsigned char ipTOS; / 服务类型 unsigned short ipLength; / 封包总长度,即整个IP报的长度unsigned short ipID; / 封包标识,惟一标识发送的每一个数据报unsigned short ipFlags; / 标志unsigned char ipTTL; / 生存时间,就是TTLunsigned char ipPro
9、tocol; / 协议,可能是TCP、UDP、ICMP等unsigned short ipChecksum; / 校验和unsigned long ipSource; / 源IP地址unsigned long ipDestination; / 目标IP地址IP_HDR,*PIP_HDR;IP数据报格式ICMP报文首部格式,8个字节,数据结构定义如下:typedef struct icmp_hdrunsigned char icmp_type; /类型unsigned char icmp_code; /代码unsigned short icmp_checksum; /检验和unsigned sh
10、ort icmp_id; /唯一请求ID,通常使用进程PIDunsigned short icmp_sequence; /序列号unsigned long icmp_timestamp; /时间戳 ICMP_HDR,*PICMP_HDR;3.2.2 接口函数Void InitializeWinsock(),初始化Winsock动态链接库。Void Resolove(char hostname),解析主机名(或IP地址),该函数是公共接口函数,端口扫描和IP网段扫描都使用该函数解析地址。函数首先判断用户输入的IP是十进制点分地址还是域名地址,然后分别调用inet_addr()和gethostby
11、name()库函数处理成unsigned long型数据。Void ResoloveIPAddr(char starthost,char endhost,int *start,int *end),此函数用户IP网段扫描,将用户输入的起始IP地址和结束IP地址转换为int类型数据。Char * Assemble(char startehost,int cur),将当前IP地址转化为字符串类型的IP地址。void SegmentScan(char starthost,char endhost),通过发送ICMP,检测某个网段上主机的具体状态。函数的两个参数starthost、endhost分别代表
12、用户给定的起始IP地址和结尾IP地址。该函数内部调用了InitializeWinsock()、Resolove()、ResoloveIPAddr()、Assemble()、以及库函数sendto()和recvfrom()。通过这些函数的调用实现了对指定网络区间的ICMP扫描。connectScan(char startport,char endport,hostname),该函数把用户输入的主机名(或IP地址)写入sin_addr.s_addr,起始端口写入sin_port中。函数调用了InitializeWinsock()、Resolove()以及库函数connect()、shutdown()。实现了利用connect()系统函数对指定主机端口区间扫描。四、细设设计4.1 实现原理4.1.1 connect()函数端口扫描的原理首先要明白TCP报文段的首部格式。现在分别介绍各个字段的具体含义。(1)源端口和目的端口 各占两个字节。端口是运输层与应用层的服务。(2)序号 占4个字节。TCP把传送的数据流中的每一个字节都编上一个序号。(3)确认号 占4个字节。是指期望对方的下一个报文段的数据的第一个字
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1