基于VC++的网络扫描器设计与实现

本文正文其实是自己的毕业论文,现在搬上来有两个原因。

一是之前大学的文档都放在百度网盘上,大概去年的时候百度网盘改版搞得不太稳定,文件夹移动次数一多里边就会有一些文件丢失了,也没有很在意。但前几天看申请软著的汇编记事本代码文件怎么找都找不到,自己电脑也早就换了,放网盘不靠谱放自己电脑也不靠谱,这情况怕是现在没丢的东西以后也会丢有必要另想他法保存。

二是当时论文答辩的时候,导师问“你觉得你的扫描器对比网上现有的扫描器有什么优势”,当时回答的是“现在网上很多扫描器很多是闭源的这扫描器是开源的”—-其实心里想的是“和十多年前的X-Scan比都差很远能有什么优势”—-现在也还觉得功能比较差有很多问题(比如最明显的扫描时主线程卡死),但开源这事可以顺手做一下以便自我安慰当时并非随口乱说。

现在我也没有意会为什么两轮答辩导师都问我这个问题,感觉这不是给我挖坑吗。不过一辩另外一位老师问的问题当时就反应过来了,他问“代码都是你自己写的吗有没有用到现成的代码”,我首先说“肯定有用现成的代码不管怎么样你最底层都得用系统的API,现在基本是一个页面一个类底层都用了现成的代码”,然后他又问“这些类都是你自己实现的吗”,我说“是我自己实现的”。首先通过调用系统API这个没人能绕过的问题正面回答“有没有用现成代码”的问题,迫其把自己的提问修改成“这些类都是你自己实现的吗”,然后回答都是我自己实现的。在“调用系统API”和“类自己实现”中间的“类的代码是不是你自己原创的”这最关键的地方直接被没有说谎地回避掉了。其实这扫描器核心功能代码都出自李瑞民的《网络扫描技术揭密》,自己做的主要工作主要是筛选、验证、整合;一定要说代码原创的话,应该五五之间吧。但其实也不一定是老师没有注意到我回避了他的问题,和很多时候一样别人问你一个问题并不一定是要你给出真实的、正确的答案,如果你的态度、思路、应变能力能让人认可那别人也就觉得够了。

下面直接把论文贴上来,只做些格式调整内容就不做修改了。项目使用VC++6.0编译应该没问题,由于使用Socket Raw所以要以管理员身分启动。

github地址:https://github.com/PrettyUp/Scanner

 

 

伴随互联网的不断发展,人们对互联网的依赖与日俱增,越来越多的个人信息被存放到电脑等各终端上,终端安全亟待得到保证。如果知识和习惯仍停留在无意识状态用户的信息安全将面临极大安全隐患。掌握自己电脑等终设备的网络运行状况正如前了解自己电脑本地的安全状况一样逐渐成为网民的必备素质

设计本着兼顾界面友好功能齐备的要求设计了一款面向普通网民的网络扫描器该扫描器使用VC++6.0基于MFC6.0开发,运行于Windows7操作系统,具有主机扫描、端口扫描、NetBIOS扫描、SNMP扫描、弱密码扫描、嗅探器、DOS攻击、SQL注入检测和扫描报告生成等九项功能。主机扫描实现对指定IP主机是否存活进行判断,端口扫描实现对指定端口是否开放进行判断,NetBIOS扫描实现对目标主机的NetBIOS信息进行读取,SNMP扫描实现对目标主机的SNMP信息进行读取,弱密码扫描实现对系统弱用户名和密码的猜解,嗅探器实现对含指定信息的数据包进行拦截,DOS攻击能够对目标主机发起指定数量的线程连接,SQL注入能够对网页是否存在注入漏洞进行半自动地扫描,报告生成可对扫描结果以HTML等格式生成扫描报告。

 

    关键词:网络安全 扫描器 VC++ 网络协议 扫描算法

 

 

The Design and Implementation of Network Scanner

ABSTRACT

 

With the continuous development of the Internet, people’s dependence on the Internet is increasing day by day, more and more personal information is stored in the computer and other terminals, terminal security should be guaranteed. If knowledge and habit is still in no state of consciousness, the user’s information security will face a great security risk.To master the network operation status of their own computer and other terminal equipments as before to understand tthe local security situation of their own computer  has become the essential quality of netizen.

This text that is based on the requirements of friendly interface and complete functions, designs a network scanner for ordinary netizens.The scanner that based on the MFC6.0 framework uses the VC++6.0 compiler for development,it runs on the Windows7 operating system.The scanner has host scanning, port scanning, NetBIOS scan, SNMP scan, weak passwords scanning, sniffer, DoS attacks, SQL injection detection and scanning report generation and so on nine functions. The functionn of the host scan is to determine whether the specified IP host survival,the port scanning is to determine whether the specified port is opening , NetBIOS scan is to read the NetBIOS information of the target host, the SNMP scan is to read the SNMP information of target host,the Weak password scanning is to realize the guess of system’s weak username and password, sniffer is to achieve the interception of data packets that contain the specified information,the DOS attacks can initiate a specified number of threads to the target host,the SQL injection can judge Whether there are loopholes in the web page by semi-automatic scan,and the report generation can make the scan results be generated in the format of HTML scan report.

 

    Keyword: Network security; Scanner; Networking protocol; Scanning algorithm

 

 

  

 

I

ABSTRACT II

一章 绪论 1

1.1 设计背景 1

1.2 国内外发展现状 1

1.3 本毕业设计主要工作 2

二章 扫描器相关概念介绍 3

2.1 开发运行环境 3

2.2 基本概念介绍 5

2.3 扫描器常用技术介绍 6

三章 扫描器的分析与设计 9

3.1 可行性分析 9

3.2 需求分析 10

3.3 扫描器的设计 11

四章 扫描器的实现 21

4.1 总体设计的实现 21

4.2 主机扫描选项卡 22

4.3 端口扫描选项卡 23

4.4 NetBIOS扫描选项卡 24

4.5 SNMP扫描选项卡 25

4.6 弱密码扫描选项卡 26

4.7 嗅控器选项卡 27

4.8 DOS攻击选项卡 28

4.9 注入检测选项卡 29

4.10 报告选项卡 30

五章 扫描器测试及结果 31

5.1 主机扫描结果 31

5.2 端口扫描结果 31

5.3 NetBIOS扫描结果 32

5.4 SNMP扫描结果 32

5.5 弱密码扫描结果 33

5.6 嗅探器扫描结果 33

5.7 DOS攻击结果 34

5.8 注入检测结果 34

5.9 报告功能结果 36

六章 总结与展望 37

参考文献 38

附录 40

致谢 46

 

第一章 绪论

 

1.1设计背景

据中国互联网网络信息中心数据,截至201512月中国网民数量达到6.88亿人,互联网普及率达到50.3%,较2014年新增网民3951万人提升2.4个百分点;其中城镇网民4.93亿占比71.6%,较2014年底增加网民2257万人增幅4.8%,农村网民1.95亿占比达到28.4%,较2014年底增加1694万人增幅9.5%[1]而据中国电子商务研究中心发布的《2015(上)中国电子商务市场数据监测报告》数据显示,中国网络零售市场交易规模占到社会消费品零售总额的11.4%,较2014年上半年的8.7%,增长31%[2]与之相应的是,据腾讯20146月发布的数据,在12周内苏一省遭受的黑客攻击源就达3亿9648万次。[3]因此无论从个人感受上还是从统计数据上,毋庸置疑互联网不断从广度和深度两个维度向人们的生活渗透,而同时在这种趋势下网络安全显得格外重要起来。

20059月周鸿祎创立的奇虎360凭借360杀毒“免费+增值服务+其他”的商业模式进入市场[4],以迅雷不及掩耳之势拿下个人用户安全市场,就只结果来看,十年过后用户的系统安全意识有了很大提高用户系统环境安全也确实得到了极大改善。然而在安全防护技术升级的同时,攻击手段也从下个工具抓的时代进入到专业化系统化的时代2014年2月27日中央网络安全和信息化领导小组宣告成立[5],在表示对网络安全重视的同时也表示网络安全形势的严峻。杀毒软件的查杀清理优化功能和和仅仅掌握杀毒软件的使用已不足以应对日新月异层出不穷攻击手段,用户上网的行为习惯不能停留在毫无防范意识的状态,[6]需要更进一步的了解网络击的知识和帮助他们了解网络攻击知识的辅助工具。Guillermo Horacio Ramirez CaceresYoshimi Teshigawara等人也执类似观点并为家庭用户安全防护设计了一套防护系统。[7]

1.2国内外发展现状

一般来说,网络攻击要遵循下面的5个阶段:侦察、扫描、获得访问、维持访问和擦除踪迹[8]。在扫描阶段,最常用的方法是使用ping命令探测主机是否存活,使用telnet命令去判断端口是否开放,然而效率低下是手动扫描的一大弊端。因此扫描自然而然地进入了通用扫描器阶段,这类扫描器的特点是只能扫描主机是否存活以及端口是否开放。但是这样初级的信息不够用,因此扫描器向专用扫描器的方向发展,这类扫描器的特点是追求扫描所有端口,更追求准确地定位端口的服务信息。先精后全是现代扫描器的主要发展方向。所谓先精后全,就是扫描器在一项功能做到极致后向下一向相邻功能发展直到大而全,当然在相当长一段时间内系统和web还是一条扫描器明显的分界线。

在国外,1992Chris Klaus设计的Internet Security Scanner1996Renaud Derasion编写的Nessus两种扫描器基本上奠定了扫描器技术的基础,现仿的扫描器技术在此基础上没有太大发展。[9]现今NessusAppscan一起作为商业扫描器的优秀代表,NmapMetasploit框架以其开源而受推崇,其中Nmap更偏端口扫描,Metasploit更偏向渗透攻击

在国内,X-Scan是一个优秀的扫描器类工具软件,X-Scan V1.0版由安全焦点公司(www.xfocus.net)于2000年12月首次发布[10]D也是一个多年前网站渗透的必备工具[11]伴随安全技术的与国外接轨和国内网络安全行业的规范化,这些曾经由个人或团队开发的名盛一时已渐渐淡出人们的视野,现今绿盟等安全公司有一些商业版本可以购买,其他一些大大小小的扫描器则散落在安全人士或黑客手中。总体而言国内扫描器缺少重量级产品。

1.3本毕业设计主要工作

针对用户需要一款扫描器,而国内扫描器沉寂国外扫描器不接地气的情况,我的目标是编写一款对普通用户友好的而功能又相对完善的具有一定电脑使用基的用户即可使用的扫描器,并藉此以自己的理解对使用到的和种扫描技术进行阐述,以供有兴趣的朋友交流学习。

本文第一章对该扫描器的开发背景进行更为详细的说明。第二章对该扫描器的开发环境、涉及的端口等概念和使用多线程等技术进行全面阐述。第三四五章分别就扫描器的主体及其九大功能的界面设计、编程实现和测试结果进行系统介绍。第六章是本次毕业设计的总结与展望。

 

第二章 扫描器相关概念介绍

 

2.1开发运行环境

2.1.1Windows操作系统

1980年微软以5万美元的价格从西雅图电脑产品公司买断了QDOS,在稍加修改之后改名MS-DOS授权IBM使用,其中一个细节是每出售一台机器微软按比例抽成而非买断使用。在操作系统简易繁多和以硬件为主的时代急于抢夺苹果PC市场的IBM并没有太多在意用谁的操作系统以及怎么合作,而当其后知后觉弱小的微软公司竞然在合作时敢和自己平起平坐的时候,脚踏多只船授权多家公司使用MS-DOS的微软公司确实已不是自己可以任意揉捏的软子。其实微软很多成功的产品都是收购来的包括PowerPoint1987SQL Server1994都是收购来的可以说微软才真的是收购的行家。[12]

刚兴起的微软聪明地没有妄自尊大地与市场前辈们正面冲突,一方面使用Xenix联手SCO搅乱UNIX竞争格局,另一方面通过同意共同开发OS/2安抚意见很大的IBM公司,假装仍旧依赖MS-DOS推出“如同玩具”的Windows1.0等版本示弱于苹果公司,避开漩涡中心在旁煽风点火为自己节省最大的精力和争取更多的研发时间,这些应对手段显示出了盖茨和微软极大的运营智慧。

1990年推出的Windows3.0获得了极好的市场反应,微软从此进入良性发展的快车道1995年推出的Windows95更是一举奠定其PC操系统不可撼动的霸主地位。时至今日Windows仍然占据90%以上的桌面市场。回首看来恰当的合纵联横、富有远见的投资是Windows成功的外在条件,而友好的用户界面、强大office办公软件和配套的VC++等开发工具是其成功的内在因素一款成功的商品往往是营销和品质完美结合的产物,虽然微软在竞争中的手段有些投机乃至卑劣,但不能否认Windows是相当成功和强大的产品。或者我们还要应当承认,商场也是一个成王败寇的世界,多年以后人们只会津津乐道有一个公司叫Microsoft它有个系统叫Windows,而失败的对手们只留在了历史文献里。

 

基于VC++的网络扫描器设计与实现

 

2.1 Windows主要版本及发行年份

 

2.1.2VC++和MFC

Microsoft Visual C++是微软公司1992年开始推出的可视化的C++集成开发环境,以及界面友好功能完善而深受用户喜爱。从7.0版本开始VC++逐渐被整合到Visual Studio,但是1998年发行VC++6.0以其功能齐全、小巧和参考资料多而问题占有很大一部分市场。

在我看来MFC(Microsoft Foundation Classes,微软基础类库)是VC++相较其他编译器最大的竞争优势。首先MFC是对Windows API的封装,借助MFC用户可以从面向过程编程进入到面向对象编程其次MFC不单是一个类库而且是一个开发框架,一是指代码上很多重复性的代码、工作不用再编写、组织,而只需要生成对应的类调用其中的方法即可;二是指MFC将程序员从传统的switch-case中解放出来,简化了Active X 控件的开发其结构框架使得 Windows对象,如窗口、对话框及控件变得如同C++中的对象一样操作[13]当然MFC的设计给使用者带来方便的同时也给很多初学都带来了理解上的困难,比如找不到Main函数所以不清楚程序庞杂的函数的执行顺序、不用编写控制逻辑所以难以理解如何调用对应的消息响应函数、通过窗口添加不明白变量和对话框如何对应等等。所以MFC简化了好多工作确实使人容易上手,而但如果要想要熟练运用,理解MFC程序的代码组织结构其实和C++是一样的这部分工作还是要用不少的时间去补回来的。

 

基于VC++的网络扫描器设计与实现

 

2-2 VC++MFC等的调用关系图

 

2.1.3扫描器开发运行环境

    本扫描器在使用VC++6.0编译器基于MFC6.0Windows7 32位操作系统上开发而成,经测试,当dll文件齐全时可以在Windows XPWindows 7上运行。

2.2基本概念介绍

2.2.1网络安全

网络安全是指网络系统的硬件系统、软件系统及其系统中涉及的数据受到预设的保护,而可以连续、可靠、正常地运行,并不因偶然事故或恶意处理而遭受破坏、非法更改、信息泄漏。网络安全从其本质上来讲就是网络上的信息安全和服务安全,从广义来说,凡是涉及网络上信息的保密性、完整性、可用性、真实性和可控性的相关技术和理论都是网络安全的研究领域。[14]

2.2.2网络安全问题的根源

网络安全根源主要源于以下四点:①黑客的恶击,②TCP/IP协议缺少认证和加密机制,③网络基于协议连接无须面对面的开放性,④用户端安全意识不强或防护措施不到位。我们看到从攻击源到链路到被攻击端都存在着威胁,共同构成了网络安全问题的根源。

2.2.3端口和服务

所谓端口就是计算机操作系统的一种软件式的编号,使用2 个字节16位表示范围从12065535216。所有计算机的内外交流都要经过端口,当然要明白的是端口只是一个数字编号,本身不能处理任何信息,计算机的内外交流最终要依靠服务。所谓服务就是软件通过端口对外提供的网络交互功能。服务要经过端口才能对外服务,而大多数服务只合用一个特定端口所以有时端口和服务可以互相指代。

2.2.4网络协议

上述的端口就是传输层的众多值里的一个值而已,所以更准确的说法应该是软件通过协议对外提供服务,至于人们平时更多的说端口,是因为端口是普通程序员和普通用户最常控制的变量。对于计算机专业接受高等教育的人总会听说七层开放互联参考模型OSI,而TCP/IP协议是事实的工业标准,对于为什么即然TCP/IP成了标准还要一直说OSI是因为,我们前面说TCP/IP协议没有认证和加密机制是造成网络安全威胁的一大原因,而OSI模型的会话层和表示层是解决这两大问题的一个不错的设计方案。网络协议和“层”表现形式到底是什么们可以把数据包想成是一个数组,比如packet[1024],packet[0]packet[13]packet[1020]packet[1023]是网络接口层,packet[14]packet[23]是网络层,packet[24]packet[43]是传输层其中packet[24]packet[25]的值就是所指的端口,packet[44]packet[1019]就是应用层数据,如果要加入会话层和表示层再从packet[44]之后划出若干位来表示就好了。服务通常与应用层协议一一对应,所以协议和服务有时也可以互相指代。

2.2.5网络扫描

端口扫描是指向目标主机的 TCP/IP服务端口发送探测数据包,并记录目标主机的响应,通过分析响应来判断服务端口是打开还是关闭, 进而得知端口的状态[15]进一步而言,网络扫描就是构造符合某项协议的包,依据目标计算机的返回的数据包的内容,对目标计算机协议对应的服务是否启开及服务版本等各种信息的进行判断的行为。

2.2.6网络扫描编程和网络编程的区别

网络扫描纺程和一般的网络编程的区别是,首先一般的网络编程通常是服务端和客户端一起编写,而网络扫描通常只是编写客户端其目标服务是既有的服务端程序;其次一般的网络编程通常只会使用一种应用层协议,而由于扫描器的目标是这些各不相同的服务,所以就得使用众多不同的应用层协议,在编程上就是你要构造和处理更多不同的数据包,所以一般来说网络扫描编程较一般的络编程要复杂不少。

2.2.7网络扫描器和安全卫士的区别

病毒木马查杀、垃圾数据清理和开机加速是传统安全卫士的三大核心功能,我们注意到的特点是,这些功能的实现主要是读写本地磁盘文件来实现不需要通过网络;去看附加的沙箱,桌面整理也大都如此。而我们反观网络扫描器,从其简单的主机存活扫描、端口开发扫描开始多是要使用协议构造数据包去探测的。当然他们会有交集,由于大面全的发展方向他们的交集会越来越大,当然你要问那按这说法他们最终会合并那会兼并谁觉得这问题和防火墙和入侵检测系谁会兼并谁一样难说,当然也许这也没那么最要,就比如现在的手机基本实现了对MP3、MP4的吞并又正在蚕食照相机市场,我们只知道我们大大方便了其他谁吞并谁哪用管那么多呢,等哪天吞并完了我们再去给个盖棺定论就完了。当然非说看法那还是在普通用户市场上,安全卫士吞并扫描器的可能性大,扫描器可能只会以插件的形势存在字全卫士中,因为比如一个360安全卫士其技术复杂性比一个普通扫描器要难得多,二是安全办公卫士已存在用户市场多年而网络扫描器对很多用户是个新鲜事物。

 

2.3扫描器常用技术介绍

2.3.1网络编程

   对面向联接的即在传输层使用TCP协议的也就是在packet[24]packet[43]TCP协议的格式填充内容的网络编程,其有比较因定的模式,对于服务端一般是sock->bind->listen->accept->receive->send;对于相应的客户端则是sock->connect->send->receive。对于面向无连接的即在传输层使用UDP协议的也就是在UDP对应的数组位置按UDP填充内容的网络编程,服务端一般是sock->bind->receivefrom->sendto;对应的客户端是sock->bind->sendto->receivefrom 。网络程一般使用socket套接字,一般只需要设置IP地址和端口就好了,其他采用默认值。扫描器要模拟各类客户端所以经常用至上述的客户端编程模式,但也有不少扫描功能要从头到尾一一写packet数组,当然是通过关部结构去与数组对应而不是一个字节一个字节地去赋值。

2.3.2特征库

我孙说扫描器通过构造与服务端相应的协议的数据包去与服务端交流,那扫描器是怎么得出对服务端的状态的扫描结论的,这就依赖特征库。特征库是指一种通过捕获网络数据样本,横向比较网络数据包,提取能表征该协议的特征串,并将其按照一定的语法写成的文件。[16]更通俗而言特征库就是你设定的某种状态的充要条件,比如返回的TTL值为255就等价目标系统是UNIX操作系统等等,当然如果你设定的特征库出错,那么你的扫描结果也就可能出错。所以可以说特征库的准确与否是一个扫描器好坏的重要体现。当然还要提醒一句特征库可以以数据库形式保存,而且随着特征库的扩大和可扩展性可维护性要求的提高存放于数据库也是一种趋势,但完全也可以其他形式保存随编程的意愿。

2.3.3多线程技术

就是一个运行起来的软件,进程是计算机资源分配的最小单位;线程就是进程中的进程,线程是计算机资源使用的最小单位;当一个进程不启用多线程时就只存在线程,那么这个主线程就是进程;当启用多线程时所有启的的线程的总和才是这个进程。单线程的缺点是如果主线程正在为一个任务忙碌那么进程就不能进行另外的任务了,比如如果你家如果只有你一个人,如果你你在去买菜那么家里电话响了因没人接了,如果家里多一个人那这问题就解决了多线程正是这个思路多线程常被用来降低程序的运行时间。[17]当然多线程也不是完美无缺在同步和参数传递两方面比线程麻烦。在扫描器上,主机存活扫描和端口扫描等多处使用了多线程技术

2.3.4非顺序扫描

使用从小到大的增序扫描,很容易被防火墙和入侵检测统判断出来而阻止为了可以不修改防火墙或入侵检测系的策略,我们可以设法消除增序的特征。首先的方法是与增序相反的逆序扫描,当然这种改进显然是有限的。第二个方法是随机重排,就是先将要扫描的端口放入数组,然后产生一个随机数来进行交换。这是一种可行的算法。但对多线程扫描而言有一种更为巧妙的处理方法,就是在每个线程创建之后挂起一个随机时间,这样既解决了增序的问题又不用进行重排处理。

2.3.4INI文件和注册表

INI文件是Windows3.x的配置的存储方式,文件内常以不同段名分类配置,段下是配置的键值对。INI文件的的读写主要由GetprivateProfileStringGetprivateProfileIntWritePrivateProfileString三个函数完成。INI文件存在散乱和容易被编缉等弱点,为此微软从Windows95开始引入了注册表这小型数据库,注册表主要通过RegCreateKeyExRegOpenKeyExRegQueryValueExRegSetValueRegDeleteKey等函数进行操作。注册表键对应INI文件的段,子键和值对应INI文件的键值,不过注册表下的子键可以是子键,但就存储方式读写等操作来说都没多大差别。在我们设计的扫描器中为了简便和不会因失误而破坏到注册表我们使用了INI文件的配置方式。

2.3.5CTreeCtrlCListCtrl

CTreeCtrlMFC的树型控件,通过InsertItem函数插入节点。CListCtrlMFC的列表控件,通过InsertColumn函数插入列,通过InsertItem函数插入行。在我们的扫描器中,对于结果需要分类的功能我们使用CTreeCtrl控件,对于同类型而有多项内容的功能我们使用CListCtrl控件进行展示。当然要提醒的是这3个数都是重载的,不只一个样式。

 

 

第三章 扫描器的分析与设计

 

3.1可行性分析

并非任何问题都有简单明显的解决办法,事实上,许多问题不可能在预定的系统规模或时间期限之内解决。如果问题没有可行的解,那么花费在这项工程上的任何时音、人力、软硬件资源和经费,都是无谓的浪费。[18]下面我将从技术、经济和操作三方面对本设计进行可行性分析。

3.1.1技术可行性分析

在前面章节中提到,我们提到本设计的目是设计出一个面向普通用户的扫描器。面向普通用户的扫描器,其要点有二,一是功能要完善,常用的功能也都要有,如果没什么功能这样的设计是没什么意义的;二是要界面要友好,需要手动配置的参数不能过多功能不要隐藏太深,让用户感觉十分复杂。

首先对第一点要求,本设计为扫描器设计了主机扫描等常用的九项功能,应该来说完全能够满足通用户的需求。在技术上X-Scan等扫描器都有实现类似功能所以说明在技术上是没有什么问题的。具体到个人而言,自己较为系统地学习过网络协议同时也有相应的网络编程和网站开发经验,再加上参考资料和老师指导,技术上可以实现。

对于第二点本设计采用了模块化的设计,每一个功能都分为一个模块不相关功能不

来源:weixin_30598225

声明:本站部分文章及图片转载于互联网,内容版权归原作者所有,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2019年3月10日
下一篇 2019年3月10日

相关推荐