论远程控制系统设计与开发主控端模块设计大学本科毕业论文_第1页
论远程控制系统设计与开发主控端模块设计大学本科毕业论文_第2页
论远程控制系统设计与开发主控端模块设计大学本科毕业论文_第3页
论远程控制系统设计与开发主控端模块设计大学本科毕业论文_第4页
论远程控制系统设计与开发主控端模块设计大学本科毕业论文_第5页
已阅读5页,还剩26页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

论远程控制系统设计与开发—主控端模块设计摘要随着现今社会计算机的广泛普及以及网络的快速发展给远程控制系统带来了广阔的用武之地,人们可以通过简单的终端机完全控制网络另一端的被控机,从而完成强大的控制功能,获取被控机的任何信息,这种方式被称之为远程控制。简单远程控制系统由主控端和被控端两部分组成。主控端用于实施各种对联网计算机的监控操作,被控端对于接收到的数据进行分析,解释并执行。系统主要可以实现获取被控端信息、被控端系统控制、消息发送等。本文对远程控制系统原理和主要相关技术作了简单介绍,在进行需求分析之后,详细描述了本系统的被控端的设计与实现,最后表格形式给出测试结果。关键词:远程控制C/S模式套接字信息安全 SimpleRemoteControlSystem——TheDesignofmastercontrolTerminalAbstractWiththewideuseofcomputerandtherapiddevelopmentofnetwork,theremotecontrolsystemisusedfarandwide.Justthroughsimplemanipulateoftheterminal,peoplecancompletelycontrolthecomputerontheotherside,includingobtainthesysteminformationofthecomputer,andimplementpowerfulfunctions.Itisso-calledremotecontrol.Thesimpleremotecontrolsystemconsistsoftwopartsincludingcontrollingterminalandcontrolledterminal.Wecanmonitorthecontrolledterminalandimplementsomeoperationaboutcontrollingthecontrolledterminalonthecontrollingmonitor.Thecontrolledterminalisusedforanalyzing,explainingandimplementthereceiveddata.Thesystemcanimplementthefunctionofgettingtheinformationofcontrolledterminal,controlcontrolledterminal,sendingmessages,andsoon.Thepapersimplyintroducesthetheoryofremotecontrolandthemaintechnology.Aftertheanalysis,itdescribesthedesignandimplementofthecontrolledterminal.Atlast,itshowstheresultinformoffigures.Keywords:RemotecontrolClient/ServermodeSocketInformationsecurity

目录摘要 1Abstract 2目录 31.绪论 51.1课题研究背景 51.2国内外研究现状 51.3课题研究的主要内容和方法 61.4主要工作分配 62简单远程控制系统相关理论 72.1远程控制系统概述 72.2TCP协议 72.3UDP协议 82.4Socket套接字 82.4.1基本套接字函数调用 102.4.2创建套接字 112.4.3指定本机地址 112.4.4建立套接字连接 112.4.5监听连接 122.4.6数据传输 122.4.7关闭套接字 123Windows的消息系统 133.1消息的种类 133.1.1MFC中的消息处理 133.1.2用ClassWizard进行消息处理 133.2客户端/服务器(C/S)模式 144.简单远程控制系统架构 154.1总体目标 154.2受控端需求 154.3性能要求 154.4运行要求 164.5控制端需求 164.5.1图形界面需求 164.5.2数据信息的传输需求 164.6用户系统描述 164.7主控端设计 164.7.1添加主机(建立连接,断开连接) 164.7.2发送消息 174.7.3系统信息的获取及修改 174.7.4简单远程控制的被控端执行CMD命令的实现 174.7.5简单远程控制的被控端进程的浏览和杀死功能的实现 185.基本设计概念和流程 216.1远程控制台 236.2功能模块实现 236.3操作系统类型判断 237.简单远程控制的连接功能实现 247.1端口连接 247.1.1反弹端口实现 247.1.2Server端简化流程 247.2简单远程控制的被控端系统控制的实现 258.测试 278.1测试环境 278.2测试过程以及结果 279.总结与展望 2910.致谢 3011.参考文献 31

1.绪论因特网的出现及其发展推动了科学技术的各个方面,并使之取得了巨大的进步,利用因特网,可以使远程控制技术得到大范围的应用,从而方便人们的生活。1.1课题研究背景随着社会、科技、经济的不断发展,远程控制技术的应用范围也在不断拓展,从最初银行、军事、机要部门等特殊行业领域的应用已经延伸到了今天的电业部门、商业部门、普通工矿企业、道路交通领域、学校教学应用、卫生医疗部门以及宾馆酒店行业等等,其卓越的功能也日益受到各个应用行业的重视和青睐,但是许多远程监控软件都需要配有硬件设备,这不仅使得实际应用的成本升高,而且也使实施应用增加了技术障碍。虽然有诸多问题的存在,但是我们应该认识到远程控制技术的研究,不仅充分利用了现有资源,拓宽了因特网的利用范围,而且也使远程控制能够减少成本扩大远程化距离,实现任意节点的访问机制,并进入一般的应用领域,比如,进入家庭,人们通过因特网控制家用电器,采用因特网作为远程控制平台,是一项很有前途和潜力的技术,另外它可以应用到设备远程诊断、远程监测、遥控等领域。通常企业内部或者IT公司的客户技术支持部门都有技术支持业务其任务是通过电话解答疑难问题,努力减少技术人员到现场服务或让用户把设备送到支持中心进行维护。这种技术支持方式尽管被普遍采用,但效率不高而且大大增加了技术支持成本。远程控制软件能使技术人员直接操作远程计算机,就像操作本地机器一样,无需用户介入,技术人员既能得到该机器的一手资料,从而加快了问题的解决。实际上,使用远程控制工具的技术人员能够做到解答疑难问题,安装和配置软件,把软件下载到用户计算机上,配置应用程序和系统软件设置并可通过实际操作培训用户。1.2国内外研究现状目前,基于因特网的远程控制国内外都有不同程度的研究。相对来说,由于西方国家在信息技术和计算机控制技术的发展上的优势,他们在研究远程控制方面相对早些,而且有些公司有相关的初级产品问世。国内由于因特网的飞速发展,近几年也开始积极的研究。国内外在基于因特网的远程机器人控制方面的研究相对其他领域要多一些。例如美国伯克立大学研制的是一个通过因特网远程控制的种植花草工业机器人手臂。拥护通过机器人手臂上的摄像机所传输的图像,对这个花园内进行简单的操作。这些基于因特网的远程控制系统普遍采用了客户/服务器网络模型,现场采用摄像机来监视,并通过网络发出指令。当前,由于网络基础设施还不够完善,所以监视图像由于数据量大,其传输时间过长。即使是采用了数据压缩技术,也仍然有很大的数据量需要传输,因而由此产生的远程控制时间延迟也必然很大。此外,这类系统普遍采用瘦客户/肥服务器的网络模型,监控端的控制操作功能过于简单,都只是发一些简单的指令,而不能实现一些复杂的必要的逻辑处理功能。第三,这类系统在处理上由于时间延迟影响现场控制系统不稳定时,仍然采用的执行-等待-执行-等待的单步执行流程,生产设备运行效率相当低下,第四,大量的采用以图像监视为主的方式,虽然可以使得监控人员更能直观的感受到现场情况,便与监控人员的控制;但是我们应该注意到,有些设备的被监控状态是难以用图像方式表示出来的,比如温度、速度、压力这类精确的数值量;此外有些采用图像传输的数据量也可以采用通过数据传输关键数据以在监控端进行实况模拟图,这样就会减少数据量,而使数据传输速度大大提高。1.3课题研究的主要内容和方法本课题的研究主要内容主要包括以下几个方面:1.简单远程控制系统相关理论研究2.简单远程控制系统总体结构3.简单远程控制系统的功能模块的设计4.简单远程控制系统功能模块的编程实现本软件用C++语言编写,采用的是C/S结构,一个客户端,一个服务器端。客户端是控制端,服务器端是被控制端。主要功能就是通过本地计算机,控制远程的另一台计算机的键盘。主要思路是先用Winsocket建立两边的连接,客户端向服务端发送键码,服务器端得到键码后模拟出按键事件。1.4主要工作分配该系统软件是本人与肖星辰同学共同研究开发的,肖星辰同学主要负责被控端的设计与开发,本人主要负责主控端和部分被控端(获取被控端信息)的设计与开发。本人在系统开发中的具体工作:1.搜寻与系统开发相关的资料,熟悉C++开发语言。2.完成主控端与被控端的连接。3.完成主控端模块的程序代码。4.与肖星辰同学一起对系统进行调试和测试。5.归并相关系统开发文档,完成毕业论文的撰写。2简单远程控制系统相关理论2.1远程控制系统概述远程控制软件实际上是一种客户机/服务器程序,服务器程序安装在被控制的计算机端,客户机安装在控制端。在客户端和服务器端都安装成功之后,客户端在网络上搜寻已经安装了服务器的远程计算机;然后,客户端就发指令获得服务器端的连接指令,两台PC建立起连接,就可以通过网络的互连协议TCP/IP协议进行远端控制。2.2TCP协议TCP是面向连接的通信协议,通过三次握手建立连接,通讯完成时要拆除连接,由于TCP是面向连接的所以只能用于端到端的通讯。TCP提供的是一种可靠的数据流服务,采用“带重传的肯定确认”技术来实现传输的可靠性。TCP还采用一种称为“滑动窗口”的方式进行流量控制,所谓窗口实际表示接收能力,用以限制发送方的发送速度。如果IP数据包中有已经封好的TCP数据包,那么IP将把它们向‘上’传送到TCP层。TCP将包排序并进行错误检查,同时实现虚电路间的连接。TCP数据包中包括序号和确认,所以未按照顺序收到的包可以被排序,而损坏的包可以被重传。TCP将它的信息送到更高层的应用程序,例如Telnet的服务程序和客户程序。应用程序轮流将信息送回TCP层,TCP层便将它们向下传送到IP层,设备驱动程序和物理介质,最后到接收方。面向连接的服务(例如Telnet、FTP、rlogin、XWindows和SMTP)需要高度的可靠性,所以它们使用了TCP。DNS在某些情况下使用TCP(发送和接收域名数据库),但使用UDP传送有关单个主机的信息。TCP基础:数据传输协议允许创建和维护与远程计算机的连接。连接两台计算机就可彼此进行数据传输。如果创建客户应用程序,就必须知道服务器计算机名或者IP地址(远程主机)属性,还要知道进行“侦听”的端口(远程端口)属性,然后调用Connect方法。如果创建服务器应用程序,就应设置一个收听端口(本地端口)属性并调用Listen方法。当客户计算机需要连接时就会发生ConnectionRequest事件。为了完成连接,可调用ConnectionRequest事件内的Accept方法。建立连接后,任何一方计算机都可以收发数据。为了发送数据,可调用SendData方法。当接收数据时会发生DataArrival事件。调用DataArrival事件内的GetData方法就可获取数据。2.3UDP协议UDP是面向无连接的通讯协议,UDP数据包括目的端口号和源端口号信息,由于通讯不需要连接,所以可以实现广播发送。UDP通讯时不需要接收方确认,属于不可靠的传输,可能会出丢包现象,实际应用中要求程序员编程验证。UDP与TCP位于同一层,但它不管数据包的顺序、错误或重发。因此,UDP不被应用于那些使用虚电路的面向连接的服务,UDP主要用于那些面向查询应答的服务,例如NFS。相对于FTP或Telnet,这些服务需要交换的信息量较小。使用UDP的服务包括NTP(网络时间协议)和DNS(DNS也使用TCP)。欺骗UDP包比欺骗TCP包更容易,因为UDP没有建立初始化连接(也可以称为握手)(因为在两个系统间没有虚电路),也就是说,与UDP相关的服务面临着更大的危险。UDP基础:用户数据文报协议(UDP)是一个无连接协议。跟TCP的操作不同,计算机并不建立连接。另外UDP应用程序可以是客户机,也可以是服务器。为了传输数据,首先要设置客户计算机的LocalPort属性。然后,服务器计算机只需将RemoteHost设置为客户计算机的Internet地址,并将RemotePort属性设置为跟客户计算机的LocalPort属性相同的端口,并调用SendData方法来着手发送信息。于是,客户计算机使用DataArrival事件内的GetData方法来获取已发送的信息。2.4Socket套接字在远程控制软件中,对于主控机和受控机进行的数据通信所使用的主要技术就是网络编程技术和系统编程技术。随着计算机网络技术的发展TCP/IP协议,被集成到操作系统内核中时,相当于在操作系统中引入了一种新型的输入/输出操作,操作系统拥护进程与网络的交互作用比用户进程与传统的输入/输出设备互相作用复杂的多。首先,进行网络操作的两个进程不在同机器上,如何建立它们之间的联系?其次,有很多种网络协议,如何建立一种通用机制以支持多种协议?这些都是网络应用变成所要解决的问题。20世纪80年代初,美国政府的高级研究工程机构ARPA给加利福尼亚大学BERKELEY分校提供了奖金,让他们在UNIX操作系统下实现TCP/IP协议。在这个项目中,研究人员为TCP/IP网络通信开发了一个应用程序接口API。这个API就称为SOCKET(套接字)接口,今天SOCKET接口是TCP/IP网络最为通用的API,也是在INTERNET上进行应用开发最为通用的API。实际上,Socket在计算机中提供了一个通信端口(套接口)。通过这个端口,一台计算机可以与任何一台具有Socket接口的计算机通信。通信的借口是套接口,一个套接口是通信的一端,在这一端上可以找到与其对应的一个名字。一个正在被使用的套接口都有他的类型和与其相关的进程,套接口存在于通信域中。一个套接口通常和同一个域中的套接口交换数据(数据交换也可以穿越域的界限,但这时一定要执行某种解释程序。)应用程序在网络上传输,接受的信息都是通过这个套接口来实现。在应用开发中就像使用文件句柄一样,可以对Socket句柄进行读写操作。开始使用套接字编程之前,首先必须建立这些概念:网间进程通讯,服务方式,客户机/服务器模式。进程通信的概念最初来源与单机系统。由于每个进程都在自己的地址范围内运行,为保证量相互通信的进程之间既互不干涉又能协调一致工作,操作系统为进程通信提供了相应设施,如UNIXBSD中的管道(Pipe)、命名管道(NamedPipe)和软中断信号(Signal)、UNIXSystemV的消息(Message)、共享存储区(SharedMemory)和信号量(Semaphore)等,但都仅限于用在本机进程之间的通信。网间进程通信要解决的是不同计算机进程间的相互通信问题(可把同机进程通信看成是其中的一个特例)。为此,首先要解决的是网间进程标识问题,同一计算机上,不同进程可以用进程号(ProcessID)作为唯一标识,但在网络环境下,各个计算机独立分配的进程号不能唯一的标识该进程。例如,计算机甲赋予某进程号48,在乙计算机中也可以存在48号进程,因此,“48号进程”这句话就没有意义了。其次,操作系统支持的网络协议众多,不同的协议的工作方式不同,地址格式也不一样,因此,网间进程通信还要解决多重协议的识别问题。在网络分层结构中,各层之间是严格单向依赖的,各个层次的分工和协作集中体现在相邻层之间的界面上。“服务”是描述相邻层之间关系的抽象概念,即网络中各层向紧邻上层提供的一组操作。下层是服务提供者,上层是请求服务的用户。服务的表现形式是原语(Primitive),如系统调用或库函数等。系统调用是操作系统内核向网络应用程序或高层协议提供的服务原语。在国际标准化组织(ISO)的术语中,网络层及其以下各层又称为通信子网,只是提供点到点的通信,没有程序或进程的概念。而传输层实现的是“端到端”通信,引进网间进程通信概念,同时也要解决差错控制、流量控制、数据排序(报文排序)及连接管理等问题。为此提供不同的服务方式:面向连接(虚电路)的服务或无连接的服务。面向连接服务是电话系统服务模式的抽象,即每一次完整的数据传输都要经过建立连接,使用连接及终止连接的过程。在数据传输过程中,各数据分组不携带目的地址,而使用连接号(ConnectID)。本质上,连接是一个管道,收发数据不但顺序一致,而且内容相同。其中TCP协议就提供面向连接的虚电路。无连接的服务是邮政系统服务的抽象,每个分组都携带完整的目的地址,各分组在系统中独立传送。无连接服务不能保证分组的先后顺序,不进行分组出错的恢复与重传,不保证传输的可靠性。提供无连接的数据报服务的常用协议是UDP协议。在TCP/IP网络应用中,通信的两个进程间相互作用的主要模式就是客户机/服务器模式(Client/Server)。即客户向服务发出服务请求,服务接收到请求后,提供相应的服务。客户机/服务器模式的建立基于以下两点:首先,建立网络的起因是网络中软硬件资源、运算能力和信息不均等,需要共享,从而造就拥有众多资源的主机提供服务,资源较少的客户请求服务这一非对等作用;其次,网间进程通信完全是异步的,相互通信的进程间既不存在父子关系,又不共享内存缓冲区,因此需要一种机制为希望通信的进程间建立联系,为两者的数据交换提供同步,这就是基于客户机/服务器式的TCP/IP。2.4.1基本套接字函数调用大多数的数据报套接字应用程序都使用一个规定的事件序列来完成客户应用程序与服务器应用程序间的通信,如图2-1所示:ClientServer

socket()socket()bind()sendto()recvfrom()recvfrom()sendto()..Closesocket();Closessocket();图2-1首先,客户端和服务器端都要创建一个数据报套接字。接着,服务器调用bind()函数给套接字分配工人的端口(在开发应用程序时,这个公认的端口通常时指定的。例如本程序的端口就指定为80)。这样,客户端和服务器端就使用同一个端口来表示服务器套接字。一旦服务器将公认的端口分配给了套接字,客户端和服务器端都能使用sendto()和recvfrom()来发送和接收数据报直到完成传输。然后调用closesocket()来关闭套接字。下面具体看从给定套接字的一个地址开始的每一步工作时怎样进行的。

2.4.2创建套接字系统调用socket()函数向应用程序提供套接字手段时的声明如下:SOCKETPASCALFARsocket(intaf,inttype,intprotocol);该函数有三个参数,其中参数af指定通信发生的区域,在DOS,Windows系统中支持AF_INET,它时网际网区域。参数type描述要建立套接字的类型。也就是指是流式套接字还是数据报套接字。参数protocol说明该套接字使用的协议,如果该参数为0,则表示使用默认的连接模式。Socket()函数根据这三个参数建立一个套接字,并将相应的资源分配给它,同时返回一个整形套接字句柄。2.4.3指定本机地址当一个套接字用socket()创建以后,bind()将套接字地址(主机地址和端口)与所创建的套接字编号联系起来,即将名字赋予套接字。bind()声明如下:intPASCALFARbind(SOCKETs,conststructsockaddrFAR*name,intnamelen);bind()函数共有三个参数,其中参数s是由socket()函数调用返回的并且未连接的套接字句柄。参数name是赋给套接字s的本地地址。参数namelen指参数name的长度,调用成功,返回0;否则返回SOCKET_ERROR。2.4.4建立套接字连接建立套接字是要用connect()与accept()。connect()函数的原型声明如下:intPASCALFARconnect(SOCKETs,conststructsockaddrFAR*name,intnamelen);Connect()共有三个参数,其中s指要建立连接的本届套接字句柄。参数name指对方套接字地址结构的指针,对方套接字地址长度由参数namelen说明。如果调有成功,返回0;否则返回SOCKET_ERROR。Accept()函数原型声明如下:SOCKETPASCALFARaccept(SOCKETs,structsockaddrFAR*addr,intFAR*addrlen);该函数也由三个参数,其中参数s为本地套接字句柄,在做accept函数调用的参数前要先调用listen(),参数addr是指向客户方套接字地址结构的指针,用来接收连接实体的地址。addr的确切格式由套接字创建时建立的地址簇决定。参数addrlen为客户方套接字地址的长度。如果调用成功,accept()函数返回一个SOCKET类型的值。否则返回INVALID_SOCKET。Socket(),bind(),connect(),accept()这四个套接字系统调用可以晚上一个完全的通信建立,包括协议,本地主机地址和端口,目的地址和端口。socket()指定协议元,他的用法与是否为客户机和服务器,是否面向连接无关,bind()指定本机地址和端口号,时面向连接的。在服务器方必须调用bind()函数;2.4.5监听连接建立连接以后,服务器端要调用listen()函数,表明愿意接收连接,listen()要在accept()之前调用,原函数声明如下:intPASCALFARlisten(SOCKETs,intbacklog);该函数有两个参数,参数s标志一个本地已建立单尚未连接的套接字句柄,服务器愿意从它上面接收请求。参数backlog表示请求连接队列的最大长度,用于限制排队的请求个数,目前最大值为5。如果调用成功,listen()函数返回0;否则返回SOCKET_ERROR。2.4.6数据传输当连接建立以后,就可以传输数据了,通常调用send()和recv()函数。send()函数原型声明如下:intPASCALFARsend(SOCKETs,constcharFAR*buf,intlen,intflags);共有四个参数,其中s为已经连接的本地套接字句柄。buf指向存有发送数据的缓冲区指针,长度有len指定。flags智利队传输控制方式,如是否发送带外数据等。如果调用成功,返回总发送的字节数;否则,返回SOCKET_ERROR。Recv()函数调用用于在参数s指定的已经连接的数据报或流套接字上接收输入数据,原型声明如下:IntPASCALFARrecv(SOCKETs,charFAR*buf,intlen,intflags);参数的意义同send();2.4.7关闭套接字closesocket()关闭套接字s并释放分配给该套接字的资源,cosesocket()函数原型声明如下:BOOLPASCALFARclosesocket(SOCKETs);该函数只有一个参数s,指待关闭的套接字句柄。如果调用成功,返回0,否则返回SOCKET_ERROR。3Windows的消息系统Windows程序时基于一种事件驱动的编程模式,这就意味着应用程序所要做的大部分工作时随着Windows消息的变化而进行的。在本程序的实现过程中,涉及大量的系统消息处理和自定义消息的处理。因此,用到如何使用处理C++类的消息。3.1消息的种类应用程序所要做的每项工作几乎都是基于处理Windows消息的,这些消息以三种基本形式出现:常用的Windows、控件通知和命令。Windows消息的ID通常加上前缀WM_,例如WM_QUIT。这些前缀为WM_的消息代表发生在应用程序中的窗口和视图处理消息(MFC为这些消息中的绝大部分提供了默认的操作)。控件消息是由子窗口传向主窗口的WM_COMMAND消息。例如,只要编辑控件的当前内容被改变,它就会传递一个EN_CHANGE消息到主窗口(通常是对话框)。Windows消息控件通知通常由窗口对象来处理,即由类CWnd所派生的对象处理。命令是由菜单、按钮(包括工具条)和快捷键传递来的WM_COMMAND消息。很多类可以处理命令消息,其中包括文档、文档模板、窗口、视图和应用程序及本身。3.1.1MFC中的消息处理MFC为窗口下的消息处理提供了一种框架,使其使用起来比传统的Windows程序下做控件的消息处理的switch…case语句和if…else语句更为简单。MFC用用户类的消息映射来决定怎样处理已经给定的消息。使我们能最大限度的利用C++语言的优点将我们的类进行功能性封装,这样,由这些类所创建的其他类就不用再次重复操作。MFC为了进一步扩展重复使用性,它为大多数Windows应用程序,甚至范围更广的命令提供了默认操作。其他的标准命令也有同样的命名规则,这个规则就是ID_+菜单名+命令名。如果想执行这些标准操作之一,可以从应用程序中的任何一处发送一则预定义号的命令消息,这一消息就能被MFC进行默认处理。当然,也可以对这些命令实现自己的处理。3.1.2用ClassWizard进行消息处理对于绝大多数的消息处理任务来说,ClassWizard能提供极大的帮助。ClassWizard通过使用其中的消息映射项,能将消息映射成各种类所对应的处理程序。1)实现处理函数当用ClassWizard增加处理函数时,就会在创建处理函数的同时,提供恰当的参数和返回类型。如果创建自己的消息映射入口,并自行匹配处理函数,应注意按消息映射入口所希望的方式来说明处理函数和返回类型。2)自定义消息的处理由于Windows是事件驱动的环境,用户常常需要增加一些自定义的消息。ClassWizard不允许增加用户自定义消息,所有必须手工输入。当开发Windows应用程序时,Microsoft推荐用户自定义消息至少WM_USER+100;第二,实现消息处理函数。该函数使用WPARAM和LPARAM参数并返回LRESULT第三,在类头文件的AFX_MEG块中说明消息处理函数。最后,在用户类的消息映射块中,使用ON_MESSAGE宏指令将消息映射到消息处理函数中。3.2客户端/服务器(C/S)模式在TCP/IP网络应用中,通信的两个进程间相互作用的主要模式是客户机/服务器模式(Client/Server)。即客户向服务器发出服务请求,服务器接受到请求后,提供相应的服务。客户机/服务器模式的建立基于一下两点:首先,建立网络的起因是网络中软硬件资源,运算能力和信息不均等,需要共享,从而造就拥有众多资源的主机提供服务,资源较少的客户请求服务这一非对等作用;其次,网间进程通信完全是异步的,相互通信的进程见既不存在父子关系,又不共享内存缓冲区,因此需要一种机制为希望通信的进程间建立联系,为两者的数据交换提供同步,这就是基于客户机/服务器模式的TCP/IP。

4.简单远程控制系统架构4.1总体目标本项目的总体需求为开发出一套远程控制软件,包括受控端程序和控制端程序。其中受控端程序需具有较多的高级特性,包括高荫蔽性、保密性和许多的特殊功能性。4.2受控端需求对特定的个人主机进行远程控制,包括获取一些特定的文件信息和对其进行远程操作等,同时要求有较高的荫蔽性、保密性和稳定性。受控端的隐蔽性需求·在系统的进程显示中隐藏·不另开任何端口·不被防病毒软件查杀·不给主机带来异常,尽量不明显加大网络流量。与控制端的需求·突破防火墙的限制·保证数据传输的稳定性和可靠性·在对方使用代理的情况下也可以完成数据传输控制功能的需求·获取文件控制权(文件上传、下载、修改、删除)·获取系统信息(系统硬件信息、安装软件信息、网络信息)·进程管理·注册表管理受控端程序自启动的需求要求受控端经过一次植入后能在开机后实现自行启动运行,无需再次远程植入,启动后自动通知控制端并得到连接所需的参数。4.3性能要求主控端界面应当简单、友好、方便使用和操作;被控端是用作运行在被控计算机内的可执行文件,为提高执行速度,从客户端发送到服务端的信息应尽量的少。主控端与被控端之间通过使用TCP协议建立连接,以实现对被控计算机的控制。4.4运行要求设计出的简单远程控制软件应当在现在使用的大量操作系统上都能运行。例如:Windows2000、WindowsXP、Windows2003;能在较低的硬件配置上运行,如128M的内存,AMD1800+的处理器。4.5控制端需求4.5.1图形界面需求控制端程序与受控端程序不同,它需要有一个图形化的显示界面,这样就能够提供给用户一个直接、易用的平台进行操作。4.5.2数据信息的传输需求与受控端程序进行稳定、可靠的数据传输通信联系,包括发送控制指令,接受所需要的重要文件和数据信息等。4.6用户系统描述首先设置主控计算机为主控端,主控端显示为监听状态,主控端通过输入被控计算机的IP地址连接到被控端。被控端连接成功后,主控端显示为连接状态,主控端便可以对被控计算机实现各种操作。每次操作成功后都会在主控端计算机上显示相应的提示信息。4.7主控端设计相对服务器端(受控端)的设计,客户端较为简单。客户端设计是,选用了MFCApWizard(EXE),的基本对话框。在窗口上添加一些控件。修改相应的编辑框属性。添加相应的成员变量。本软件设置了一个信息显示窗口,用来接收服务器端发回来的反馈消息。4.7.1添加主机(建立连接,断开连接)在本软件设计初期,我用的是通过指定要连接的计算机的IP地址进行远程的控制连接,在通过远程网络控制通信时,就先指定要登录的计算机的IP,有针对性的连接,这样安全性也好一点。因此在图4.7中的主控端的信息栏里就有了IP地址的输入栏。要登录时。在IP地址栏填入被控端的IP地址(初始化设置为),端口号(本程序的端口设置为80)。4.7.2发送消息定义两个字符串变量:m_csSend和m_csRead来实现客户端和服务器端的消息互连。并且利用Send()函数来实现数据传输。返回的结果在信息显示窗口显示出来。而且,在服务器端,利用了数组类自带的.mid()函数,提取主要的命令来实现对命令的筛选控制,更有利于服务器对客户端发送的命令的执行。具体详细实现方法可以参阅附录的源代码。4.7.3系统信息的获取及修改在一般的远程控制软件中,控制端用户可以通过软件获得被控制端的计算机的一些基本信息,例如内存信息和操作系统信息等;也可以修改被控制端计算机的系统配置,获得系统信息通过系统API来实现,修改系统配置有两种方式,一种是直接修改系统配置文件,包括win.ini,system.ini,system.sys和autoexec.bat等文件;另一种方式就是修改系统的注册表。由于时间关系,本软件也并非黑客软件,本软件在修改系统配置的时候,只是单纯查看和配置系统文件,和手工修改文本来实现这个功能,而且,出于安全考虑,并不想通过修改被控端的系统配置而是被控端系统崩溃等。本程序只设置了两个保存系统信息的文件,1是autoexec.bat,2是config.sys这两个。DOS在启动会自动运行autoexec.bat这条文件,一般我们在里面装载每次必用的程序,如:path(设置路径)、mouse(鼠标启动)、doskey(键盘管理)、set(设置环境变量)等。这些都是系统信息存储的重要信息,一般不要改动。CONFIG..SYS也是DOS系统中的一个重要文件,它的配置直接影响到系统的使用及其效率。如果配置不当的话,可能很多程序都无法正常运行。具体详细命令就不介绍了。所以,最好不要乱配置系统信息,会很容易导致受控端的系统崩溃。确实需要要改动时,可以用直接控屏来做相应改动。4.7.4此模块主要实现对被控计算机的机器系统的控制,包括对被控计算机实施关闭计算机、重新启动被控端计算机以及注销被控端计算机目前使用的用户功能。并且可以通过cmd命令打开和关闭windows程序。做到使主控端用户在主控计算机上就能很容易的控制被控计算机的系统。服务器如果收到“P”,则调用ShellExecute(NULL,NULL,"cmd.exe",cmd,

NULL,SW_HIDE);//SW_HIDE=0;{隐藏}打开cmd命令框,并将所发信息作为cmd命令参数进行操作,并且cmd窗口是隐藏的,不易被发现。4.7.5此模块主要实现主控计算机对被控计算机的所有进程进行浏览和对一些进程进行杀死操作。有了此功能模块的建立,主控端用户可以在本机更清楚的了解被控计算机的系统运行详细信息。得到进程信息:客户端要首先创建套接字sockClient,用于向服务器发送请求信息,连接成功后,发送“P”到对方,表示要得到进程信息,然后等待被控端传送进程信息:服务器如果收到“P”则调用LookPrc函数,在LookPrc函数中开启_LookPrc线程进行获取本机进程的基本文本信息,将其发送给主控端。用CreateToolhelp32Snapshot函数得到进程信息,HANDLESnapShot=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0)。然后调用Process32First函数获取系统中第一个进程的信息,然后进行循环监听,调用Process32Next函数获得下一个进程信息。加载函数SHGetFileInfo获取进程文件信息,之后发送“P”到主控端,表示传送进程信息。操作结果如图4-1进程信息:图图4-1被控端进程信息杀死被控端进程:在确定要杀死进程后,被控端开始进程_KissPrc,用Process32First函数获取系统中第一个进程的信息,结束进程用到TerminateProcess;然后重新扫描系统进程,向客户端发送当前的进程信息。比如上图选定notepad.exe进程杀死后如图4-2和图4-3。图图4-2提示框进程已经被杀死图图4-3被控端进程信息客户端和服务器端交互方式的实现如图4-4所示:(已经建立连接)Client(控制端)Server(被控端)等待命令创建屏幕控制窗口等待命令创建屏幕控制窗口发送控屏命令响应命令,初始化套接字初始化套接字响应命令,初始化套接字初始化套接字发送连接请求建立连接响应请求,建立连接建立连接响应请求,建立连接接收数据主窗口消息处理接收数据主窗口消息处理发获取本机数据(获取本机数据(鼠标响应等)数据桌面事件处理鼠标事件处理关闭窗桌面事件处理鼠标事件处理关闭窗口响应鼠标事件响应鼠标事件发送桌面信息得到发送来的桌面位图,并窗口显示得到发送来的桌面位图,并窗口显示发送鼠标信息图4-4

5.基本设计概念和流程远程控制软件分为受控端和控制端两部分程序。受控端程序的设计要体现非常高的隐蔽性和保密性需求,同时还要满足许多的高级控制功能需求,它的基本设计概念如下:1)程序执行时先自行释放出一个动态链接库文件(DLL文件)至系统目录(%SYSTEMROOT%)中。2)改写注册表某键值,能让此DLL文件在系统下次启动时,自行加载执行。3)判断操作系统类型,是Win2K/WinXP系列还是Win9X系列。4)根据操作系统的类型,采用不同的方式将释放出来的DLL文件嵌入Explorer.exe执行,即让Explorer.exe去加载此DLL文件,执行DLL入口点函数。5)此时DLL入口点函数执行以下任务:判断本进程是否为WEB浏览器进程,如不是则定期循环察看(或截获系统信息看有否新窗口打开,然后判断是否WEB浏览器进程)系统是否打开了WEB浏览器进程(IE及Netscape以及其他浏览器都需考虑),如有打开,则让此WEB浏览器进程也加载此DLL文件。6)此时DLL入口点函数执行以下任务:判断本进程是否WEB浏览器进程,如是则打开一个Socket,从事先约定好的服务器地址获取一个文本文件,从中解密出控制端的真实IP地址。7)根据获取的IP地址,从受控端的系统主动向其80端口发起TCP连接。8)连接成功后,向控制端发送(POST)一段字符串(事先配置在受控端程序中)来验明身份。9)验证成功后,可由控制端在此TCP连接上发送控制指令,受控端在远程执行系统操作,然后返回结果给控制端。(控制指令及返回结果都需加密)10)若在TCP连接还未断开或者数据传送过程之中,WEB浏览器进程中止运行,此时DLL入口点函数应执行相应的卸载操作(如保存当前传输文件名及当前文件指针位置等)则应由第一次加载此DLL文件的进程(Explorer.exe或其他)负责定期循环查看,并在WEB浏览器再此运行的时候,让其加载此DLL文件,直至系统关闭,结束运行。而控制端程序的设计则应体现控制的方便性和可配置性,它的基本设计概念如下:1)程序初次执行时,对受控端程序进行手动配置,如用户跳过则采用默认配置,配置结果为生成满足特定环境和需要的受控端程序。手动配置的内容包括:.存放控制端IP的服务器地址;.认证字符串,即由受控端向控制端发送的字符串来表明自己的身份:·加密字符串,即对传输数据进行加解密的密钥。·激活条件:包括多少天之后激活或者运行多少次后激活此外应能随时手动配置控制端程序,将其作为菜单的一个选项。2)程序主界面分为连接管理、文件管理和高级控制管理等几个单独的页面,注册表管理以及进程管理等浏览特性较强的功能则需根据开发的进展决定是否单独显示出来。3)连接管理页面包括连接主机列表和当前被控主机管理表,然后开发或使用现成的WEB服务器控件,对受控端主动向其发起的连接进行管理。管理的内容包括:·如TCP连接成功,且马上收到(Receive)事先配置好的认证字符串,则将其添加至连接主机列表中,连接主机列表需显示的属性包括受控端的IP地址、主机名、连接时间等;·可以手动从连接主机列表中选择一个添加至当前被控主机管理表中,以后就向所添加的当前被控主机发出控制指令和接受返回数据。4)文件管理页面需单独开发一个模块,来完成类似于Windows的资源管理器的界面。此模块大致需支持以下一些功能:·目录、文件的浏览显示;文件的复制、粘贴(上传)、剪切;·同时选择多个文件(支持Ctrl和shift键的多重选定).5)高级控制管理页面包括一个控制功能列表和一个结果显示部分。控制功能列表涵盖了所有的高级控制功能;结果显示部分则包括对所有返回数据的处理和显示工作,根据选择不同的控制功能来显示不同的控制按钮和结果显示框架(文本框、图形框还是列表等)。6)按下某控制按钮则发送相应的控制指令给受控端(加密后才发送),然后等待返回的数据,并根据特定的格式解析之后显示出来。控制端程序关闭时先自动断开所有与受控端的连接,平时运行时也能手动选择来关闭与某个受控端的连接。

6.采用的若干关键技术6.1远程控制台进程通信管道技术,它是一种简单的进程间通信(IPC)机制。在WINDOWSNT,2000,XP下都可以使用。管道分有名和匿名两种,命名管道可以在同一台机器的不同进程间以及不同机器上的不同进程之间进行双向通信名规范。匿名管道只是在父子进程之间或者一个进程的两个子进程之间进行通信。他是单向的。匿名管道其实是通过用给了一个指定名字的有名管道来实现的。管道的最大好处在于:它可以像对普通文件一样进行操作。它的操作标示符是HANDLE,也就是说,它可以使用READFILE,WRITEFILE函数来进行与底层实现无关的读写操作。用户根本就不必了解网络间/进程间通信的具体细节。我们建立了两个匿名管道,再创建子进程。建立时要区分WINDOWS9X系统和WINDOWSNT/XP系统两种情况。如何区分呢?有两种办法,第一是用WINDOWS的API:HRESULTGetVersionEx(ULONGFAR*pulVersionULONGulFlags);TheGetVersionExmethodretrievestheversionnumberoftheMicrosoftExchangeClient.还有一种办法是在找KERNEL32.DLL模块首地址的时候确定,如果首地址是OBFF7000,那么一定是WIN9X/ME系统,NT系统的首地址是不确定的。如果是WIN9X系统,则创建COMMAND.COM进程;如果是NT系统,则创建CMD进程。被控端就可以在所有WINDOWS系统下正确的运行了。6.2功能模块实现根据需求分析和总体设计,我们明确了功能要求,再将这些功能模块分工到人,共同开发完成。作者是此项目组的负责人之一。以下是一些重要的功能模块及其实现方法概述。6.3操作系统类型判断判断操作系统类型是WinNT/2K/XP类还是Win9X类,只需判断出系统为这两大类中的哪一种即可。7.简单远程控制的连接功能实现7.1端口连接7.1.1反弹端口实现这里采用HTTP协议进行连接配置好的服务器,构造请求数据,得到目的主机IP地址,每分钟更新一次。这样做的好处在于我们通过修改服务器的文档资料随时更新木马连接IP地址。7.1.2Server端简化流程1.得到在程序空间中虚拟重定位地址,保存在EBX寄存器中。2.保存宿主程序开始地址。3.通过函数GETAPIS,得到API地址。4.打开感染线程,进行定时感染硬盘中或网络邻居中的PE格式文件5.打开木马服务端线程,打开机器后门6.返回原宿主程序继续执行根据获取的控制端IP地址,向其80端口主动发起TCP连接,连接成功之后紧接发送事先约定好的认证字符串来完成认证过程。该模块采用Windows套接字网络编程接口(WinsockAPI),选择流式套接字(Sock_STREAM),建立客户机/服务器(Client/Server)方式的通信模型。·套接字(Socket)通信套接字提供了一种发送和接收数据的机制,在Win32平台上,对于众多的基层网络协议,Winsock是访问它们的首选接口,WinsockAPI是建立在套接字基础之上的一组编程接口。·数据传输套接字基本上分为两类:流式套接字和数据报套接字(SOCK_DGRAM)。数据报套接字提供一种不可靠的、非连接的数据包(PACKET)通信方式,不能保证数据包按照发送的顺序到达。流式套接字使用传输协议(TCP),提供一种可靠的面向连接的数据传输方式。当想发送大批量数据时或想让发出的数据顺序无重复的达到目的地时,流式套接字是最好的选择。此外,使用流式套接字时,若数据传输时连接断开,应用程序会得到通知。该模块通信数据主要涉及认证字符串,数据量虽然不大,但要求数据顺序无重复的传输,并且能够将数据传输的状况即使反馈给应用程序以便应用程序做出相应的处理,因此选择流式套接字传输数据。·客户机/服务器通信模型该模块的实现涉及两个部分:置于发起通信连接请求端的Client部分(这是该模块要实现的任务)和置于侦听连接端的Server部分(由项目本地主控端实现)。Client所处的地位在整个项目中是处于远程受控端,而Server所处的地位则是处于本地控制端。这里的Client/Server划分是基于Socket通信机制而言的。下图详细展示了流式套接字在应用程序中的结构,从该图可以看到Client和Server各自遵循相似而又有差别的流程。7.2简单远程控制的被控端系统控制的实现本系统在此模块中设计为当主控端把控制指令(关机、重起、注销)数据发送给被控端后,被控端接收到这些指令,则进行相应的操作。一般说来如果被控端收到这些指令则调用相应的API函数。在使用界面上运用了选项按钮控件OPTIONBUTTON,在主控端程序中使用了程序控制结构语句If…Then…Else,应用程序中可以经过条件表达式的测试,并根据测试结果为TRUE和FALSE来决定程序运行的方向,只有当满足TURE条件时才会进行下个程序流程,否则执行另一个程序流程。例如当主控端测试结果为REBOOT时,主控端向被控端发送参数EWX_REBOOT,被控端根据参数调用CALLSHELL()函数并触发事件过程重起被控端计算机。Shell函数是VB中的内部函数,它负责执行一个可执行文件,返回一个Variant(Double),如果成功的话,代表这个程序的进程ID,若不成功,则会返回0。Shell的语法:Shell(PathName[,WindowStyle])。PathName为必需参数。类型为String,它指出了要执行的程序名,以及任何需要的参数或命令行变量,也可以包括路径名。WindowStyle为可选参数。Integer类型,指定在程序运行时窗口的样式。WindowStyle的常量、值的描述如以下这些值:VbHide0窗口被隐藏,且焦点会移到隐式窗口。VbNormalFocus1窗口具有焦点,且会还原到它原来的大小和位置。VbMinimizedFocus2窗口会以一个具有焦点的图标来显示(缺省值)。VbMaximizedFocus3窗口是一个具有焦点的最大化窗口。VbNormalNoFocus4窗口会被还原到最近使用的大小和位置,而当前活动的窗口仍然保持活动。VbMinimizedNoFocus6窗口会以一个图标来显示,而当前活动的窗口仍然保持活动写入被控端的代码如下:PrivateSubCommand1_Click()mainform.scksever.SendData"HIDSTAR"EndSub(定义Command1按钮,当用户点击按钮时发送隐藏开始命令"HIDSTAR"给被控端。)Case"HIDSTAR"(接收HIDSTAR命令后,激发隐藏开始按钮事件)wnd=FindWindowEx(wnd,0,sStartButton,vbNullString)(利用FindWindow函数获得窗口句柄)ShowWindowwnd,SW_HIDE(利用ShowWindow函数实现隐藏开始按钮功能)

8.测试8.1测试环境IntelCeleronM1.50GHz256M内存的笔记本2台,2台都装有WI

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论