基于C#的Windows窗体端口扫描程序分析

时间:2022-06-08 01:34:53

基于C#的Windows窗体端口扫描程序分析

摘要摘要:C#语言一方面继承了C 语言和C++ 语言简洁高效的优点,另一方面吸收了JAVA语言面向对象的设计思想,是目前主流的编程语言之一。C#语言可以高效便捷地开发各种应用程序,微软公司提供了完备的类库以方便程序员开发。在网络开发方面,端口扫描程序是网络软件常用的功能模块。通过分析端口扫描程序中出现的问题,找出问题产生的原因,提出相应解决办法,对采用C#语言开发类似软件有一定的参考作用。

关键词关键词:C#语言;网络软件;端口扫描

DOIDOI:10.11907/rjdk.162211

中图分类号:TP312文献标识码:A文章编号文章编号:16727800(2017)001003803

0引言

C#语言是目前主流的编程语言之一。它采用控件事件来绑定窗体方法,实现了消息的便捷传递,大大简化了窗体程序的编写,使程序员可以专注于业务逻辑开发,不必花费时间在消息路由上。本文采用C#语言实现一个具有WinForm窗体的端口扫描程序,并重点分析可能出现的几个问题,为开发者提供参考。1端口扫描程序原理

端口扫描作为网络安全扫描的核心技术之一,广泛应用于网络扫描器中,如著名的Namp和Nessus。在计算机中,一个端口就是一个潜在的通信通道,对目标计算机进行端口扫描,可使用户了解本机对外界提供了哪些服务,从而为管理网络提供参考。

端口扫描技术原理[1]:向目标计算机的TCP/IP服务算法的基础上加上T-BCJR的复杂度,而高信噪比时,错误帧数量少,此时的复杂度基本接近SOVA算法。总体上,改进译码算法的复杂度与SOVA算法相近。

4结语

连续相位调制是一种先进的调制技术,近年来在通信、遥感等领域得到广泛重视。本文介绍了连续相位调制系统的主要译码算法,并针对算法的局限性在高斯白噪声信道下给出了一种改进的算法。通过仿真验证了该算法的可行性,当误比特率达到104时,改进译码的信噪比只比BCJR算法低0.15dB左右,复杂度也大大降低。

断服务端口是打开还是关闭,得到端口提交的服务和信息。端口扫描的常见种类有TCP SIN扫描、TCP Connect扫描、秘密扫描和其它扫描。扫描分类如图1所示。

本文使用其中的TCP connect 扫描,它是最基本的TCP扫描。操作系统提供connect()系统调用,用来与每个感兴趣的目标计算机端口连接。如果端口处于侦听状态,那么connect()就能成功。否则,这个端口不能用,即没有提供服务。这种技术最大的优点是不需要任何权限,系统中的任何用户都有权使用这个调用;另一个好处就是速度:如果对每个目标端口以线性方式使用单独的connect()调用,会花费相当长的时间,而这里可以同时打开多个套接字,从而加速扫描。

2端口扫描程序设计

本开发除了系统提供的默认命名空间和窗体命名空间外,还要用到和网络开发和线程开发相关的命名空间。主要流程是在扫描窗体界面中设定目标主机IP地址和扫描端口范围[2-3],在主线程中启动多个线程来扫描端口。2.1命名空间和类

涉及的网络相关命名空间包括命名空间,要使用其中的IPAddress类和IPEndPoint类来构建统一、简单的网络编程接口。使用.Sockets命名空间中的Socket类来实现Berkeley套接字。引用System.Threading命名空间,使用其中的Thread类来实现多个线程同时扫描端口以加快扫描速度。2.2端口扫描程序流程

启动多个线程,在线程中开始扫描端口,扫描程序中设定的套接字,以目标主机和端口为端点执行TCP connect方法。执行后,通过判断套接字的Connected属性来确定端口是否开放。主要流程如图2所示。

3端口扫描程序中的问题及分析

对扫描程序进行测试。首先在局域网IP地址为10.110.32.16的主机上开放80端口,然后启动扫描程序,在目标IP中填入10.110.32.16,端口选择79到80端口,点击开始扫描。3.1扫描端口不能显示

尽管已经开放了80端口,可是扫描后并没有发现该端口被写入相应控件,但确实调用了Listbox控件的Items集合属性的add方法并添加了具体的开放端口。经过分析,C#在UI线程创建子线程操作UI控件时,也就是在UI 线程以外的子线程操作UI控件时,系统引发了一个InvalidOperationException异常,因为访问 Windows 窗体控件本质上不是安全线程。如果有两个或多个线程操作某一控件,则可能会迫使该控件进入一种不一致状态,还可能出现其它与线程相关的错误,包括争用和死锁。因此,确保以线程安全方式访问控件非常重要。解决这个问题有3种方法[4-5]:

(1)在窗体Load方法中设置CheckForIllegalCrossThreadCalls为false,不检查交叉线程调用,直接忽视InvalidOperationException异常,此法不推荐使用。

(2)利用委托来实现。在窗体函数中定义委托AppendStringDelegate,同r定义委托方法addString来触发。把原来在线程中的通过控件添加的方法调用,修改为通过addString方法修改控件,以避免线程冲突,关键代码如下:

(3)通过使用 BackgroundWorker 组件实现多线程的交叉引用。BackgroundWorker组件非常适合在后台运行任务前台显示结果的应用场景,而且提供了完善的取消工作、报告进度和异常处理功能,解决了跨线程访问可视化组件问题。辅助线程运行 DoWork 事件处理程序,在扫描按钮点击事件中调用方法RunWorkerAsync完成后台线程异步触发。

本文推荐使用第(2)或第(3)种方法来解决上述问题。3.2扫描端口结果重复显示

采用上述委托处理线程访问UI中控件,发现在Listbox控件中扫描结果出现两次“端口开放80”字样。端口扫描代码在窗体类中定义一个类变量portnow,在扫描程序中通过一个for循环来启动多个线程,执行从开始端口到终止端口的扫描,在循环中将i值赋给portnow。因为portnow是类变量,在线程中根据portnow的值确定扫描端口,代码看似没有问题,但经过跟踪分析,发现线程在执行扫描79端口时,UI主线程继续执行,并不会等待,此时,i值修改为80,又启动下一个线程扫描80端口,而此时扫描79端口的线程也才刚刚为portnow赋值,因此出现了两次都是连接80端口的情况。图3中,通过跟踪线程堆栈发现,在切换扫描79号端口线程时,UI线程继续执行,i值被修改,导致一开始就执行扫描79号端口,portnow值就变成80,造成重复连接80端口问题。为了解决线程调用中portnow和所扫描端口不同步问题,考虑把i值作为一个参数传给线程,更简单的方法是直接把线程命名为i值。同时,在扫描程序中通过下列代码实现portnow同步获取:

4结语

本文通过C#语言端口扫描程序设计与实现,分析了程序中出现的问题,对端口扫描结果不能出现、端口扫描结果重复出现问题进行了分析,提出了相应的解决方法,提示C#编程者进一步了解网络编程中线程使用的注意要点,避免发生线程使用不当导致程序无法正常运行,对类似系统实现提供了有益的参考。

参考文献:

[1]谭逸逸.常见的端口扫描类[EB/OL].http:///content/12/0302/13/3725126_191092221.shtml.

[2]陈青华.C#网络开发项目教程[M] .北京:电子工业出版社, 2012:91113.

[3]马骏.C#网络应用编程[M] 北京:人民邮电出版社, 2014:3848.

[4]卜春芬. C#后台处理与多线程技术的应用[J]. 昆明学院学报, 2010(3):1218.

[5]周广川.多线程应用程序调试技g[J]. 现代计算机:专业版, 2011(3):154156.

[6]孙小平.网络系统安全漏洞扫描浅析[J] .网络安全技术与应用, 2016(2):7880.

上一篇:“有用”和“没用” 下一篇:基于双处理器的四旋翼飞行控制系统研究