当前位置:文档之家› 基于多线程的端口扫描程序课程设计报告

基于多线程的端口扫描程序课程设计报告

滁州学院课程设计报告课程名称:设计题目:基于多线程的端口扫描程序院部:计算机与信息工程学院专业:网络工程组别:第六组起止日期: 2012年12月31日~2013 年1月6日指导教师:计算机与信息工程学院二○一二年制课程设计任务书目录1需求分析 01..1网络安全 01.2课程背景 01.3扫描器 01.4多线程扫描器介绍 (1)错误!未定义书签。

错误!未定义书签。

错误!未定义书签。

错误!未定义书签。

1.5端口扫描 (2)2概要设计 (3)2.1整体框架设计 (3)2.2流程图描述 (3)3详细设计 (3)3.1 端口扫描线程启动 (3)3.2 GUI图形界面 (5)3.3 按钮监听及异常处理 (6)4调试与操作说明 (8)4.1运行界面 (8)4.2扫描结果 (8)4.3错误提示 (8)5课程设计总结与体会 (8)6参考文献 (9)7致谢 (9)8附录 01需求分析1..1网络安全二十一世纪是信息化、网络化的世纪,信息是社会发展的重要资源。

信息安全保障能力是一个国家综合国力、经济竞争实力和生存能力的重要组成部分,是世界各国在奋力攀登的制高点。

网络安全是指网络系统的硬件、软件及其系统中的数据受到保护,不因偶然的或者恶意的原因而遭到破坏、更改、泄露,系统连续可靠正常地运行。

网络安全包括技术领域和非技术领域两大部分:非技术领域包括一些制度、政策、管理、安全意识、实体安全等方面的内容;技术领域包括隐患扫描、防火墙、入侵检测、访问控制、虚拟专用网、CA认证、操作系统等方面的内容。

这些技术的目标是保证信息的可控性、可用性、保密性、完整性、和不可抵赖性。

端口扫描属于安全探测技术范畴,对应于网络攻击技术中的网络信息收集技术。

1.2课程背景随着Internet的不断发展,信息技术已成为促进经济发展、社会进步的巨大推动力。

端口扫描技术是网络安全扫描技术一个重要的网络安全技术。

与防火墙、入侵检测系统互相配合,能够有效提高网络的安全性。

安全扫描是安全技术领域中重要的一类。

通过扫描能自动检测远端或本地主机系统信息,包括主机的基本信息(如计算机名、域名、组名、操作系统型等)、服务信息、用户信息以及漏洞信息,它的重要性在于能够对网络进行安全评估,及时发现安全隐患,防患于未然。

网络的安全状况取决于网络中最薄弱的环节,任何疏忽都有可能引入不安全的因素,最有效的方法是定期对网络系统进行安全分析,及时发现并修正存在的脆弱,保证系统安全。

国外安全扫描技术的历史可以追溯到20世纪90年代,当时因特网刚刚起步,但是在过去的十年内,扫描技术飞速发展,迄今为止,其扫描技术已经非常完善,但是在全面性,隐蔽性和智能性上还有待提高。

安全扫描从最初专门为UNIX系统而编写的一些只有简单功能的小程序发展到现在,已经出现了可以运行多个操作系统平台上的,具有复杂功能的系统程序。

国内的扫描技术是在国外的扫描器基础上发展起来的。

其中有一些专门从事安全技术的公司。

这些公司的扫描器以硬件为主,其特点是执行速度快,不像软件一样受到安装主机系统的限制。

然而对于更多的基于主机的端口扫描而言,简单,实用,可靠才是它们的长处。

1.3扫描器扫描器是一种自动检测远程或本地主机安全性弱点的程序,通过使用扫描器你可以不留痕迹的发现远程服务器的各种TCP端口的分配。

这就能让我们间接的或直观的了解到远程主机所存在的安全问题。

为了保证网络中计算机的安全性,必须采取主动策略,快速、及时、准确、安全的检测出网络中计算机及防火墙开放的和未开放的端口。

计算机端口扫描技术就是这种主动防御策略实现的重要技术手段。

扫描器采用模拟攻击的形式对目标可能存在的已知安全漏洞进行逐项检查。

目标可以是工作站、服务器、交换机、数据库应用等各种对象。

然后根据扫描结果向系统管理员提供周密可靠的安全性分析报告,为提高网络安全整体水平产生重要依据。

在网络安全体系的建设中,安全扫描工具花费低、效果好、见效快、与网络的运行相对对立、安装运行简单,可以大规模减少安全管理员的手工劳动,有利于保持全网安全政策的统一和稳定。

1.4多线程扫描器介绍在java中,组件放置在窗体上的方式是完全基于代码的。

组件放置在窗体上的方式通常不是通过绝对坐标控制,而是由“布局管理器”根据组件加入的顺序决定其位置。

每个容器都有一个属于的自己布局管理器。

使用不同的布局管理器,组件大小,位置和形状将大不相同。

表格型布局管理器将容器划分成为一个多行多列的表格,表格的大小全部相同,是由其中最大的组件所决定。

通过add方法可以将组件一一放在每个表格中。

表格包型布局与表格型布局有些相近,但与表格型布局比较起来,表格包型更加灵活,更加复杂。

通常表格包型布局,我们可以设定每个格子的大小,间隙等。

每个正在系统上运行的程序都是一个进程。

每个进程包含一到多个线程。

进程也可能是整个程序或者是部分程序的动态执行。

线程是一组指令的集合,或者是程序的特殊段,它可以在程序里独立执行。

也可以把它理解为代码运行的上下文。

所以线程基本上是轻量级的进程,它负责在单个程序里执行多任务。

通常由操作系统负责多个线程的调度和执行。

线程是程序中一个单一的顺序控制流程.在单个程序中同时运行多个线程完成不同的工作,称为多线程.线程和进程的区别在于,子进程和父进程有不同的代码和数据空间,而多个线程则共享数据空间,每个线程有自己的执行堆栈和程序计数器为其执行上下文.多线程主要是为了节约CPU时间,发挥利用,根据具体情况而定. 线程的运行中需要使用计算机的内存资源和CPU。

在计算机编程中,一个基本的概念就是同时对多个任务加以控制。

许多程序设计问题都要求程序能够停下手头的工作,改为处理其他一些问题,再返回主进程。

可以通过多种途径达到这个目的。

最开始的时候,那些掌握机器低级语言的程序员编写一些“中断服务例程”,主进程的暂停是通过硬件级的中断实现的。

尽管这是一种有用的方法,但编出的程序很难移植,由此造成了另一类的代价高昂问题。

中断对那些实时性很强的任务来说是很有必要的。

但对于其他许多问题,只要求将问题划分进入独立运行的程序片断中,使整个程序能更迅速地响应用户的请求。

最开始,线程只是用于分配单个处理器的处理时间的一种工具。

但假如操作系统本身支持多个处理器,那么每个线程都可分配给一个不同的处理器,真正进入“并行运算”状态。

从程序设计语言的角度看,多线程操作最有价值的特性之一就是程序员不必关心到底使用了多少个处理器。

程序在逻辑意义上被分割为数个线程;假如机器本身安装了多个处理器,那么程序会运行得更快,毋需作出任何特殊的调校。

根据前面的论述,大家可能感觉线程处理非常简单。

但必须注意一个问题:共享资源!如果有多个线程同时运行,而且它们试图访问相同的资源,就会遇到一个问题。

举个例子来说,两个线程不能将信息同时发送给一台打印机。

为解决这个问题,对那些可共享的资源来说(比如打印机),它们在使用期间必须进入锁定状态。

所以一个线程可将资源锁定,在完成了它的任务后,再解开(释放)这个锁,使其他线程可以接着使用同样的资源。

多线程是为了同步完成多项任务,不是为了提高运行效率,而是为了提高资源使用效率来提高系统的效率。

线程是在同一时间需要完成多项任务的时候实现的。

线程优先级被线程调度用来判定何时哪个线程允许运行。

理论上,优先级高的线程比优先级低的线程获得更多的CPU时间。

实际上,线程获得的CPU 时间通常由包括优先级在内的多个因素决定(例如,一个实行多任务处理的操作系统如何更有效的利用CPU时间)。

一个优先级高的线程自然比优先级低的线程优先。

举例来说,当低优先级线程正在运行,而一个高优先级的线程被恢复(例如从沉睡中或等待I/O中),它将抢占低优先级线程所使用的CPU。

理论上,等优先级线程有同等的权利使用CPU。

但你必须小心了。

记住, Java是被设计成能在很多环境下工作的。

一些环境下实现多任务处理从本质上与其他环境不同。

为安全起见,等优先级线程偶尔也受控制。

这保证了所有线程在无优先级的操作系统下都有机会运行。

实际上,在无优先级的环境下,多数线程仍然有机会运行,因为很多线程不可避免的会遭遇阻塞,例如等待输入输出。

遇到这种情形,阻塞的线程挂起,其他线程运行。

但是如果你希望多线程执行的顺利的话,最好不要采用这种方法。

同样,有些类型的任务是占CPU 的。

对于这些支配CPU类型的线程,有时你希望能够支配它们,以便使其他线程可以运行。

多个线程同时读写同一份共享资源的时候,可能会引起冲突。

这时候,我们需要引入线程“同步”机制,即各位线程之间要有个先来后到,不能一窝蜂挤上去抢作一团。

同步的关键是管程,管程是一个互斥独占锁定的对象,在给定的时间,仅有一个线程获得管程,当一个线程需要锁定时,他必须进入管程。

1.5端口扫描一个端口就是一个潜在的通信通道,也就是一个入侵通道。

对目标计算机进行端口扫描,能得到许多有用的信息。

进行扫描的方法很多,可以是手工进行扫描,也可以用端口扫描软件进行。

在手工进行扫描时,需要熟悉各种命令。

对命令执行后的输出进行分析。

用扫描软件进行扫描时,许多扫描器软件都有分析数据的功能。

通过端口扫描,可以得到许多有用的信息,从而发现系统的安全漏洞。

2概要设计2.1整体框架设计经过我们组员的思考很研究,得出了以下几个模块的简单端口扫描器,整个端口扫描器的核心模块是是端口扫描系统,它由许多子模块组成,其结构如下图所示:3详细设计3.1 端口扫描线程启动扫描程序主要运用Socket编程。

对于一个工作齐全的Socket,其工作过程包含以下四个就基本步骤:创建通信双方的socket链接,即分别为服务器和客户端创建Socket对象,建立Socket连接;打开连接到Socket的输入流和输出流;按照一定的协议对Socket进行读/写操作;关闭连接。

以下是程序代码//运行扫描端口public void run(){i nt i;S ocket theTCPsocket;for(i{try{theTCPsocket=new Socket(hostAddress,i);theTCPsocket.close();switch(i){case 21:break;case 23:break;case 25:break;case 80:break;case 110:break;case 139:break;}}catch (IOException e){}}if (i==MAX_port){}}}3.2 GUI图形界面图形用户界面是软件产品和用户交互的接口,是软件产品中用户直接可以看到并直接操作的部分。

public class ThreadScan{public static JFrame main=new JFrame("基于JAVA的多线程TCP端口扫描程序");public static JTextArea Result=new JTextArea("",4,43);public static JTextField hostname=new JTextField("localhost",8);public static JTextField minPort=new JTextField("0",4);public static JTextField maxPort=new JTextField("1000",4);public static JTextField maxThread=new JTextField("100",3);public static JDialog DLGError=new JDialog(main,"错误!");public static Label DLGINFO=new Label("");public static Label status=new Label("扫描状态:未开始");public static void main(String[] args){main.setSize(500,220);//main.setLocation(300,300);main.setResizable(false);DLGError.setSize(300,100);DLGError.setLocation(400,400);JPanel mainPanel = new JPanel();Label H=new Label("ip或域名:");Label P1=new Label("端口范围:");Label P2=new Label("~");Label TNUM=new Label("线程数:");Label RST=new Label("扫描结果: ");Label con=new Label(" ");Result.setLineWrap(true);Result.setEditable(false);JButton OK = new JButton("确定");JButton Submit = new JButton("确定");JButton Cancel = new JButton("取消");Container mPanel = main.getContentPane();Container dPanel = DLGError.getContentPane();mPanel.setLayout(new FlowLayout(FlowLayout.LEFT));dPanel.setLayout(new FlowLayout(FlowLayout.CENTER));mPanel.add(H);mPanel.add(hostname);mPanel.add(P1);mPanel.add(minPort);mPanel.add(P2);mPanel.add(maxPort);mPanel.add(TNUM);mPanel.add(maxThread);mPanel.add(RST);mPanel.add(Result);mPanel.add(con);mPanel.add(Submit);mPanel.add(Cancel);mPanel.add(status);dPanel.add(DLGINFO);dPanel.add(OK);main.setVisible(true);Submit.addActionListener(new SubmitAction());Cancel.addActionListener(new CancleAction());OK.addActionListener(new OKAction());}}3.3 按钮监听及异常处理本部分主要对各个按钮进行监听。

相关主题