当前位置:文档之家› 实验五 端口扫描器实验报告(付代码)

实验五 端口扫描器实验报告(付代码)

实验5:端口扫描器的设计与实现姓名:学号:专业年级:(一)实验目的和内容:目的:加深对TCP的理解,学习端口扫描技术和原理,熟悉socket编程。

内容:实现一个扫描器,使用TCP connect进行端口扫描,并对扫描结果进行记录。

(二)课程设计要求:Windows或Linux环境下,程序在单机上运行;使用端口扫描器对一台主机进行扫描,并显示出结果;编程语言不限;提供友好的用户界面。

(三)端口扫描技术:“端口”是专门为计算机通信而设计的,它不是硬件,不同于计算机中的“插槽”,可以说是个“软插槽”。

“端口”是由计算机的通信协议TCP/IP协议定义的。

其中规定,用IP地址和端口作为套接字,它代表TCP连接的一个连接端,一般称为Socket。

具体来说,就是用[IP:端口]来定位一台主机中的进程。

计算机就像一座大楼,这个大楼有好多入口(端口),进到不同的入口中就可以找到不同的公司(进程)。

端口与进程是一一对应的,入侵者通过扫描端口,便可以判断出目标计算机有哪些通信进程正在等待连接。

(四)扫描端口的目的:端口扫描是入侵者搜集信息的几种常用手法之一,也正是这一过程最容易使入侵者暴露自己的身份和意图。

•判断目标主机上开放了哪些服务;•判断目标主机的操作系统。

如果入侵者掌握了目标主机开放了哪些服务,运行何种操作系统,他们就能够使用相应的手段实现入侵。

(五)端口的分类:端口是一个16 bit的地址,用端口号进行标识不同的作用。

端口一般分为两类。

•熟知端口号(公认端口号):由因特网指派名字和号码公司ICANN负责分配给一些常用的应用层程序固定使用的熟知端口,其数值一般为0~1023。

•一般端口号:用来随时分配给请求通信的客户进程。

(六)扫描原理的基础知识:TCP/IP模型四层结构TCP与UDP协议TCP报文结构TCP连接和释放过程(七)TCP/IP模型四层结构:(八)TCP与UDP协议:Internet的网络通信大多是建立在这两个协议之上的,各个主机遵循着TCP/IP协议封装数据包进行通信。

传输控制协议TCP(Transmission Control Protocol):TCP提供可靠的、面向连接的运输服务,用于高可靠性数据的传输。

TCP具有完善的错误检测与恢复、顺序控制和流量控制等功能。

注重可靠性的场合一般使用TCP协议,例如FTP、Telnet。

用户数据报协议UDP(User Datagram Protocol):UDP在传送数据之前不需要先建立连接。

远地主机的运输层在收到UDP数据报后,不需要给出任何确认。

广泛应用于只需一次的C/S模式的请求-应答查询,或者要求提供高效率数据传输的场合。

注重实时性、传输率、吞吐量的场合一般使用UDP,如QQ。

(九)TCP connect扫描:实现原理:通过调用socket函数connect()连接到目标计算机上,完成一次完整的三次握手过程。

如果端口处于侦听状态,那么connect()就能成功返回。

否则,这个端口不可用,即没有提供服务。

优点:稳定可靠,不需要特殊的权限。

缺点:扫描方式不隐蔽,服务器日志会记录下大量密集的连接和错误记录,并容易被防火墙发现和屏蔽。

实验设计流程:1. 原理概述通过调用socket函数connect()连接到目标计算机上,完成一次完整的三次握手过程。

如果端口处于侦听状态,那么connect()就能成功返回。

否则,这个端口不可用,即没有提供服务。

2. 运行环境本扫描软件用java语言开发,可稳定的运行在linux和windows环境下。

3.基本设计思路用户界面:使用java里面的swing包来开发用户界面;端口扫描:使用socket函数connect()连接目标计算机来判定是否目标计算机开放了要测试的端口;4..功能模块设计本软件只有一个功能模块,就是是指定主机的端口扫描。

5.程序流程及主要算法核心算法是TCP 的连接函数Socket socket = new Socket(host,port); //建立套接字if(socket.isConnected()) //判断端口号是否开放{jta.append("port: "+port+" is open !\n");list.add(String.valueOf(port));.............6.程序使用说明(1)运行程序(2)输入IP地址、开始端口号、技术端口号,点击“开始扫描”(3)可以看到开放端口号与未开放端口号,得到如下结果:7.程序分析与总结本程序使用java语言开发,可以稳定的运行在windows和linux系统下,不过程序是单线程的扫描起来比较慢。

附录- 源程序代码文件PortScanWind.javaimport java.awt.Color;import java.awt.Font;import java.awt.Point;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.io.IOException;import .InetAddress;import .Socket;import .UnknownHostException;import java.util.ArrayList;import java.util.Iterator;import java.util.List;import javax.swing.JButton;import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JOptionPane;import javax.swing.JScrollPane;import javax.swing.JTextArea;import javax.swing.JTextField;public class PortScanWind implements ActionListener,Runnable{private JFrame wind; //构建窗口private JTextField jtf, jtf2, jtf3; //3个文本private JLabel[] label = new JLabel[6]; //6个标签private int startPort, endPort; //端口private InetAddress host; //取得本机IPprivate JButton btn,stop;// 点击事件private JTextArea jta,jta2; //2个显示纯文本的多行区域private JScrollPane jspane,jspane2; //滚动条private Thread ps;private List<String> list;public PortScanWind() {wind = new JFrame("端口扫描程序");wind.setSize(400, 600);jta = new JTextArea(10,10);jta2 = new JTextArea(10,10);jspane = new JScrollPane(jta);jspane2 = new JScrollPane(jta2);//两个竖直滚动条list = new ArrayList<String>();jtf = new JTextField(20);jtf2 = new JTextField(20);jtf3 = new JTextField(20);//20个字符label[0] = new JLabel("端口扫描程序");label[1] = new JLabel("主机地址:");label[2] = new JLabel("开始端口号:");label[3] = new JLabel("结束端口号:");label[4] = new JLabel("开放端口:");label[5] = new JLabel("未开放端口:");btn = new JButton("开始扫描");stop = new JButton("停止扫描");ps =new Thread(this);label[0].setBounds(100, 35, 400, 40);//(X,Y,宽,高)端口扫描程序label[0].setFont(new Font("微软雅黑", Font.BOLD, 32));label[0].setForeground(Color.BLACK);label[1].setBounds(30, 100, 300, 30);//主机地址:jtf.setBounds(150, 100, 200, 30);label[1].setForeground(Color.BLUE); //蓝色label[2].setBounds(30, 150, 300, 30);//开始端口号:jtf2.setBounds(150, 150, 200, 30);label[2].setForeground(Color.BLUE);label[3].setBounds(30, 200, 300, 30);//结束端口号:jtf3.setBounds(150, 200, 200, 30);label[3].setForeground(Color.BLUE);label[4].setBounds(30,280,200,30);//开放端口:label[5].setBounds(220,280,200,30);//未开放端口:label[4].setForeground(Color.BLUE);label[5].setForeground(Color.BLUE);btn.setBounds(90, 250, 100, 30);//开始扫描btn.addActionListener(this);stop.setBounds(220,250,100,30);//停止扫描stop.addActionListener(this);stop.setEnabled(false);jspane.setBounds(30, 310, 150,230);//结果显示jspane2.setBounds(220,310,150,230);wind.setLayout(null);for(int i=0;i<6;i++){wind.add(label[i]);}wind.add(jtf);wind.add(jtf2);wind.add(jtf3);wind.add(btn);wind.add(jspane);wind.add(stop);wind.add(jspane2);wind.setResizable(false);wind.setLocationRelativeTo(null);wind.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);wind.setVisible(true);}public static void main(String[] args) {new PortScanWind();}@SuppressWarnings("deprecation")@Overridepublic void actionPerformed(ActionEvent e) {if(e.getSource()==btn){jta.setText("");jta2.setText("");stop.setEnabled(true);//获取用户输入的地址和端口号String ip=jtf.getText();String sport = jtf2.getText();String eport = jtf3.getText();//对用户的输入进行验证if(ip.equals("")||ip==null){JOptionPane.showMessageDialog(wind, "请输入主机地址!");return ;}else{try {host =InetAddress.getByName(ip);} catch (UnknownHostException e1) {JOptionPane.showMessageDialog(wind, "请输入有效的主机地址!");System.out.println("host初始化失败");return;//e1.printStackTrace();}}if(sport.equals("")||sport==null){JOptionPane.showMessageDialog(wind, "请输入开始扫描的端口号!");return ;}else{startPort = Integer.parseInt(sport);}if(eport.equals("")||eport==null){JOptionPane.showMessageDialog(wind, "请输入结束扫描的端口号!");return ;}else{endPort = Integer.parseInt(eport);if(endPort<startPort){JOptionPane.showMessageDialog(wind, "您输入的结束端口号太小,请重新输入!");return ;}}//jta.append("开始扫描端口了。

相关主题