JAVA大作业实验范例

  • 格式:doc
  • 大小:87.50 KB
  • 文档页数:14

大 作 业 设 计 说 明 书 题 目: 网络综合设计

主机端口扫描的实现

院(系): 信息工程学院 专 业: 计算机科学与技术 班 级: 学 号: 2 姓 名: 指导老师: 完成时间:

成绩:

2

目录 1 引言.............................................................. 3 2 理论基础.......................................................... 4 3 设计技术.......................................................... 5 4 详细实现.......................................................... 6 5 小结............................................................. 12 参考文献........................................................... 13 3

1 引言 目前常用的扫描技术有很多,具体有一下几种:1、TCP connect()扫描;2、TCP SYN扫描;3、TCP FIN 扫描;4、IP段扫描;5、TCP 反向 ident扫描;6、FTP 返回攻击;7、UDP ICMP端口不能到达扫描;8、UDP recvfrom()和write() 扫描。其中第一种是最基本的扫描,操作系统提供的connect()系统调用可以用来与每一个感兴趣的目标计算机的端口进行连接。如果端口处于侦听状态,那么connect()就能成功。否则,这个端口是不能用的,即没有提供服务。这个技术的最大的优点是,系统中的任何用户都有权利使用这个调用。另一个好处就是速度,如果对每个目标端口以线性的方式,使用单独的connect()调用,那么将会花费比较长的时间;如果通过使用多线程技术,通过同时创建多个套接字来加速扫描,即同时观察多个套接字,则扫描同样多的端口将花费非常少的时间,但这种方法的缺点是很容易被察觉,并且被防火墙将扫描信息包过滤掉。目标计算机的logs文件会显示一连串的连接和连接出错消息,并且能很快使它关闭,并且线程的数目要选择适当,不然也会的得不到理想得速度。 4

2 理论基础 本程序采用TCP connect( )原理实现。运用了两种方法:第一种是采用线性得方式,即使用单独得connect()函数调用实现;第二种是采用多线程得方式,即通过同时创建多个套接字,同时对多个端口使用connnect( )方法。通过比较发现,采用多线程实现时,速度明显快与第一种方式。 5 3 设计技术 本程序采用Windows 操作系统下得Visual C++开发工具实现。采用MFC类种得套接字CSocket类和线程CWinThread类实现。主要运要CSocket类中的初始化CSocket()构造函数,创建套接字Create()函数;和创建线程函数AfxBeginThread((AFX_THREADPROC)TestConnection, p);以及其他的一些技术。详见下面详细设计部分。 6

4 详细实现 下面是部分主要代码及其功能和运行结果: 第一种采用线性方法实现时: 当单击程序中的“开始”按钮时执行扫描程序 void CScannerDlg::OnScan() { // TODO: Add your control notification handler code here UpdateData(true); m_IP.EnableWindow(false); //设置控件的状态 GetDlgItem(IDC_STARTPORT)->EnableWindow(false); GetDlgItem(IDC_ENDPORT)->EnableWindow(false); m_clear.EnableWindow(false); m_scan.EnableWindow(false); m_stop.EnableWindow(true); CString IPAddress; BOOL bProgress,bSocket,Flag; CString str; „„„„„„„„„„.. //从对话框中获取IP地址 if(IPAddress=="") { AfxMessageBox("Please check IP Address !"); return; } bProgress=InitProgressCtrl(m_startPort,m_endPort);//初始化进度条 if(bProgress==FALSE) AfxMessageBox("Initialize ProgressCtrl failed !"); 7

for(port=m_startPort;port<=m_endPort;port++) {

str.Format("%d",port); SetWindowText("正在扫描端口:"+str); „„.. //测试端口的连接状态 if(bSocket==FALSE) { AfxMessageBox("Create Socket Failed !"); return; } if(Flag==TRUE) //将结果添加到列表中 { „„„„ } else { „„„.. } MSG message; //响应消息的函数 if (::PeekMessage(&message,NULL,0,0,PM_REMOVE)) { ::TranslateMessage(&message); ::DispatchMessage(&message); } m_progress.SetPos(port); } SetWindowText("扫描完毕!"); m_IP.EnableWindow(true); //设置对话框中的控件状态 8

GetDlgItem(IDC_STARTPORT)->EnableWindow(true); GetDlgItem(IDC_ENDPORT)->EnableWindow(true); m_clear.EnableWindow(true); m_scan.EnableWindow(true); m_stop.EnableWindow(false);

} 测试目标主机的端口是否打开的函数如下: BOOL CScannerDlg::TestPortState(CString IPAddress, UINT port, BOOL &Flag) { „„„„„„. Flag=pSocket->Connect(IPAddress,port);// Flag为TRUE时表示端口打开, pSocket->Close(); //否则为关闭

delete pSocket; return TRUE; } 运行结果如图4-1:

图4-1 采用线性方法实现时相应的运行结果 9

第二种采用多线程方法实现时: 首先定义消息#define WM_MY_SCAN (WM_USER+5) 然后在对话框的头文件中添加afx_msg LONG AddList(UINT wParam,LONG lParam);和实现文件中添加ON_THREAD_MESSAGE(WM_MY_SCAN , AddList)消息函数处理信息。 当单击程序中的“开始”按钮时执行扫描程序 void CMultiThreadScannerDlg::OnScan() { // TODO: Add your control notification handler code here UpdateData(true); m_scan.EnableWindow(false); m_clear.EnableWindow(false); BOOL bProgress; IPAddress=""; GetIPAddress(IPAddress);//从对话框中获取IP地址 if(IPAddress=="") { AfxMessageBox("Please check IP Address !"); return; } „„„„„„„„„„„„„„.;//初始化进度条 if(bProgress==FALSE) AfxMessageBox("Initialize ProgressCtrl failed !"); handle=this->m_hWnd; HANDLE hMutex=NULL;//定义互斥信号对象 if((hMutex=OpenMutex(MUTEX_ALL_ACCESS,FALSE,"MultiThreadScanner"))==NULL) { //如果没有其他进程创建这个互斥量,则重新创建 10

„„„„„„„„„„„.. }

int times; if(m_startPort==m_endPort) times=1; else { „„„„„„„„„„„„.//定义每次创建200个线程 if(((m_endPort-m_startPort)%200)>0) times++; } „„„„„„„„ „„„„„„„„„ //定义200个线程

CString str; „„„„„„„„„.//本函数中参数p不用 portcount=m_startPort; //创建线程 for(int i=0;i{ int n=0; for(int k=0;k<200;k++) { n++; str.Format("%d",portcount); if(portcount>m_endPort) break; „„„„„„„„„„„„„„„„„„„„„„.