基于多线程的端口扫描工具设计

时间:2022-09-27 08:55:15

基于多线程的端口扫描工具设计

摘 要:计算机网络给人们的生活带来了巨大便利,但互联网是一个面向公众的开放系统,对数据的保密性和信息的安全性考虑得并不完善,存在着诸多隐患,网络安全形势日趋严峻。在众多入侵检测技术当中,端口信息探测技术引起了越来越多人的关注。本文通过阐述端口扫描与多线程的原理,介绍了一种高效率的端口扫描探测工具。

关键词:网络安全;入侵检测;端口扫描;多线程;

对于网络入侵而言,攻击者在选定一个目标时,首先要获取该目标的一些基本信息,如其端口开放情况,再根据该端口的安全性,选择是否为注入木马的“后门”。在这个过程中,使用端口扫描就是其中最简单但却是最重要的步骤之一,它可以完成上述任务,为下一步攻击做准备。但是一般而言,单一或少量的端口扫描是没有意义的,原因是计算机端口数量较多,端口扫描必须在短时间内得到结果才有攻击意义。因此,就需要一种可以充分利用现有计算机资源的技术,那就是多线程。

1 Winsock

1.1 Winsock概述

Winsock是从 Berkeley Sockets 扩展而来的,其在继承 Berkeley Sockets 的基础上,又进行了新的扩充。这些扩充主要是提供了一些异步函数,并增加了符合WINDOWS消息驱动特性的网络事件异步选择机制。Winsock由两部分组成:开发组件和运行组件。

开发组件:Windows Sockets 实现文档、应用程序接口(API)引入库和一些头文件。

运行组件:Windows Sockets 应用程序接口的动态链接库(WINSOCK.DLL)。

1.2 Winsock原理

在TCP/IP网络中两个进程间的相互作用模式是客户端/服务器模式。

服务器流程如下:

(1)打开一通信通道并告知本地主机,它愿意在某一个公认地址上接收客户请求。

(2)等待客户请求到达该端口。

(3)接收到重复服务请求,处理该请求并发送应答信号。

(4)返回第二步,等待另一客户请求。

(5)关闭服务器。

客户端流程:

(1)打开一通信通道,并连接到服务器所在主机的特定端口。

(2)向服务器发送服务请求报文,等待并接收应答;继续提出请求。

(3)请求结束后关闭通信通道并终止。

2 传输控制协议TCP

2.1 TCP概述

传输控制协议 TCP 是TCP/IP协议栈中的传输层协议,它通过序认及包重发机制,提供可靠的数据流发送和到应用程序的虚拟连接服务。与IP协议相结合,TCP组成了因特网协议的核心。

2.2 TCP三次握手原理

第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SENT状态,等待服务器确认;SYN:同步序列编号。

第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态。

第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED(TCP连接成功)状态,完成三次握手。

2.3 TCP的端口号

TCP段结构中端口地址都是16比特,可以有在0到65535范围内的端口号。

3 端口扫描技术

3.1 端口扫描技术的概述

端口扫描技术是指一种检查目标系统是否开放的TCP或UDP端口信息收集技术。它的具体方法是向目标机器的各个端口发送连接请求,根据返回的响应,判断在目标机器上是否开放了这些端口。通过端口扫描,可以得到许多有用的信息,从而发现系统的安全漏洞。

3.2 常见的端口扫描方式

从TCP的概念中知道,TCP建立连接时有三次握手,基于这个建立过程我们可以得知,假如要扫描某一个TCP端口,可以向该端口发送一个SYN包,如果该端口处于打开状态,我们就可以收到一个SYN+ACK包,也就是说,如果收到SYN+ACK包,就可以判断目标端口处于打开状态,否则,目标端口处于关闭状态。这利用了TCP三次握手的前两次握手,这就是TCP端口扫描的基本原理。

4 多线程

4.1 多线程概念

在计算机编程中,一个基本的概念就是同时对多个任务加以控制。许多程序设计问题都要求程序能够停下手头的工作,改为处理其他一些问题,再返回主进程。多线程指程序中多个片断同时执行,它们只要求将问题划分进入独立运行的程序片断中,使整个程序能更迅速地响应用户的请求。在一个程序中,这些独立运行的片断叫作“线程”(Thread),利用它编程的概念就叫作“多线程处理”。

4.2 互斥锁

互斥锁用来保证一段时间内只有一个线程在执行一段代码。必要性显而易见:假设各个线程向同一个文件顺序写入数据,最后得到的结果一定是灾难性的。所以在编程中,引入了对象互斥锁的概念,用来保证共享数据操作的完整性。每个对象都对应于一个可称为“互斥锁”的标记,这个标记用来保证在任一时刻,只能有一个线程访问该对象。对共享资源的访问, 要对互斥量进行加锁, 如果互斥量已经上了锁, 调用线程就会阻塞,所以在完成了对共享资源的访问后, 要对互斥量进行解锁。

5 程序设计

5.1 将多线程引入端口扫描

通过引入互斥锁的原理,我们可以得知端口扫描并非是一个个进行,而是一次可以扫描多个端口(可在代码中自行设定数量)。这样做极大的提高了使用效率,尤其是用户期望扫描大量端口时。

5.2 扫描代码的实现

(1)首先通过调用WSAStartup()函数,使得应用程序或DLL才可进一步调用winsocket函数。

(2)使用gethostbyname(),获取IP。

(3)在主函数中使用CreatMUTEX()函数创建互斥变量,为多线程做准备。

(4)定义一个SOCKADDR_IN hostinfo,用来存放目标地址IP和端口。

(5)在扫描函数中调用connect()函数进行socket的连接。

(6)在扫描函数中gethostbyneme()获取取得IP地址,存入hostent变量。

(7)调用getmutex()函数,取得一个未扫描的端口,进行扫描。

(8)使用SOCKET_STREAM创建基于TCP模式连接socket。

(9)使用scoketclose()函数来关闭socket连接。

(10)使用CloseHandle()清除互斥锁,关闭多线程。

(11)调用WSACleanup()函数,进行扫尾工作。

参考文献:

[1]于帆,赵妮,王中生 .程序设计基础(C语言版).清华大学出版社 .2006年

[2]黄超 .WINDOWS网络编程 .人民邮电出版社 .2003年

[3]严蔚敏 吴伟民 .数据结构(C语言版).清华大学出版社 .2008年

[4]徐宇杰 .TCP/IP协议深入分析 . 清华大学出版社 .2009年

[5]叶树华,高志红 .网络编程实用教程 . 人民邮电出版社 .2006年

上一篇:The College English Curriculum Requirements... 下一篇:护理干预在减轻LC术后肩部疼痛中的应用