计算机网络课程设计 基于ICMPTCP的网段端口扫描 C语言编写(2)

2019-06-11 10:53

ronnie

扫描的关键。常见的报文类型有: 类型(type) 代码(code) 0 3 3 8 0 端口不可达 请求回显 * * 0 1 描述 回显回答 主机不可达 差错 * 查询 *

二、需求分析

2.1 设计功能

实现一个扫描器,使用TCP connect、TCP SYN或TCP SYN进行端口扫描,使用 ICMP echo扫描实现IP扫描,并记录结果。

2.2 设计要求

Windows或Linux环境下,程序应在单机上运行。

使用端口扫描对一台主机进行扫描,并显示结果,在一定的端口范围内,该主机由哪些端口是打开的。对一个网段进行IP扫描,显示结果,该网段的哪些主机是开机的。

友好的界面,便于用户操作,完成全部设计功能。

三、概要设计

3.1设计概念和处理流程

程序使用Windows Sockets API编程,利用winsock2库函数提供的函数实现与主机间的连接,发送ICMP报文。详见

Winsock Referen:

http://msdn.microsoft.com/en-us/library/windows/desktop/ms741416(v=vs.85).aspx

6

ronnie

用户首先选择要使用的功能,程序共有两大功能:端口扫描和IP网段扫描。端口扫描的主要功能有,根据用户输入的主机名或IP地址以及端口范围进行connect()扫描。当用户输入完必要的信息并击确认后,程序进行扫描,不过不建议端口区间过于庞大,等待一段时间后用户界面会显示所指定IP地址主机的端口使用情况,哪些端口是打开的,哪些是关闭的。IP网段扫描的主要功能有,用户输入某个网段起始IP地址和结束IP地址,确认后,程序根据所输入的网段号,对网段类的每一个IP地址发送ICMP请求回显报文,如果主机处于开机状态那么将会回送回答报文;如果主机不可达(在同一个网内),则就能够判断该IP所对应的主机处于关机状态。当用户选择退出功能时,释放资源,程序关闭。

程序流程图

7

ronnie

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 ICMP_MINIMUM_HEADER 8

IP数据报首部,首部固定20字节,数据结构定义如下:

typedef struct ip_hdr { unsigned char iphVerLen; // 版本号和头长度(各占4位) unsigned char ipTOS; // 服务类型 unsigned short ipLength; // 封包总长度,即整个IP报的长度

unsigned short ipID; // 封包标识,惟一标识发送的每一个数据报

unsigned short ipFlags; // 标志 unsigned char ipTTL; // 生存时间,就是TTL unsigned char ipProtocol; // 协议,可能是TCP、UDP、ICMP等

unsigned short ipChecksum; // 校验和 unsigned long ipSource; // 源IP地址 unsigned long ipDestination; // 目标IP地址 }IP_HDR,*PIP_HDR;

IP数据报格式

ICMP报文首部格式,8个字节,数据结构定义如下:

8

ronnie

typedef struct icmp_hdr { unsigned char icmp_type; //类型 unsigned char icmp_code; //代码 unsigned short icmp_checksum; //检验和 unsigned short icmp_id; //唯一请求ID,通常使用进程PID

unsigned 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()和gethostbyname()库函数处理成unsigned long型数据。

Void ResoloveIPAddr(char starthost[],char endhost[],int *start,int *end),此函数用户IP网段扫描,将用户输入的起始IP地址和结束IP地址转换为int类型数据。

9

ronnie

Char * Assemble(char startehost[],int cur),将当前IP地址转化为字符串类型的IP地址。

void SegmentScan(char starthost[],char endhost[]),通过发送ICMP,检测某个网段上主机的具体状态。函数的两个参数starthost[]、endhost[]分别代表用户给定的起始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报文段的首部格式。

10


计算机网络课程设计 基于ICMPTCP的网段端口扫描 C语言编写(2).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:XX医院医疗制度汇编

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: