□林 梅
( 山西广播电视大学,山西 太原 030027)
计算机技术和网络技术日新月异, 网络已经成为人们生活、工作中不可缺少的一部分,给人们带来了很大的便利,人们可以通过网络获得自己所需要的信息,但网络是一把双刃剑,带来方便的同时也带来了不利的一面,在上课的过程中发现学生上网聊天和玩游戏,严重影响了上课质量。所以需要一款监控学生上网过程的软件。基于局域网技术的远程监控系统凭借其实用的独特优势,受到家庭自动化、办公自动化、远程教学以及生产过程自动化等各个领域的青睐,对其进行研究具有较大意义。
有了局域网监控系统,学校网络管理员只需要打开本地计算机上的监控端程序,就可以知道学生在上课时的情况,有效地约束了学生上课时的行为。监控软件不仅仅可以监控学生的上课情况,也可以适当地运用于学校的网管工作。作为一名网络管理员,经常需要处理一些网络故障,这些故障有些是设备问题、线路问题或者是网通方面的问题,但有些时候是人们使用计算机不当所造成的。遇到过这样的问题,一名老师说自己的计算机突然之间不能上网了,网络管理员刚刚到达这位老师的办公室,发现其他几位同事的计算机也不能上网了,最后找到原因是最初不能上网的那位同事的计算机受到了ARP病毒的攻击,以致影响到同一网段内的计算机。这位老师的计算机感染的ARP病毒是因为其上网炒股。如果能对大家上班过程中使用计算机的过程进行监控,限制一些特殊网站的登录,约束大家的行为,就可以很好地避免受到各种各样病毒的攻击,避免一些网络故障的出现,如果发现问题,也可以及时地采取正确的措施,解决故障,给大家维护一个安全、健康、稳定的上网工作环境。
网络监控的基本要求是实时、快速和高效,这要靠信息传输、监控、管理和一体化的集成。不过这都是在监控实现的前提下,网络监控实现要靠网络技术、控制技术和图像处理技术。下面我们首先看看局域网的特点,局域网是一种覆盖一栋楼或者几栋楼、一个校园或者一个单位等小范围的计算机网络。局域网结构简单、数据传输率高、可行性高、实际投资少且技术更新发展迅速,具有对不同速率的适应能力,低速或高速设备均能接入;拥有较好的兼容性和互操作性,支持同轴电缆、双绞线、光纤等多种传输介质。
我国对于远程监控技术也进行了积极的研究。例如“网路岗”,它是目前国内领先的上网监管软件,只需要通过一台电脑即可监控整个网络内计算机的活动,可以实现邮件监控、聊天监控、下载控制、传输文件监控、屏幕监控、系统信息监控、进程监控、上网流量监控管理、报表统计等多项功能。还有“第三只眼”,也是一个非常优秀的监控软件,可以实现浏览网站监控、邮件监控、聊天监控、屏幕监控、文件拷贝带走报警、资料外泄报警以及软硬件更动报警。
我们已经拥有了这么多优秀的监控软件 ,为什么还要进行研究呢,这些软件功能丰富,对于我们校内的应用来说有点浪费,所以我们需要一款适合网络管理员工作的软件。我们对学生的上课过程进行监控,首先是要获得学生上课时的电脑屏幕,如果发现学生上网或者玩游戏,则能够远程关闭其网页或者游戏界面,这就需要能够控制其鼠标或者键盘,如果无法关闭其界面,在必要的时候能够实现关闭学生计算机,然后重启。通过这些操作督促学生认真上课。与此同时,此软件要具备不被学生发现的功能,不然会影响学生的上课积极性,这就需要系统自动运行与进程隐藏功能。
监控系统要求监控端能有效的监视被控端,并且接口简单,便于操作,能够适应不同的被控端,模块功能清晰明确,系统结构层次化。想要实现以上功能与特性的局域网监控系统,需要研究系统的架构模式、所采用的通讯协议以及编程技术这些问题。首先要研究此系统的整体构架模式,此系统预计采用客户机/服务器(C/S)模式。
C/S模式经过与其它模式的比较和分析,发现此模式有一些比较突出的优点:交互性好;能够提供数据和服务的无缝集成;适应日益扩展的应用需求;非对等相互作用;速度快;良好的开放性和易扩充性;可以利用服务器对局域网的客户机进行全面监控。
开发的过程需要一个功能强大的开发工具,Visual C++无疑是最好的选择,它已经成为专业程序员进行软件开发的首选工具。这是因为它不仅是一个C++编译器,而且是一个基于Windows操作系统的可视化集成开发环境。Visual C++ 6.0是一个全面的应用程序开发环境。自Visual C++1.0出现后,其新版本不断出现,现在使用最多的是Visual C++ 6.0,实现的过程中还需要用到MFC(Microsoft Foundation Classes),它是一个类库,它以C++类的形式封装了 Windows的API(接口函数),并且包含一个应用程序框架,同时也包含很多Windows句柄封装类和大量Windows的内建控件和组件的封装类。这大大减少了开发人员的工作量。
系统中数据的传输运用的传输协议是TCP/IP,TCP/IP协议是一个协议族,这个协议是网络中最基本,也是最主要的协议。TCP/IP 规定了计算机以何种方式连入因特网,以及数据以何种方式在它们之间进行传输。它是分层体系结构。高层为传输控制协议,可以实现聚集信息或把文件拆分成更小的数据包。低层是网际协议,负责处理每个数据包的地址部分,使这些数据包正确地到达目的地。
还有一个关键技术,那就是Winsocket网络编程技术,所谓socket也被称为“套接字”,套接字实现了应用程序向网络发出请求,应答网络请求的功能。套接字有个很大的优点那就是不会因为在服务器端还是在客户端而产生不同级别,对于网络连接来说,套接字是平等的,不管是Socket还是ServerSocket都是通过Socketimpl类及其子类完成的。
目前使用的socket提供三种套接字,最主要的是流式套接字,在数据传输的过程中无差错、无重复地发送。在使用socket的过程中从建立连接到关闭,使用了以下几个函数:
a)创建套接字socket( ),系统向应用程序提供套接字;b)指定本地地址bind( ),将套接字地址与所创建的套接字联系起来;c)建立套接字连接 connect( )与 accept( );d)监听连接listen( );e)数据传输send( )与recv( );f)关闭套接字closesocket( ),释放分配给套接字的资源。
如果想要实现关机与重启操作可以利用socket,当控制端和被控端的socket连接起来后也就形成了一个通信通路,控制端发送一个命令,被控端通过socket的receivetext函数将命令从连接中接收出来放到字符串变量S中,再由S中不同的字符串来判断响应哪个事件,然后通过调用不同的API函数来实现以下控制功能:(1)关机:当被控端接收到S中的字符串为‘closewindow’时,则关机,(2)重启:当客户端接收到S中的字符串为‘reswindows’时,则重启。有了关键技术,那么结构应该怎么安排呢,希望能够考虑到两方面,一方面是减轻被控端的负荷,另一方面是安全。拓扑结构如图1。由图可以看出监控系统有被控端和监控端两部分。模块独立,便于开发,功能易于实现,监控端和被控端任意一台计算机之间的通信相互独立。
图1局域网监控系统结构图
根据我们系统功能的需求分析,设计出各个功能模块,系统整体模块划分图如图2。首先分为服务端设计与客户端设计,然后再对客户端与服务端功能模块进行细化,单独开发每一个模块并分别进行调试,缩短了开发周期。
监控端功能模块包括:界面模块、数据通讯模块、屏幕处理模块。主要监视被控端的屏幕情况,根据屏幕的显示内容进行合理的管理。被控端功能模块包括:抓屏处理模块、服务端锁定模块、鼠标监视、键盘监视、进程隐藏。主要进行远程抓取客户端直接查看屏幕,若发现非法使用,锁定被控端或者远程关闭被控端。
客户端实现的原理是客户端可以通过扫描或者直接输入获得被控端IP地址。这样一来,管理者就可以知道,学生和工作人员正在利用计算机做什么,特殊的情况下可以远程关闭他们的计算机。
为了更真实地符合管理中的实际情况,就需要被控端的屏幕同时显示在监控端,同步显示可以在监控端准确真实地反映出被控端的计算机屏幕。如果想要在监控端显示被控端的屏幕,需要一个显示被控端传回的屏幕图像的子窗口, Createwindow函数可以帮我们实现这个功能。
被控端的设计目标与监控端是相对应的,接收客户端的命令,然后返回处理结果。为了不影响学生上课的积极性,运用windows系统启动时自动运行服务端程序的方法。
自动运行之后,服务端程序运行在被控端的计算机上,需隐藏起来,为了能够实现监控探针所在主机的非法外联行为,在任务管理器不会被用户随意的杀死。为了实现这个功能,需要两个进程。最主要的是守候进程,实现的原理如下:
守候进程是一个系统服务。它有一个特性是系统级的服务在任务管理器里不会被用户随意杀死,并且可以创建一个随系统一起启动的守候进程。仅仅这样是不够的,因为任务管理器中有一项功能是杀死进程组,如果直接在这个进程里启动工作进程,那么通过杀死进程组的功能就可以将两个进程一起杀死,就起不到保护的作用。可以通过System这个接口函数来启动工作进程,这个被函数启动的进程被认为是属于系统的进程,这样一来,二者就不属于同一个进程组,就可以不被杀死进程组。而且作为系统的进程还可以防止被用户直接杀死。
我们还需要看看学生在上课的时候都对键盘进行了哪些操作,这就需要监视键盘。钩子机制是以往的键盘监控程序中普遍的,来捕获系统的击键情况。这里将不使用钩子机制进行键盘记录,因为系统中一旦安装了钩子机制,系统会频繁的使用钩子函数,这样大大降低了系统效率。 因此,采用接口函数GetAsyncKeyState。该函数实质上是直接侦测键盘的硬件中断,这种方法比较高效。进行键盘记录的原理是设置一个TextBox控件,用来缓存数据,还需一个Timer控件。按键记录结果是根据前台窗口的变化而变化的,设置Timer控件的Interval属性为1,每l毫秒接口函数GetAsyncKeyState对键盘进行一次彻底地检查,被按下的键及时的放入缓存中,若被控端改变当前工作窗口,就把缓存中的数据送到监控端。
函数原型如下:SHORT GetAyncKeystate(Int vKey) 。其中参数vKey用来定义虚拟键码。此接口函数实质上是直接侦测键盘的硬件中断,所以它是在整个系统内工作的,也就是无论当前工作前台是什么,不影响记录。这样我们通过GetAsyncKeyState等API函数完成了对全部键盘按键的记录,实现了没有使用钩子的想法。
想要监视鼠标在屏幕上的位置,也就是得到鼠标在X方向和Y方向上的绝对坐标,mouse_event( )函数可以实现。函数monse_event()的原型如下:VOID mouse_event (DWORD dwFlags,DWORD dx,DWORD dy,DWORD dwData,ULONG_PTR dwExtralnfo)。作用分别如下:dwFlags用来定义鼠标的移动和按键标志变量;dx用来定义鼠标沿屏幕X坐标轴的移动情况;dy用来定义鼠标沿屏幕Y坐标轴的移动情况;参数dwData,用来定义鼠标滚轮的运动的数量;参数dwExtralnfo表示应用程序定义的32位信息。
屏幕监控的基本原理是对被控端主机的屏幕进行捕获,经过压缩处理再传递到控制端。其中主要涉及到压缩技术和图像传输技术。屏幕监控的关键在于如何将图像质量和传输效率结合起来,既能在监控端有比较流畅的屏幕监控,又能满足监控环境的网络要求。
参考文献:
[1]任建基.局域网资产管理系统的研究与实现[Z].大连理工大学硕士论文,2005.
[2]翟文学.基于C/S模式的局域网监控系统的设计[J].硅谷,2009,(11).
[3]厉颖.基于企业局域网的计算机管理系统的研究[J].科技风,2009,(8).