




已阅读5页,还剩47页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第 52 页 共 52页远程监控毕业设计毕业论文1 概述本章首先介绍远程控制的相关理论与知识,给出一个远程控制系统的大概框架,再分析当前远程控制系统发展的状况以及面临的问题与挑战,最后对整个论文做了一个整体的概要。1.1 NRC介绍 网络远程控制(NRC,Network Remote Control)是利用计算机网络,对远程计算机进程操作的一种控制方式。它将远程办公、远程管理、网络教学变成可能。目前的众多计算机网络远程控制软件,都是采用TCP协议,基于Socket开发的。也有少量同类软件使用UDP,ICMP协议的,但是它们的数据可靠性不高,所以只能进行较少数据的传递,对数据要求不高的场合。远程控制技术是伴随着互联网技术的发展而产生的一项崭新技术,通过连接网络,使本地的一台计算机可以操作使用远程的另一台计算机,其操作具有实时性。(1)NRC的原理NRC必须通过网络才能进行。位于本地的计算机是操纵指令的发出端,一般被称为主控端或客户端,非本地的被控计算机则通常叫做被控端或服务端。这里所说的“远程”并不等同于远距离,主控端和被控端可以是位于同一局域网的同一房间中,也可以是连入Internet的处在任何位置的两台或多台计算机。远程控制软件一般分两个部分:一部分是客户端程序(Client),另一部分是服务器端程序(Server),通常在使用前需要将客户端程序安装到主控端的电脑上,将服务器程序安装到被控端的电脑上。它的控制的过程一般是先在控制端电脑上执行主控程序,像一个普通的客户一样向被控端电脑中的服务器端程序发出信号,建立一个特殊的远程服务,然后通过这个远程服务,使用各种远程控制功能发送远程控制命令,控制被控端电脑中的各种应用程序运行。 远程控制软件在两台计算机之间建立起一条数据交换的通道,从而使得控制端可以向服务端发送指令,操纵服务端完成某些特定的工作。此时,控制端只是负责发送指令和显示远程计算机执行程序的结果,而运行程序所需的系统资源均由被控计算机负责。 为了使用的方便,某些远程控制软件使用了Web技术,主控端可通过IE浏览器运行位于服务器端中的主控端程序来实现远程控制。 通过远程控制软件,可以进行多种远程操作,如察看被控电脑屏幕、窗口;访问被控电脑的磁盘、文件夹及文件,并可对其进行管理或共享其中的资源;运行或关闭被控电脑中的应用程序;查看被控电脑的进程表,激活、中止程序进程;记录并提取被控电脑的键盘操作;对被控电脑进行关闭、注销或重启等操作;修改被控电脑的Windows注册表;操纵与被控电脑相接的打印机、扫描仪等外部设备;通过被控电脑捕获音频、视频信号等。(2)NRC的实现 要进行远程控制,首先主控电脑和被控电脑都处在网络中,网络可以是局域网、广域网或Internet,某些软件也可使用直接连接电缆利用电脑COM或LPT口进行远程控制。其次要保证双方使用相同的通信协议,多数情况下远程控制软件使用的是TCP/IP协议互相通信,也有部分软件可使用SPX、NetBIOS协议,但使用这类协议无法在广域网及Internet上实现远程控制。远程控制软件都要求远程控制的双方拥有合法的IP地址,并且要知道控制端或被控端(知其一即可)确切的IP地址。(3)NRC的应用 远程控制在众多的领域里有着非常广泛的应用,如远程培训与教学、远程办公、对计算机及网络的远程管理与维护、远程监控。远程培训与教学 远程控制可以用于对远程的用户和员工进行培训,通过远程控制技术操纵对方的计算机,向对方进行操作演示,这样可以节省培训费用提高培训的效率。远程控制技术也大量的使用在教学网络当中,软件方案的多媒体网络就是远程控制技术与多媒体技术结合的产物。 远程办公远程控制还可让你在任何地点连接自己的工作电脑,使用其中的数据与应用程序,访问网络资源、使用与其连接的打印机等外设。它还可用于公司同事之间互相协同,完成一项共同的工作。 远程管理与维护对于计算机行业的售后服务人员来说,通过远程控制来为客户提供软件维护、升级、故障排除等服务,无疑可节省大笔的服务经费。对于网络管理人员来说,远程控制可用来管理、维护单位网络中的大量服务器和计算机,可大大提高工作效率。 远程监控 企业的管理者可通过远程控制软件来查看员工的屏幕,以保证员工能够在上班时间集中精力投身于工作,杜绝在上班时间聊天、上网、玩游戏的现象。甚至还可通过记录员工的键盘操作,来防止企业的商业和技术机密被不正当使用。 家长也可通过远程控制对子女的电脑进行监控,防止子女无节制玩游戏或接触不良信息。(4)NRC的安全性 远程控制虽然可以方便地操纵远程计算机,但它也可能会给计算机带来安全方面的隐患。因为一旦远程计算机成为服务端以后,其他人只要知道了这台计算机的 IP 地址,同样也可以通过网络上其他计算机向其发送控制指令,由于控制者拥有几乎完全的控制权,被控计算机中的所有资源都处在不设防状况,有可能导致非常严重的后果。实际上木马程序的原理和远程控制程序是一样的,远程控制一旦被居心不良者钻了空子,它的危害甚至比木马还要严重。 因此,远程控制软件必须拥有一套严密的安全审核机制,通常的控制软件会用采用密码验证等认证手段来判断哪些计算机是合法的控制端,只有是合法的控制端发出的指令,服务端才会予以执行,否则就予以拒绝,这样能在一定的程度上保证计算机的安全。1.2 NRC软件发展现状目前,许多大公司开发了一些很好的远程控制软件,如pcAnywhere、Remote Anything、Remote Administrator、DameWare NT Utilities等等,它们在功能上各有其优点与不足。在网络通信方面,它们基本都是采用“面向连接,可靠传输”的TCP(Transmission Control Protocol,即传输控制协议)协议。近年来,HTTP隧道技术与FTP隧道技术也开始引起人们的注意,也逐渐有人尝试着把它运用在远程控制技术中,并证实了其可行性。当前的正规商业远程控制软件所采用的网络模型都是传统的Client/Server模型,新出现的反弹连接模型在商业软件中尚未得以运用。在控制功能上,远程控制软件已经实现了屏幕监控、文件管理、上传下载、以及开机关机等功能,但是在实际的运用中,功能还须大大的加强。1.3 NRC软件开发面临的挑战由于远程控制软件开发中涉及的技术含量相当大,包括的范围也非常广,而计算机所的网络的环境也具有多样性,并且远程控制软件在适应性,健壮性方面也都是较大的难题。为了抵御网络远程嗅探攻击,远程控制类软件还得专门为自己在网络中传输的数据进行加密;为了适应网络带宽较小的环境,还得精心为网络数据进行数据压缩。在功能实现方面,需要开发者有相当的系统内核知识,对于操作系统的调度算法、保护机制,以及系统服务机制、权限分配等处理有清晰的认识。目前的远程控制不仅限于文本的交流,还需要语音、视屏等,而且网络的发展向多元化发展,传统的Client/Server网络模型已不能满足实现需求,需要设计实现新的网络模型,这些对于远程控制系统开发都来说,都是极大的挑战。1.4论文内容简介本文采用TCP协议,基于底层Socket进行网络通信,对于网络中的关键数据进行加密传输,在涉及到软件的网络数据量时,采用数据压缩算法进行数据压缩。网络模型在传统的Client/Server的基础上,引入了反弹连接型,以及两种模型并行的全双功模型。在功能上,实现屏幕监控、文件管理、窗口监控、进程监控、注册表管理、服务管理、TELNET终端、上传下载,对鼠标、键盘、光驱、显示器分辨率等能进行动态监控与设置,同时能够对远程操作系统类型、CPU类型、内存大小及使用状态等进行探测;在聊天功能上,加入了视频同步等等。本文最后详细介绍了此系统中创造的内核线程守护功能,程序指纹的设计,自我鉴定算法设计等,并针对系统开发中使用的关键技术(如远程线程注入,ShellCode技术,Hook技术等)做了详细的说明。2 网络相关分析2.1 Socket简介套接字(Socket)是一种网络编程接口,它是对通信端点的一种抽象,提供了一种发送和接受数据的机制。Socket最初是由Berkley分校开发的,它是在UNIX环境下的一个编程接口。开发Socket的目的是隐蔽网络底层复杂的结构和协议,使编程人员能够简单抽象的对网络进行操作。利用它可以构造任意的跨操作系统,跨网络协议的分布式处理系统。Socket面向Client/Server模式,针对Client/Server程序提供不同的主要系统调用。Socket的协议分为以下三种类型:字节流套接字(SOCK_STREAM),数据报套接字(SOCK_DGRAM),原始数据报套接字(SOCK_RAM)。前面两种属于Socket的连接类型,在功能上却有较大的差异。数据报套接字面向无连接型,传输不保证顺序性、可靠性和无重复性,因此适合在涉及少量信息传递的情况。字节流套接字是一种面向连接、带有校验机制的网络信息包传输,可靠性比较优秀,但是在这个过程中需要建立和释放连接,并且在每一个消息传递之后就要立即应答校对,增大了额外的开销,适合于大量信息传递的情况。网络远程控制中涉及的数据信息量相当大,而且要求有较高的可靠性,因此采用字节流套接字。面向连接的字节流类型的工作流程如图1.1所示:面向连接的字节流类型的Socket工作中有比较严格的操作次序,工作的原理也比较复杂。在其工作过程中,必须首先启动服务器端,通过调用WSAStartup()函数初始化套接字,再调用socket()函数创建一个socket对象,然后调用bind()函数将该socket对象和本地网络地址绑定在一起,再调用listen()函数使该socket对象处于侦听状态,并规定它的最大请求的数量。之后一直等到有客户机有连接请求的时候服务器才会再次被激活。收到客户机请求以后,服务器调用accept()函数来决定是否接受该连接。客户在建立Socket对象后就可调用connect()函数和服务器建立连接。连接一旦建立,客户机和服务器之间就可以通过调用基本的网络I/O函数send()、recv()来发送和接收数据。待数据传送结束后,双方都调用closesocket()函数关闭开始创建的socket对象。最后再调用WSACleanup()恢复套接字( WSAStartup()函数使用之后Winsock内部计数器就会加1,使用WSACleanup()函数在这个计数器上执行减1操作)。这样就进行了一次完整的通信。图1.1 Client/Server网络模型2.2 TCP/IP协议族分析在众多的协议中,TCP/IP协议的应用是最为广泛的,已经成为了事实上的工业标准,主要用于广域网(WAN)和局域网(LAN)。TCP/IP起源于20世纪60年代末美国政府资助的一个分组交换网络研究项目,到20世纪90年代已发展成为计算机之间最常应用的组网协议。它是一个真正的开放系统,该协议族的定义及其多种实现可以在公开的场合免费得到。Internat就是采用TCP/IP协议作为共同的通信协议,将世界范围内许多计算机网络连接在一起,成为当今最大的和最流行的国际性网络。2.2.1TCP协议说明TCP的全称是 Transmission Control Protocol,即传输控制协议。在网络通信传输机制中,它属于“面向连接,可靠传输”的类型。这一点如果和UDP协议进行比较就会看得比较清楚。面向连接的传输意味着在进行通信以前,需要在两个系统之间建立逻辑连接,在每个数据传输的过程中都需要进行应答以保证数据包的完整。这种方法所需的网络开销较大,可是数据传输的可靠性可以保证。在常见的上层协议中,TELNET、FTP、SMTP、HTTP等都是使用TCP协议作为基础的,而一些简单的协议如ECHO(一种简单的回显服务,即客户端会从服务器端接受到自己的发送包的拷贝),则可以使用TCP也可以使用UDP。2.2.2UDP协议说明UDP的全称是User Datagram Protocol,即用户数据报协议。它属于“面向无连接,不可靠传输”的类型。这一点必须注意。该协议只负责接收和传送由上层协议传递的消息,它本身不做任何一方的检测、修改与应答。UDP协议中,每个数据包成为“数据报”,它的包头只包括几个域,主要是地址信息、包的长度和校验信息。与此对应,TCP包的头信息有十多个域,因此它的网络开销一般要小于TCP协议。由于UDP协议在传送数据过程中没有建立连接,也不进行检查,因此在优良的网络环境中,其工作效率较TCP协议要高。目前常见的使用UDP协议工作的软件有OICQ,它是一种在线聊天工具。由于自身的特点,它成为进行网络广播的首选协议。传统的NFS(Net File System,网络文件系统)只使用UDP协议,从NFS v30开始同时支持TCP与UDP。2.3 Client/Server模型分析Client/Server模型是非对等关系,客户发出服务请求,服务器作出响应,提供服务,即所谓的请求驱动。当前网络远程控制都是采用这个模型,但是根据计算机所处的网络环境关系不同,又可分为正向连接与反弹连接两种模式。计算机A(Client)与计算机B(Server)所处网络环境关系分为以下五种情况: 同一内网; 同为公网; 内网公网; 公网内网; 内网A内网B。这五种情况各有其特点,也正因为如此,远程控制软件开发面临了巨大的挑战。为了适应这几种关系,Client/Server模型分化出了两种模式。正向连接模式属于传统Client/Server模型,服务端监听端口,等待客户端的连接请求,客户端主动连接服务端,建立连接,再进行控制操作。当前许多著名的远程控制软件都使用这种模式,对于处于网络关系的计算机,可以轻松实现网络远程控制。但是现在处于关系的也非常多,而且有发展的趋势,使用传统正向连接模式根本无法找到服务端,更谈不上远程控制。这也正是当前众多远程控制软件不能满足需求的原因所在。反弹连接是近年才出现的网络连接模式,属于反传统Client/Server模型。它相对于正向连接而存在,并且由客户端监听端口,服务端主动连接客户端实现网络通信,进而实现远程控制。目前,这种连接模式主要使用在黑客后门程序中,用于穿透防火墙。它能实现关系的计算机之间的通信,但是在目前的远程控制软件中较少使用,也无法满足实际需求。3 远程控制系统网络模型设计3.1 数据转发设计数据转发就是在一个固定的开放端口接受数据,并设定此端口收到的数据全部转发给另外一个端口,通过不同IP地址的端口数据转发,可以让公网主机主动访问内网的一台计算机。其数据转发机制如图3.1所示:图3.1 数据转发模型通过数据转发,内网主机的port1就映射到了公网主机的port3端口上了,其它的主机只要访问公网主机I的port3端口,就能够访问到内网主机的port1。在这个模型中,公网主机I上port2与port3之间存在一种数据转发机制,它的功能就是把port2收到的非本机数据全部转发给port3,同时也把port3所收到的非本机数据也全部转发给port2。通过对数据转发机制的设计,就可以建立所需要的网络远程控制软件模型了。3.2 网络连接模型设计经过对正向连接,反弹连接与端口映射的分析,现在可以总结设计出符合实际需求的网络远程控制软件的模型了。这个模型既能够实现五种网络环境关系下的远程控制,又要尽可能不降低执行效率。因此,服务端与客户端都分别采用两种模式:监听等待连接和主动连接。客户端采用这两种模式属于互斥式,即当采用其一模式时,另一种模式失效;服务端的两种模式并发执行,监听的端口可以直接与客户端建立连接,也可以接收服务端主动连接模式中端口转发过来的数据。远程控制连接模型设计如图3.2所示:由图3.2可知,这个模型可以使用三种不同的连接方式。(1)当客户端能够直接访问服务端时,由客户端向服务端监听的端口请求连接(应用于)。(2)当客户端不能直接访问服务端,而服务端可以直接访问客户端时,由服务端向客户端监听的端口请求连接(适用于,应用于)。图3.2 网络连接模型(3)当客户端与服务端都不能直接访问对方的时候,服务端将本机监听的端口映射为公网主机I的C_Port,再由客户端向C_Port提出连接请求(适用于,应用于)。第二种连接方式虽然也适用于情况,但使用中不如第一种方式方便,因此仅应用于;第三种连接方式虽然能够满足所有要求,但是其执行效率远不及前面两种方式,因此只应用于。此模型中,服务端两种模式并发执行,所以不用选择服务模式。欲建立连接时,客户端根据不同的网络条件,选择相应的互斥连接方式,就可以达到远程控制的目的。由于连接模式的多样性,密码验证也具有了多样性。3.3 密码验证模式设计远程控制的实际运用中,客户端与服务端建立连接必须经过密码验证才能实现,这在远程控制中才能保证服务的安全性,也是网络远程控制软件系统设计的一个重要的方面。本文采用了三种不同的连接方式,所以也得相应采取不同的密码验证模式。密码验证模型1如图3.3所示。此密码验证模式中,客户端主动向服务端提出连接请求。当服务端接收到连接请求的时候,马上要求客户端进行密码验证。由于密码要在网络中进行传送,这就涉及到了密码信息泄露的可能性,网络中传输的密码很可能被黑客进行嗅探攻击而泄漏。为了确保安全,就需要对传输的密码进行加密(使用不可逆加密算法),然后再将加密后的密码传送给服务端。服务端接收到信息后,立刻对自己的验证码使用同样的加密算法进行加密(因为加密算法是不可逆的,所以不能采用解密的办法),再将加密结果与接收到的信息进行对比。如果密码不正确,则拒绝连接请求;如果密码正确,则准备接收命令、执行命令,返回执行结果,直到客户请求断开连接,或者网络意外中断,才结束这次会话。图3.3 密码验证模式1密码验证模式2如图3.4所示:图3.4 密码验证模式2此密码验证模式与模式1最大的区别就在于:模式1中,是由客户端主动提出连接请求;模式2中,却是由服务端主动提出连接请求。在尚未建立连接的情况下,服务端每间隔一段时间(间隔时间可以根据实际情况而定,一般为几秒钟)就向客户端发送连接请求。当客户端接收到连接请求时,就马上对请求连接者的身分进行识别。如果客户端不打算对请求者进行操作,则不做任何响应;如果客户端欲对请求者进行远程操作,则马上根据识别的结果,选择与请求者对应的密码进行加密,再传送给服务端。服务端接收到数据信息后,立即对自身的验证码进行相同加密,再将加密后的密码与接收到的信息进行对比。如果密码不正确,则断开连接,结束本次会话,继续向控制端发送连接请求;如果密码正确,则准备接收命令、执行命令,返回结果,直到客户提出断开请求,或者网络意外中断,才结束本次会话,再继续向控制端发送连接请求。模式1与模式2的结合点在于最终的数据处理都由服务端监听端口实现,当它接收到连接请求或响应数据时,都会要求进行密码验证,于是模式1与模式2通过它有机地结合在一起,使得三种连接方式密码验证都得以实现。4 远程控制系统功能设计与实现4.1 网络通信的实现本模块中详细分析远程控制系统中网络通信的具体实现。实现手段:delphi 6.0 环境下,使用底层Socket开发实现。进行网络数据传输时,每个数据包的大小设计为4k(TCP协议的网络数据包一般都小于等于这个值),经过加密处理的相关命令及其参数都是放在数据包的头部,接收到数据包时,首先提取命令及其数据,再解密并执行相关的命令。接收数据与发送数据两个线程同步,并行处理数据。其实现模型如图1.1所示。(1)服务端实现端口监听,用于等待客户端的连接请求。当客户端请求断开连接,或者网络意外中断时,结束一次网络连接,等待新的连接请求。其具体实现代码如下:function InitSocket: Boolean; / 用于初始化winsock;var WSAData: TWSADATA;begin if(WSAStartup(MAKEWORD(2, 0), WSAData) 0) then /初始化winsock,使用winsock(2.0); begin Result := False; end else Result := True;end;/ 创建 Socket;function ServerSocketActive(port: integer): Boolean;var SAddr: TSockAddr;begin skt := socket(PF_INET, SOCK_STREAM, IPPROTO_TCP); / 创建一个采用字节流类型的TCP协议的Socket; if(skt = INVALID_SOCKET) then begin WSACleanup(); Result := False; Exit; end; SAddr.sin_family := PF_INET; SAddr.sin_port := htons( port ); SAddr.sin_addr.S_addr := INADDR_ANY; if(bind(skt, SAddr, sizeof(SAddr) = SOCKET_ERROR) then / 执行端口绑定; begin CloseSocket(skt); WSACleanup(); Result := False; Exit; end; if(listen(skt, 999) 0) then / 监听端口,最大连接数为999; begin CloseSocket(skt); WSACleanup(); Result := False; Exit; end; Result := True;end;/ 接受连接请求,并向客户机发送应答信息;function AcceptSocket: Boolean;var sa: TSockAddr; sa_len: integer;begin sa_len := SizeOf( sa ); SSkt := accept(skt, sa, sa_len); / 接受连接请求 if(SSkt = INVALID_SOCKET) then begin CloseSocket(skt); WSACleanup(); Result := False; Exit; end; Result := True;end;接受连接请求后,服务端与客户端便能进行网络通信,数据传送。在传统的正向连接型Client/Server模型中,服务端用于接收命令并执行命令,再把命令的执行结果回传给客户端,以完成一次成功的远程控制操作。(2) 客户端用于主动向服务端提出连接请求,它本身的数据包含了自身的信息以及目的服务端的IP地址和端口等信息。在提出连接请求之前,客户端也需要进行初始化套接字、创建套接字操作,然后再连接服务端。具体实现如下:function ClientSocketActive(port: integer; IP: PChar): Boolean;var SAddr: TSockAddr;begin skt := socket(PF_INET, SOCK_STREAM, IPPROTO_TCP); / 创建一个采用字节流类型的TCP协议的Socket; if(skt = INVALID_SOCKET) then begin WSACleanup(); Result := False; Exit; end; SAddr.sin_family := PF_INET; SAddr.sin_port := htons( port ); SAddr.sin_addr.S_addr := inet_addr( IP ); if (connect(skt, SAddr, SizeOf(SAddr) 0) then / 向服务端发出建立连接的申请。使用的参数中包括了服务器的地址信息。该函数还负责将客户端信息发送给服务器。 begin CloseSocket(skt); WSACleanup(); Result := False; Exit; end; Result := True;end;(3) 网络I/O函数function send(s: TSocket; var Buf; len,flags:Integer):Integer;stdcall;s: TSocket对象,使用socket()函数创建;Buf: 保存发送数据的缓冲区地址;len: 缓冲区大小;flags: 网络呼叫产生方式标志,flags的值可设为0或者MSG_DONTROUTE 及 MSG_00B 的组合。如果函数调用成功,返回实际发送的字节数,否则返回SOCKET_ERROR。Function recv(s: TSocket; var Buf; len,flags:Interger):Integer;stdcall;s: TSocket对象,使用socket()函数创建;Buf: 保存接收数据的缓冲区地址;len: 缓冲区大小;flags: 网络呼叫产生方式标志,flags的值可设为 0 或者 MSG_DONTROUTE 及 MSG_OOB 的组合。MSG_PEEK 代表将资料拷贝到使用者提供的 Buf,但是资料并不从系统的缓冲区中移走;0 则表示拷贝并移走。如果函数调用成功,返回实际接收的字节数,否则返回 SOCKET_ERROR。(4) 关闭Socket及错误处理Function WSACleanup: Integer;stdcall;函数调用成功,返回 0,否则返回 SOCKET_ERROR。在应用程序完成网络通信以后,应该调用Winsock API的库函数将其关闭,通知Winsock网络通信已经结束。网络程序每调用一次 WSAStartup(),Winsock的计数器就会加1,使用WSACleanup()这个函数在这个计数器上执行减1操作。调用这个函数是为了释放其占用的资源。Function WSAGetLastError: Integer;stdcall;Procedure WSASetLastError(iError: Integer);stdcall;WSAGetLastError()函数返回的就是最后一次发生的Winsock错误的错误码。在WSASetLastError()函数中的参数是需要设置的错误号。在网络错误发生时,应用程序可以首先使用WSAGetLastError()函数了解问题所在,然后调用WSASetLastError()函数将错误号设置成 0,从而重置当前进程的网络错误。4.2 远程文件管理的设计与实现文件管理模块实现对远程主机上文件的管理,在客户端与服务端建立连接的情况下进行管理操作,其具体的功能如图4.1所示:图4.1 文件管理模型在建立网络连接的时,被控制端遍列本机磁盘,再把磁盘的所有信息传给控制端。API函数 GetDriveType 可以检测驱动器所属的类型。该函数的定义如下:UNIT GetDriveType(LPCTSTR lpRootPathName);通过函数返回值就可以确定驱动器的类型信息。它可以取下列值:0 驱动器类型无法确定;1 指定的根目录不存在;DRIVE_REMOVEABLE 该驱动器是可移动驱动器;DRIVE_FIXED 该驱动器是固定驱动器;DRIVE_REMOTE 该驱动器是远程(网络)驱动器;DRIVE_CDROM 该驱动器是 CD-ROM 驱动器;DRIVE_RAMDISK 该驱动器是虚拟驱动器(RAM)。接着需要实现的对驱动器内文件的进行遍列,并获取文件的大小与修改日期等信息。将遍列的结果以文本的形式存入一个TStringList类型函数内,再把它发送给控制端,控制端将接受到的文本进行分离,分别列出文件夹与文件。其它功能实现如下:新建目录:MkDir(P: PChar);删除目录:API函RemoveDir(P: PChar)只能够删除空目录,并且目录的属性不能为只读。因此,在执行目录删除操作时,首先要把目录的属性设置为无任何属性,再对目录内的所有文件进行遍列、删除,如果目录内还有其它目录,则在遍列的同时,对其功能进行递归调用。复制文件、剪切文件、粘贴文件:CopyFile(LPCTSTR lpExistingFileName, LPCTSTR lpNewFileName, BOOL bFailIfExists);LPCTSTR lpExistingFileName为已经存在,要拷贝的源文件;LPCTSTR lpNewFileName为拷贝的目的文件;BOOL bFailIfExists,当目的文件已经存在时,是否进行覆盖操作,如果有真则不覆盖,为假则覆盖掉原来已经存在的目的文件。在此操作中,复制文件与剪切文件不同的是,剪切文件还多了一个操作,就是拷贝成功完成后,把源文件删除。重命名:function RenameFile(const OldName, NewName: string): Boolean;如果重命名成功则返回TRUE,否则返回FALSE;删除:function DeleteFile(const FileName: string): Boolean;如果删除成功则返回TRUE,否则返回FALSE;文件执行:UINT WinExec(LPCSTR lpCmdLine, UINT uCmdShow); LPCSTR lpCmdLine为需要执行的命令行,UINT uCmdShow为命令执行的方式,SW_HIDE为后台隐藏执行,SW_SHOW为前台执行。排列方式:大图标、小图标、列表、详细资料。这几种排列方式都是模仿的Windows系统中文件的排列方式,以适应人们的使用习惯。文件管理中还有两个非常重要的功能:文件上传与下载,这也是网络远程文件管理中不可或缺的功能。在欲进行文件上传或下载操作时,控制端首先通知被控制端,并且把要上传、下载的文件信息传送给被控制端。被控端接收到信息之后,与控制端建立一个新的连接,用于文件传输。再以共享的方式打开文件,文件指针指向文件头部,将其内容读入内存,最后以每个包4K的大小发送出去,直至整个文件发送完毕。这个操作过程不能够使用程序主线程,否则不能进行停止文件传输操作。4.3 远程进程监控的设计与实现Windows是一个多任务系统,同一时间可以有多个程序在内存中运行,即多个进程。进程是一个表态的概念,而线程才是一个动态的概念。如果进程创建时将自动建立主线程,主线程本身又可以生成新的线程。通常而言,子进程可以继承一组与父进程相同的环境变量。但是,父进程能够控制子进程继承什么环境变量。这里的继承,指的是子进程获得自己的父进程的环境块“拷贝”,子进程与父进程不共享相同的环境块。这意味着子进程能够添加、删除或修改它的环境块中的变量,而这个变化却不会影响父进程的环境块。Win32分给每个进程的内存都是4GB,这里的4GB的地址空间不是指物理地址空间,而是Windows的虚拟地址空间,其目的是使进程与进程之间互不干扰。由于每个进程都在自己的4GB的地址运行,而不必理会其他的进程,所以每个进程在计算机中与其他进程的关系是完全独立的,互相覆盖的机会非常少。因此,一个程序对内存的无效访问导致覆盖另一个程序或操作系统的某些部分的情况是不可能的,每个进程都被封闭在一个安全的虚拟环境中,在这个环境中不能获得任何其它程序。对于Win32,所有内存的操作都是由操作系统来完成的,应用程序不能对内存进行直接操作,如果要使用其中的内存空间要事先向系统申请。应用程序一般使用VirtualAlloc函数通过两个步骤来完成这个过程:第一步保留,申请内存为保留空间,不能再用于其他的用途,当然仅仅这个操作不会对内存发生什么变化,这根本未进行内存分配操作,也不能在这时就对内存进行访问,否则将会发生异常;第二步提交,这一步才真正分配了内存空间,才能作为一个进程的可用空间。Win32系统虽为每个进程分配了4GB的内存空间,但实际上大部分的机器都不会有如此大的内存,Win32只用到了4GB线性地址的一小部分,只有在应用程序向系统请求内存时才会分配更大的空间。分析虚拟内存地址是否有效(即分析是否已将其地址与物理地址或交换文件映射)、是否对其有读写属性等,可以使用VirtualQueryEx函数来完成此任务,此函数以MEMORY_BASIC_INFORMATION结构为参数,如下表4.1所示:表4.1 VirtualQueryEx函数参数表字段名意义BaseAddress当前块所属区域的基地址AllocationBase当前块所属分配单元的基地址AllocationProtect当前块所属区域的初始访问保护属性(保留时指定)RegionSize当前块大小State当前块状态Protect当前块的访问保护Type当前块的页类型:MEM_IMAGE,MEM_MAPPED,MEM_PRIVATE4.3.1进程列举的实现为了枚举进程及其信息,需要使用Windows提供的ToolHelp API来实现。很多时候要了解系统中已经执行的进程,并取得该进程的所用的程序扩展,以用于对于某些进程进行监视、计时或获取其相应的动态调用信息等用途。通常所见到的真正运行的进程通常被定义为一个正在运行的程序,由操作系统用来管理进程的内核对象和地址空间两部分组成。内核对象也是系统用来存放关于进程的统计信息的地方。地址空间包含所有可执行模块或DLL模块的代码和数据,它还包含动态内存分配的空间,如线程的堆栈和堆分配空间。在Windows 9x/2000/XP下可以用ToolHelp API枚举进程信息。创建长期系统内核快照:CreateToolHelp32Snapshot(TH32CS_SNAPPROCESS,0);获取第一个进程:Process32First(ProcessListHandle,ProcessStruct);获取下一个进程,直到最后一个进程为止:Process32Next(ProcessListHandle,ProcessStruct);4.3.2终止进程的实现 由CreateThread创建的线程将执行到调用ExitThread或线程函数返回时为止(在后一种情况下,ExitThread被隐藏地调用)。ExitThread的退出参数或线程函数的返回值就是线程的退出代码。任何在进程终止时打开着的文件或其他资源将自动关闭,但是线程不同,线程终止时任何打开的资源仍保持打开,直到其他线程关闭它或进程结束。进程的任何线程均可调用CreateProcess创建子进程。另外,已过时的进程创建函数(LoadModule和WinExec)也是靠调用CreateProcess实现的。如果一个可执行的模块有多个执行实例,那么每个都有自己的数据段和地址空间,尽管它们可以共享代码和已调入内存的初始后的数据。 父进程可以向它的子进程传递命令参数,父进程可让子进程继承其环境变量,也可为子进程指定新的环境变量,父进程可以控制是否让子进程继承已打开的句柄,父进程还能让子进程选择继承一些资源。子进程可以不用准备就使用继承来的资源,当然如果是父进程在创建子进程后所创建的资源,对于子进程是“不可见”的。这与线程创建的资源不同,线程创建的资源对于任何时刻创建的进程都是“可见”的。TerminateProcess函数是个异步运行的函数,也就是说,它会告诉系统要进程终止运行,但是当函数返回时,无法保证该进程已经终止运行。因此,如果想要确切地了解进程是否已经终止运行,必须调用WaitForSingleObject函数或者类似的函数,并传递进程的句柄。当进程终止运行时,下列的操作将启动运行。(1)进程中剩余的所有线程全部终止运行。进程指定的所有用户对象和GDI对象均被释放,所有内核对象均被关闭。(2)如果没有其他进程打开它们的句柄,那么这些内核对象还将被撤消。但是,如果其他进程打开了它们的句柄,那么这些内核对象还将被撤消。但是,如果其他进程打开了它们的句柄,内核对象将不会撤消它们。(3)进程的退出代码将从STILL_ACTIVE改为传递给ExitProcess或TerminateProcess的值。进程内核对象的使用计数递减1。(4)进程内核对象维护着关于进程的统计信息,即使进程已经终止运行,该信息也是有用的。例如,可能想要知道进程需要多少CPU时间,或者想通过调用GetExitCodeProcess来获得目前已经撤消的进程的退出代码。4.4远程注册表管理的设计与实现为了使系统运行得更为稳定和克服一些系统问题,微软公司在Windows 95及其后继版本中,采用了一种叫做“注册表”的数据库来对其进行统一管理,将各种信息资源集中起来并存储各种配置信息。注册表实际上是一个有名无实的东西,在系统中根本就找不到这样一个文件。Windows 9X的注册表实际上就是保存在Windows 9X安装文件夹中的两个二进制数据文件,一个叫做System.dat另外一个叫做user.dat。所以大家平常所说的注册表,指的实际上就是这两个*.dat文件。按照这一原则,Windows各版本中都采用了将应用程序和计算机系统全部配置信息容纳在一起的注册表,用来管理应用程序和文件的关联、硬件设备说明、状态属性以及各种状态信息和数据等。与INI文件不同的是:(1)注册表采用了二进制形式登录数据;(2)注册表支持子键,各级子关键字都有自己的“键值”;(3)注册表中的键值项可以包含可执行代码,而不是简单的字串;(4)在同一台计算机上,注册表可以存储多个用户的特性。注册表的特点(1)注册表允许对硬件、系统参数、应用程序和设备驱动程序进行跟踪配置,这使得修改某些设置后不用重新启动成为可能。(2)注册表中登录的硬件部分数据可以支持高版本Windows的即插即用的特性。当Windows检测到机器上的新设备时,就把有关数据保存到注册表中,另外,还可以避免新设备与原有设备之间的资源冲突。(3)管理人员和用户通过注册表可以在网络在检查系统配置和设置,使得远程管理可以实现。4.4.1注册表的组织结构设计在Windows系统的注册表中,所有的数据都是通过一种树状结构以键(KEY,也称项)、根键(HIVE KEY)、子键(SUBKEY,也称子项)和值(VALUE,也称数值、键值)的方式组织起来,就像磁盘文件系统的目录结构一样。也即Windows操作系统注册表是按照三层结构组织的,以层叠式结构排列,由 根键键子键键值 组成。根键:属于系统定义的配置单元,通过“HKEY_”来表示其内容。在注册表中主要有六个根键,它们分别是:(1)HKEY_CLASSES_ROOT:是基层类别键,用于定义系统中所有已经注册的文件扩展名、文件类型、文件图标等。(2)HKEY_CURRENT_USER:用于定义当前用户的所有权限,其实际上就是HKEY_USER.Default下面的一部分内容,它包含了当前用户的登录信息。(3)HEKY_LOCAL_MACHINE:用于定义相对网络环境而言的本地计算机软硬件的全部信息。该根键在系统的配置和设置发生变化时,也随之改变其下的登录项。(4)HKEY_USERS:用于定义所有用户信息,其中部分分支将映射到HEKY_CURRENT_USER关键字中,它的大部分设置都可以通过“控制面板”来修改。(5)HKEY_CURRENT:用于定义计算机的当前配置情况,如显示器、打印机等可选外部设备及其设置信息等。它实际上就是指向HKEY_LOCAL_MACHINEConfig结构中的某个分支的指针。(6)HKEY_DYN_DATA:用于定义系统运行中的动态数据,实际上就是已发生的事件的有关信息。它主要包含系统硬件的当前状态和那些需要更新与检索的数据,系统每次启动进都要创建此关键字。每个根键是由若干子键组成的,其中每个键名代表一特定的注册项目,键值可分为字符串值、二进制值和DWORD值等,都能用注册表编辑器进行修改。键和子键:(又叫项和子项)它没有特殊的名称表示,以主HKEY_配置单元子目录的形式存在,而且没有附带的数据,只负责组织对数据的访问。键值:(也称值项)用于包含计算机及其应用程序执行时使用的实际数据,键值可以分为字符串值、二进制值和DWORD值等,也可以用注册表编辑器对其进行完全修改。在Windows下,虽然系统提供了远程注册表管理功能,但是需要管理员用户名与密码,而且必须有IPC通道支持,所以使用起来极为不便。现在为了防御蠕虫之类的恶意程序攻击,出于安全考虑,大部分的主机都关闭了IPC通道。所以现在使用系统提供的这个功能是不太实际的。于是,在远程控制系统中,对注册表的管理,得采用模拟的方法来实现。4.4.2注册表功能设计对注册表的管理,设
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 高端系统门窗合同范本
- 房产采购家电合同范本
- 外贸劳务英文合同范本
- 咳嗽变异性哮喘雾化吸入护理查房
- 包子店劳务合同范本
- 毛坯租房合同范本
- 模具快速原型制作合同
- 房屋自动延续合同范本
- 装卸及安装合同范本
- 地瓜基地采购合同范本
- 膀胱灌注的护理课件
- 桥梁安全保护区管理制度
- 学堂在线 大学生国家安全教育 章节测试答案
- 2025至2030中国增强型飞行视觉系统行业发展趋势分析与未来投资战略咨询研究报告
- 华文版二年级上册-写字-书法
- 学堂在线 数据结构(上) 章节测试答案
- 安全文明生产的保证措施
- 车辆运输安全培训
- 工贸企业安全培训课件
- 长沙市太平街、西文庙坪历史文化街区保护提升项目可行性研究报告
- 业绩分红方案(3篇)
评论
0/150
提交评论