端口扫描器实现毕业(设计)论文

上传人:仙*** 文档编号:202765898 上传时间:2023-04-23 格式:DOC 页数:30 大小:307.50KB
返回 下载 相关 举报
端口扫描器实现毕业(设计)论文_第1页
第1页 / 共30页
端口扫描器实现毕业(设计)论文_第2页
第2页 / 共30页
端口扫描器实现毕业(设计)论文_第3页
第3页 / 共30页
点击查看更多>>
资源描述
安 阳 师 范 学 院本科学生毕业论文 简单的端口扫描器实现诚信承诺书郑重承诺:所呈交的论文是作者个人在导师指导下进行的研究工作及取得的研究成果。除了文中特别加以标注和致谢的地方外,论文中不包含其他人已经发表或撰写的研究成果,也不包含为获得安阳师范学院或其他教育机构的学位或证书所使用过的材料。与作者一同工作的同志对本研究所做的任何贡献均已在论文中作了明确的说明并表示了谢意。作者签名: 日期: 导师签名: 日期:院长签名: 日期:论文使用授权说明本人完全了解安阳师范学院有关保留、使用学位论文的规定,即:学校有权保留送交论文的复印件,允许论文被查阅和借阅;学校可以公布论文的全部或部分内容,可以采用影印、缩印或其他复制手段保存论文。保密论文在解密后遵守此规定。作者签名:导师签名:日期:安 阳 师 范 学 院目 录1 引言22 端口扫描概述23 端口扫描相关知识23.1 端口的基本概念23.2 常见端口介绍33.3 端口扫描器功能简介33.4 常用端口扫描技术33.4.1 TCP connect()扫描 33.4.2 TCP SYN扫描33.4.3 TCP FIN 扫描33.4.4 IP段扫描43.4.5 TCP反向 ident扫描43.4.6 FTP 返回攻击44 实验流程和运行流程44.1 实现流程44.2 程序中主要的函数74.3 主流程图85 总结105.1 提出问题105.2 解决问题105.3 心得体会106 致谢11参考文献11简单的端口扫描器实现李 涛(安阳师范学院 人文管理学院 河南 安阳 455002)摘 要:本设计通过端口扫描器的研究来提高对计算机安全的认识。利用TCPconnect扫描原理,扫描主机通过TCP/IP协议的三次握手与目标主机的指定端口建立一次完整的连接,如果目标主机该端口有回复,则说明该端口开放。利用多线程技术实现了对一目标IP进行设定数目的端口扫描,计算机端口扫描技术就是这种主动防御策略实现的重要技术手段。该端口扫描器采用c+语言开发,在VC6.0编译环境下通过测试。关键词:端口扫描器 ;IP段扫描;信息安全1 引言扫描器是网络信息收集的一种方法之一,从功能上可化分为漏洞扫描器和端口扫描器。理解客户机-服务器与端口扫描之间的工作原理,完成对目标主机端口扫描功能的实现,即发现目标主机开启的端口信息。可见,端口与进程是一一对应的,如果某个进程正在等待连接,称之为该进程正在监听,那么就会出现与它相对应的端口。由此可见,通过扫描端口,便可以判断出目标计算机有哪些通信进程正在等待连接。2 端口扫描概述对于毕业设计建设,首先应考虑选择一个实验平台,考虑到windows操作系统在pc机上的垄断地位,再加上microsoft提供的办公软件、数据软件的通用性,使得现有的信息系统大都建立在windows操作系统基础上,而且,现有的信息安全攻击操作系统或漏洞威胁,大多数是针对windows操作系统1,因此,我们选择windows系统作为实现平台。本毕业论文的目标是设计并实现一个简单的端口扫描器,它通过与目标主机TCP/IP端口建立连接并请求某些服务,记录目标主机的应答,分析目标主机相关信息,从而发现目标主机某些内在的安全弱点。扫描器通常分两类:漏洞扫描器和端口扫描器。端口扫描器用来扫描目标机开放的服务端口以及端口相关信息2,漏洞扫描器检查目标中可能包含的大量已知的漏洞,如果发现潜在的漏洞可能性,就报告给扫描者。网络漏洞端口扫描器对目标系统进行检测时,首先探测目标系统的存活主机,对存活主机进行端口扫描,确定系统开放的端口,然后扫描器对开放的端口进行网络服务类型的识别,确定其提供的网络服务。漏洞扫描器根据目标系统的操作系统平台和提供的网络服务,调用漏洞资料库中已知的各种漏洞进行逐一检测,通过对探测响应数据包的分析判断是否存在漏洞。在分析总结目前现有的扫描软件,掌握扫描器的原理基础上,首先设计、实现一种端口扫描程序,存储扫描结果。3 端口扫描相关知识3.1 端口的基本概念我们这里所说的端口,不是计算机硬件的i/o端口,而是软件形式上的概念。服务器可以向外提供多种服务,比如,一台服务器可以同时是web服务器,也可以是ftp服务器,同时,它也可以是邮件服务器。为什么一台服务器可以同时提供那么多的服务呢?其中一个很主要的方面,就是各种服务采用不同的端口分别提供不同的服务。 根据提供服务类型的不同,端口分为两种,一种是tcp端口,一种是udp端口。计算机之间相互通信的时候,分为两种方式:一种是发送信息以后,可以确认信息是否到达,也就是有应答的方式,这种方式大多采用tcp协议;一种是发送以后就不管了,不去确认信息是否到达,这种方式大多采用udp协议。对应这两种协议服务提供的端口,也就分为tcp端口和udp端口。那么,如果攻击者使用软件扫描目标计算机,得到目标计算机打开的端口,也就了解了目标计算机提供了那些服务。计算机信息网络的发展加速了信息化时代的进程,但是随着社会网络化程度的增加,对计算机网络的依赖也越来越大,网络安全问题也日益明显3,端口扫描技术是发现安全问题的重要手段之一。一个端口就是一个潜在的通信通道,也就是一个入侵通道。网络安全从其本质来讲就是网络上信息安全4,它涉及的领域相当广泛,这是因为目前的公用通信网络中存在着各式各样的安全漏洞和威胁。对目标计算机进行端口扫描,能得到许多有用的信息。扫描器通过选用远程TCP/IP不同的端口的服务,并记录目标给予的回答,通过这种方法,可以搜集到很多关于目标主机的各种有用的信息,从而发现目标机的某些内在的弱点。3.2 常见端口介绍端口是一个16 bit的地址,用端口号进行标识不同作用的端口。端口一般分为两类。 熟知端口号:范围从0到1023,这些端口号一般固定分配给一些服务。比如21端口分配给FTP服务,25端口分配给SMTP服务,就是所说的邮件服务。80端口分配给HTTP服务,135端口分配给RPC服务等等。动态端口号:动态端口的范围从1024到65535,这些端口号一般不固定分配给某个服务,也就是说许多服务都可以使用这些端口。只要运行的程序向系统提出访问网络的申请,那么系统就可以从这些端口号中分配一个供该程序使用。比如8080端口就是分配给第一个向系统发出申请的程序。在关闭程序进程后,就会释放所占用的端口号。3.3 端口扫描器功能简介端口分为源端口和目的端口,源端口是本机打开的,目的端口是在和本机通信的另一台计算机的端口。端口是由计算机的通信协议TCP/IP协议定义的。其中规定,用IP地址和端口作为套接字,它代表TCP连接的一个连接端,一般称为Socket。具体来说,就是用IP端口来定位一台主机中的进程。可以做这样的比喻,端口相当于两台计算机进程间的大门,可以随便定义,其目的只是为了让两台计算机能够找到对方的进程。计算机就像一座大楼,这个大楼有好多入口(端口),进到不同的入口中就可以找到不同的公司(进程)。如果要和远程主机A的程序通信,那么只要把数据发向A端口就可以实现通信了。可见,端口与进程是一一对应的,如果某个进程正在等待连接,称之为该进程正在监听,那么就会出现与它相对应的端口。由此可见,通过扫描端口,便可以判断出目标计算机有哪些通信进程正在等待连接。服务器上所开放的端口就是潜在的通信通道,也就是一个入侵通道。对目标计算机进行端口扫描5,能得到许多有用的信息,进行端口扫描的方法很多,可以是手工进行扫描、也可以用端口扫描软件进行。 扫描器通过选用远程TCP/IP不同的端口的服务,并记录目标给予的回答,通过这种方法可以搜集到很多关于目标主机的各种有用的信息,例如远程系统是否支持匿名登陆、是否存在可写的FTP目录、是否开放TELNET服务和HTTPD服务等。3.4 常用端口扫描技术3.4.1 TCP connect()扫描 这是最基本的TCP扫描,操作系统提供的connect()系统调用可以用来与每一个感兴趣的目标计算机的端口进行连接。如果端口处于侦听状态,那么connect()就能成功。否则,这个端口是不能用的,即没有提供服务。这个技术的一个最大的优点是,你不需要任何权限。优点:稳定可靠,不需要特殊的权限。系统中的任何用户都有权利使用这个调用。另一个好处就是速度快。如果对每个目标端口以线性的方式,使用单独的connects调用,那么将花费相当长的时间,你可以通过同时打开多个套接字,从而加速扫描。缺点是扫描方式不隐蔽。3.4.2 TCP SYN扫描 TCP SYN 扫描是使用最为广泛的扫描方式,其原理就是向待扫描端口发送SYN 数据包,如果能够收到SYN+ACK 数据包,则代表此端口开放,如收到RST数据包,则证明此端口关闭,如未收到任何数据包,且确定该主机存在,则证明该端口被防火墙等安全设备过滤。由于SYN扫描并不会完成TCP连接的三次握手过程,所以SYN 扫描又叫做半开放扫描。SYN 扫描的最大优点就是速度,在Internet上,如果不存在防火墙,SYN扫描每秒钟可以扫描数千个端口,但是SYN 扫描由于其扫描行为较为明显,容易被入侵检测系统发现,也容易被防火墙屏蔽,且构造原始数据包需要较高系统权限。 3.4.3 TCP FIN 扫描有的时候有可能SYN扫描都不够秘密。一些防火墙和包过滤器会对一些指定的端口进行监视,有的程序能检测到这些扫描。如果目标主机该端口是“关”状态,则返回一个TCP RST数据包;否则不回复。根据这一原理可以判断对方端口是处于“开”还是“关”状态。相反,FIN数据包可能会没有任何麻烦的通过。这种扫描方法的思想是关闭的端口会用适当的RST来回复FIN数据包。另一方面,打开的端口会忽略对FIN数据包的回复。FIN 扫描具有较好的隐蔽性,不会留下日志,但是其应用具有很大局限性:由于不同系统实现网络协议栈的细节不同,FIN 扫描只能扫描Linux/UNIX 系统,如果是Windows 系统,无论端口开放与否都会直接返回RST 数据包,无法对端口状态进行判断。3.4.4 IP段扫描 这种扫描方式并不是新技术,它并不是直接发送TCP探测数据包,而是将数据包分成两个较小的IP段。这样就将一个TCP头分成好几个数据包,从而过滤器就很难探测到。但必须小心:一些程序在处理这些小数据包时会有些麻烦。3.4.5 TCP反向 ident扫描 ident 协议允许(rfc1413)看到通过TCP连接的任何进程的拥有者的用户名,即使这个连接不是由这个进程开始的,该服务就会读取指定TCP连接的查询数据,将拥有指定TCP连接的用户信息反馈给对方,。例如扫描者可以连接到http端口,然后用identd来发现服务器是否正在以root权限运行。这种方法只能在和目标端口建立了一个完整的TCP连接后才能看到。3.4.6 FTP 返回攻击FTP协议的一个有趣的特点是它支持代理(proxy)FTP连接,即入侵者可以从自己的计算机和目标主机 的FTP server-PI(协议解释器)连接,建立一个控制通信连接。然后请求这个server-PI激活一个有效的server-DTP(数据传输进程)来给Internet上任何地方发送文件。对于一个User-DTP,尽管RFC明确地定义请求一个服务器发送文件到另一个服务器是可以的,但是现在这个方法并不是非常有效。这种方法的优点很明显,它不容易被追踪,并可能穿过防火墙。这个协议的缺点是“能用来发送不能跟踪的邮件和新闻,给许多服务器造成打击,用尽磁盘,企图越过防火墙”。4 实验流程和运行流程4.1 实现流程(1) 对源代码仔细检查,看是否出现异常,确保程序可以正常运行。图 1 源程序编译页面 (2)输入想要扫描的网段,然后将输入的网段转化为可排序的ip数组。 /功能: 输入一个IP段,输出该IP段内的端口开放情况信息int ScanIp(const string &start_Ip, const string &endIp, multimap &ouputMap) /分解IP段内的IP到全局数组中去 GetIpToScan(start_Ip,endIp,g_vec_IpToScan);int scanNum = g_vec_IpToScan.size(); /线程总数 g_runThreadNum = scanNum;coutendl;coutendl;cout*; cout 共有 scanNum 个IP要扫描 endl; /对每个IP开一个线程 for (int i = 0; i scanNum; +i) CreateThread(NULL,0,ThreadFunc,&g_vec_IpToScani,0,NULL); /要是不间隔时间的话,同时创建socket会出现10093错误 Sleep(50); return 0;(3)建立多个线程,每个线程扫描一个ip。每个线程内先建立数据流套接字,然后绑定ip端口进行扫描。将扫描端口保存到g_map_ScanResult。/保存IP扫描的结果multimap g_map_ScanResult;/线程函数,扫描每一个IPDWORD WINAPI ThreadFunc(LPVOID th_para) /获取需要扫描的IP /char *pStrIp = (char*)th_para; unsigned long ulScanIp = *(unsigned long*)th_para;int index = 0; /端口索引 SOCKET link_sock; /SOCKET FD_SET set_flag; /SOCKET描述 short select_ret; /select异步返回值short port; /正在扫描的端口 while (index PORTSNUM) port = g_portsTOscanindex;/创建数据流套接字 link_sock = socket(AF_INET, SOCK_STREAM, 0); if (link_sock = INVALID_SOCKET) /cout 创建link_sock socket失败:错误号为: GetLastError() endl; WaitForSingleObject(g_ThreadNumMutex,INFINITE); g_runThreadNum-; ReleaseMutex(g_ThreadNumMutex); /cout *还有_ g_runThreadNum _个扫描线程进行中* endl; return -1; (4)清理结束后进程,输出结果。 void CleanProc()/清理 /线程都执行完后清理socket相关信息/ while (1) WaitForSingleObject(g_ThreadNumMutex,INFINITE); if (g_runThreadNum = 0) break; ReleaseMutex(g_ThreadNumMutex); Sleep(100); /清理socket相关信息 WSACleanup();/输出扫描结果int OutPutScanInfo() cout 扫描到 g_map_ScanResult.size() 条记录 endl; multimap:iterator iter = g_map_ScanResult.begin(); ofstream out(out.txt); cout 显示总 g_map_ScanResult.size() 条记录: endl;coutendl; for (; iter!=g_map_ScanResult.end(); +iter) out second endl; cout second endl; 4.2 程序中主要的函数int main();主函数InitProc();初始化UserInput();输入ScanIp(g_startIp,g_endIp,g_map_ScanResult);开始扫描CleanProc();清理结束后进程OutPutScanInfo();输出结果DWORD WINAPI ThreadFunc(LPVOID th_para);扫描线程每一个ipunsigned long InvertIp(unsigned long srcIp);将ip化为长整型int GetIpToScan(const string &StartIp, const string &EndIp, vector &vec_ip) ;将所有ip排序放在一个数组内4.3 主流程图 开始 初始化输入ip段ScanIp扫描计算时间 结束图 2 函数主流程图4.4 结果图 3 开始界面说明:可扫描的IP段为192.168.1.1-192.168.1.254。图 4 扫描界面说明:本程序需要在联网的情况下才能完全找到开放的端口。图 5 结果界面4.5 扫描结果说明80端口说明:80端口是为HTTP(HyperText Transport Protocol)即超文本传输协议开放的,此为上网冲浪使用次数最多的协议,主要用于WWW(World Wide Web)即万维网传输信息的协议。可以通过HTTP地址(即常说的“网址”)加“:80”来访问网站,因为浏览网页服务默认的端口号都是80,因此只需输入网址即可,不用输入“:80”了。有些木马程序可以利用80端口来攻击计算机的,例如Executor、RingZero等。135端口说明:135端口主要用于使用RPC(Remote Procedure Call,远程过程调用)协议并提供DCOM(分布式组件对象模型)服务,通过RPC可以保证在一台计算机上运行的程序可以顺利地执行远程计算机上的代码;使用DCOM可以通过网络直接进行通信,能够跨过包括HTTP协议在内的多种网络传输。冲击波病毒就是利用RPC漏洞来攻击计算机的。RPC本身在处理通过TCP/IP的消息交换部分有一个漏洞,该漏洞是由于错误地处理格式不正确的消息造成的。该漏洞会影响到RPC与DCOM之间的一个接口,该接口侦听的端口就是135。139端口说明:通过139端口入侵是网络攻击中常见的一种攻击手段,一般情况下139端口开启是由于NetBIOS网络协议的使用。NetBIOS即网络基本输入输出系统,系统可以利用WINS服务、广播及Lmhost文件等多种模式将NetBIOS名解析为相应IP地址,从而实现与对方计算机进行共享资源的连接。445端口说明:445端口是一个毁誉参半的端口,有了它我们可以在局域网中轻松访问各种共享文件夹或共享打印机,但也正是因为有了它,黑客们才有了可乘之机,他们能通过该端口偷偷共享你的硬盘,甚至会在悄无声息中将你的硬盘格式化掉!我们所能做的就是想办法不让黑客有机可乘,封堵住445端口漏洞。 3306端口说明:MySQL的默认端口。这个是数据库端口,进去后,可以查看数据库中的数据。5 总结5.1 提出问题(1)确定选题后,综合考虑选择哪种技术去实现端口扫描,写出原因。(2)面对大量端口需要扫描,怎么样做到既保持程序效率又保持程序的稳定性。 (3)在程序设计完成后,怎样经过调试确定最大连接线程数。5.2 解决问题首先综合考虑各种技术及背景,发现用connect()函数去连接这个方法更加可靠且易于实现和调试,在出现问题后可相对容易的对其解决。而且在本学期学过网络安全tcp/ip的课程,对connect()函数的连接过程有些许掌握,更有利于软件的开发。在面对几千甚至上万个端口需要扫描时,需要考虑到并发处理端口,我们想到了多线程,在对其多线程设计中,要注意控制线程的数量,如果线程数量过多,会造成程序的崩溃,若太少,则程序运行太慢。所以用多线程并发技术并加以最大线程数量来控制。程序在运行中,与程序性能有关的首先是本机硬件条件和对方应答所需时间,不同端口号处理响应请求时间也不一样而且跟网络环境也有一定关系。一般来说,机器处理器速度越快,则处理每个端口的速度越快。所以程序应该在实际运行中,通过不断修改最大线程数并运行来找到一个合适的最大线程数量,可以将范围从1000设置到10000,再到60000,不断进行调试达到最佳。5.3 心得体会本设计经过一学期的努力,基本满足了一个端口扫描程序的基本要求。完成后的程序实现了ip端口扫描功能,能对单个ip扫描或多个ip。系统设计期间,学习到很多课堂上没有的知识,还积累了很多实践经验,增强了动手能力和解决实际问题的能力。通过这次的课程设计,对网络编程有了更深入的了解,进一步熟悉了TCP和UDP协议的内容,掌握了ip扫描端口的基本原理。对编程思想有了进一步的体会,养成了一些良好的编程习惯。系统虽然完成,但还有很多不足之处,希望自己能不断学习和实践,争取以后做得更好。通过这次端口扫描器的实验深化了信息对抗,信息安全的意识。对于网络扫描器有了整体上的认识。了解了socket函数的基本用法和端口扫描的基本原理,更加熟练掌握了c+语言。在这次设计中在处理线程上遇到了很大麻烦,不过通过上网查找和书本,基本解决,还有就是刚开始在socket的运用上很是不懂,经过上网查找也顺利解决。总之这次设计,不仅是对以前只是的巩固,也学习到了许多新知识。6.致谢从接受课题到现在完成毕业设计论文,衷心地感谢我的指导老师宋俊昌老师,本系统是在宋老师的悉心指导和耐心教导下完成的,他给予了我很大的帮助,在系统的设计开发过程中向我提供了相关的参考书籍与网站设计资料。在系统设计过程中,我遇到了许多自己靠看书查阅资料解决不了的技术上的问题宋老师都及时地给予指导。同时感谢系计算机教研室的其他老师与工作人员,他们给我提供了良好的学习和研究环境,并为我的论文提出了许多宝贵的参考意见,少走了不少弯路。还感谢我的亲人和朋友,是他们在背后默默的支持我,鼓励我。本次论文的完成,学校为我们提供了便利的条件和开发环境,而我们的指导老师更是悉心辅导我们。完成毕业设计的过程中我深刻认识到学习是一个很严谨的过程,只有认真钻研,才能得到真知;而马虎大意将会一无所获。在系统开发过程中我还经常和同学们一起研究、探讨问题,我设计的网站中也有很多问题是在和同学的探讨中发现并改正的。在此对给予我帮助的同学同样表示衷心的感谢!最后,再次向他们表示我最衷心的感谢和最诚挚的敬意,这次课程设计宋老师指导了很多,从算法原理到计算机原理知识都一并拓展,我受益颇多,感谢宋老师在这次课程设计中的指导和栽培,以及同学们的热心帮助,祝老师工作顺利、身体健康。参考文献1 赵树升,赵韶平.信息安全原理与实践M.北京:清华大学出版社,2004.2 李雷,端口扫描方法的原理.实现和防御J.电脑编程技巧和维护,2004,(5):21-25.3 刘文涛,网络安全编程技术与实例M.北京:机械工业出版社2008.4 邹新国. 计算机信息与网络安全技术M. 济南市:黄河出版社, 2008.08.5 肖微,端口扫描技术的原理及原理J.网络安全技术与应用,2006,(7):32-41.RealizeA Simple Port ScannerLi Tao(Humanistic Management College of Anyang Normal University, Anyang, Henan 455002)Abstract: The designed to improve computer security awareness through research port scanner. Use TCP connect scanning principle, designated scan host via TCP / IP protocol handshake with the target host port to establish a full connection, if the target host through the port with reply, it indicates that the port is open. The use of multi-threading technology to achieve a port scan on a target IP for a set number of computer port scanning technology is the active defense of this important technology to policy implementation. The port scanner using c+ language development, in VC6.0 compiler environment through the test.Keywords: port scanner; IP scanner; information security附录#pragma comment(lib,ws2_32.lib)#pragma warning (disable:4786)#include #include #include #include #include #include #include #include #include /#include IpScan.husing namespace std;/全局变量:/待扫描的端口short g_portsTOscan= 20,21,22,23,25,42,43,47,53,63,67,68,79,80,95,106,107,109,110,113,135,137,138,139,143, 144,161,162,443,445,1024,1080,1433,1434,1755,3306,4000,5010,5190,5631,5632,8000,8080 ;const short PORTSNUM = sizeof(g_portsTOscan) / sizeof(short);/端口个数/等扫描的IPvector g_vec_IpToScan;string g_startIp;string g_endIp;/开启的线程数,目前为1个IP1个线程long g_runThreadNum;/socket相关TIMEVAL g_timeout; /阻塞等待时间/FD_SET g_mask; /socket模式设置,储存socket信息const short TIMEOUT = 1; /阻塞等待时间WSADATA g_wsadata; /socket版本信息/线程中的互斥体HANDLE g_PortMutex;HANDLE g_ThreadNumMutex;HANDLE g_ResultMutex; /输入结果的互斥量/保存IP扫描的结果multimap g_map_ScanResult;/-/线程函数,扫描每一个IPDWORD WINAPI ThreadFunc(LPVOID th_para) /获取需要扫描的IP /char *pStrIp = (char*)th_para; unsigned long ulScanIp = *(unsigned long*)th_para; int index = 0; /端口索引 SOCKET link_sock; /SOCKET FD_SET set_flag; /SOCKET描述 short select_ret; /select异步返回值 short port; /正在扫描的端口 while (index PORTSNUM) port = g_portsTOscanindex; /创建数据流套接字 link_sock = socket(AF_INET, SOCK_STREAM, 0); if (link_sock = INVALID_SOCKET) /cout 创建link_sock socket失败:错误号为: GetLastError() endl; WaitForSingleObject(g_ThreadNumMutex,INFINITE); g_runThreadNum-; ReleaseMutex(g_ThreadNumMutex); /cout *还有_ g_runThreadNum _个扫描线程进行中* endl; return -1; FD_ZERO(&set_flag); /将指定文件描述符清空 FD_SET(link_sock,&set_flag); /用于在文件描述符集合中增加一个新的文件描述符 /设置连接地址 SOCKADDR_IN scan_addr; scan_addr.sin_family = AF_INET; scan_addr.sin_addr.s_addr = ulScanIp; scan_addr.sin_port = htons(port); unsigned long sock_set = 1; ioctlsocket(link_sock,FIONBIO,&sock_set); /设置套接字为非阻塞模式,第3个参数非0为非阻塞 connect(link_sock,(struct sockaddr *) &scan_addr, sizeof(scan_addr);/连接指定IP端口 select_ret = select(0,NULL,&set_flag,NULL,&g_timeout);/异步返回值 if (select_ret = 0 | select_ret = -1) +index; continue; else strstream stream_result; struct in_addr ipaddr; ipaddr.s_addr = ulScanIp; char *pStrIp = inet_ntoa(ipaddr); stream_result t 主机地址为: pStrIp t找到开放的端口: port 0; string str_result(stream_result.str(); /将扫描结果储存到输出变量中去 WaitForSingleObject(g_ResultMutex,INFINITE); g_map_ScanResult.insert(make_pair(ulScanIp,str_result); ReleaseMutex(g_ResultMutex); +index; /扫描完一个线程 shutdown(link_sock, 0); closesocket(link_sock); WaitForSingleObject(g_ThreadNumMutex,INFINITE); g_runThreadNum-; ReleaseMutex(g_ThreadNumMutex); /cout *还有_ g_runThreadNum _个扫描线程进行中* 8) & 0x00FF; third = (srcIp 16) & 0x00FF; fourth = (srcIp 24) & 0x00FF; return (first 24) | (second 16) | (third 8) | fourth; /-/将IP内的IP转化成一个一个unsigned long 类型存在数组中int GetIpToScan(const string &StartIp, const string &EndIp, vector &vec_ip) /判断输入的IP是否合法 unsigned long ulStartIp = inet_addr(StartIp.c_str(); unsigned long ulEndIp = inet_addr(EndIp.c_str(); if( INADDR_NONE = ulStartIp | INADDR_NONE = ulEndIp ) cout 请输入合法的IP ulEndIp) max_ip = ulStartIp; ulStartIp = ulEndIp; ulEndIp = max_ip; int ipnums = ulEndIp - ulStartIp; for(int i = 0;i = ipnums;+i) /将每个IP的unsigned long型存到数组中供扫描 vec_ip.push_back(InvertIp(ulStartIp+); return 0;/-/功能: 输入一个IP段,输出该IP段内的端口开放情况信息int ScanIp(const string &start_Ip, const string &endIp, multimap &ouputMap) /分解IP段内的IP到全局数组中去 GetIpToScan(start_Ip,endIp,g_vec_IpToScan); int scanNum = g_vec_IpToScan.size(); /线程总数 g_runThreadNum = scanNum;coutendl;coutendl; cout*; cout 共有 scanNum 个IP要扫描 endl; /对每个IP开一个线程 for (int i = 0; i scanNum; +i) CreateThread(NULL,0,ThreadFunc,&g_vec_IpToScani,0,NULL); /要是不间隔时间的话,同时创建socket会出现10093错误 Sleep(50); return 0;/-/输出扫描结果int OutPutScanInfo()cout 扫描到 g_map_ScanResult.size() 条记录 endl; multimap:iterator iter = g_map_ScanResult.begin(); ofstream out(out.txt); cout 显示总 g_map_ScanResult.size() 条记录: endl;coutendl; for (; iter!=g_map_ScanResult.end(); +iter) out second endl; cout second endl; return 0;/-void UserInput() cout endl;cout 简单的端口扫描器实现 endl;cout endl;cout endl; cout 姓名:李涛 学号:134951007 endl;
展开阅读全文
相关资源
相关搜索

最新文档


当前位置:首页 > 管理文书 > 施工组织


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!