资源描述
Simple Remote Control System
——The Design of Controlled Terminal
Abstract
With the rapid development of the wide use of computer and network has brought a broad play to the remote control system, people can be controlled through thesimple terminal complete control network at the other end, thus completing thepowerful control function, obtain any information of controlled machine, in this way is known as remote control.
With the rapid development of network technology, the operating system uses the host computers in the network have the function of remote control, remote control provides great ceconvenience to the network administrator. And it alsogreatly convenient ways to hackers and criminals, by remote control, very easy to steal user information, network privacy, malicious damage to the computer system. Master some knowledge of remote control, and to prevent the threat to network security remote control brings, is now in the network operating system,the administrator of a required course.
The simple remote control system consists of a main control end and the end of two parts. The host for the implementation of various control and monitor the operation of the computer connected to a network, the host receives data for analysis, interpretation and implementation. The system can implement thecontrolled end of getting the information of controlled terminal, system control,end the mouse control, the controlled terminal keyboard control, accused ofsending end process control and message function.
In this paper, the theory of remote control and the main technology is briefly introduced, after the analysis, a detailed description of the hosts of the design and implementation of the system, finally gives the measurement results.
Key words: Remote control Client/Server mode Socket Information security
目录
1引言 1
1.1 本课题的研究背景和意义 1
1.2 国内外研究现状 2
1.3 本课题的主要研究的内容 2
1.4 作者的主要工作 3
2简单远程控制系统相关理论研究 3
2.1 远程控制系统概述 3
2.2 Socket套接字 4
2.3 客户端/服务器(C/S)模式 7
2.4因特网协议 7
3简单远程控制系统总体结构 8
3.1 系统规格说明 8
3.1.1 简单远程控制系统的概貌 8
3.1.2 各模块功能要求 8
3.1.3 性能要求 9
3.1.4 运行要求 9
3.2 数据要求 9
3.3 用户系统描述 9
4 简单远程控制系统的功能模块的设计 9
4.1 简单远程控制系统的主体设计 9
4.2 简单远程控制系统的系统功能的实现 10
5 简单远程控制系统功能模块的编程及实现 11
5.1 简单远程控制的连接功能实现 11
5.2 简单远程控制的被控端获取信息的实现 12
5.3 简单远程控制的向被控端发送消息的实现 13
5.4 简单远程控制的被控端键盘和鼠标的开启和锁定的实现 14
5.5简单远程控制的被控端进程的浏览和杀死功能的实现 16
5.6 简单远程控制的被控端执行CMD命令的实现 18
6测试 19
6.1 测试环境 19
6.2 测试过程以及结果 19
结 论 21
参考文献 22
1引言
1.1 本课题的研究背景和意义
随着社会、科技、经济的不断发展,远程控制技术的应用范围也在不断拓展,从最初银行、军事、机要部门等特殊行业领域的应用已经延伸到了今天的电业部门、商业部门、普通工矿企业、道路交通领域、学校教学应用、卫生医疗部门以及宾馆酒店行业等等,其卓越的功能也日益受到各个应用行业的重视和青睐,但是许多远程监控软件都需要配有硬件设备,这不仅使得实际应用的成本升高,而且也使实施应用增加了技术障碍。虽然有诸多问题的存在,但是我们应该认识到远程控制技术的研究,不仅充分利用了现有资源,拓宽了因特网的利用范围,而且也使远程控制能够减少成本扩大远程化距离,实现任意节点的访问机制,并进入一般的应用领域,比如,进入家庭,人们通过因特网控制家用电器,采用因特网作为远程控制平台,是一项很有前途和潜力的技术,另外它可以应用到设备远程诊断、远程监测、遥控等领域。
远程控制软件一般分两个部分:一部分是客户端程序Client,另一部分是服务器端程序Server,在使用前需要将客户端程序安装到主控端电脑上,将服务器端程序安装到被控端电脑上。它的控制的过程一般是先在主控端电脑上执行客户端程序,像一个普通的客户一样向被控端电脑中的服务器端程序发出信号,建立一个特殊的远程服务,然后通过这个远程服务,使用各种远程控制功能发送远程控制命令,控制被控端电脑中的各种应用程序运行,我们称这种远程控制方式为基于远程服务的远程控制。通过远程控制软件,我们可以进行很多方面的远程控制,包括获取目标电脑屏幕图像、窗口及进程列表;记录并提取远端键盘事件(击键序列,即监视远端键盘输入的内容);可以打开、关闭目标电脑的任意目录并实现资源共享;提取拨号网络及普通程序的密码;激活、中止远端程序进程;管理远端电脑的文件和文件夹;关闭或者重新启动远端电脑中的操作系统;修改Windows注册表;通过远端电脑上、下载文件和捕获音频、视频信号等。
前面所讲的是一台电脑对一台电脑的情况,其实,基于远程服务的远程控制最适合的模式是一对多,即利用远程控制软件,我们可以使用一台电脑控制多台电脑,这就不必为办公室的每一台电脑都安装一个调制解调器,而只需要利用办公室局域网的优势就可以轻松实现远程多点控制了。在进行一台电脑对多台远端电脑进行控制时,远程控制软件似乎更像一个局域网的网络管理员,而提供远程控制的远程终端服务就像极了办公室局域网的延伸。这种一对多的连接方式在节省了调制解调器的同时,还使得网络的接入更加安全可靠,网络管理员也更易于管理局域网上的每一台电脑。
因特网的出现及其发展推动了科学技术的各个方面,并使之取得了巨大的进步,利用因特网,可以使远程控制技术得到大范围的应用,从而方便人们的生活。
1.2 国内外研究现状
目前,基于因特网的远程控制国内外都有不同程度的研究。相对来说,由于西方国家在信息技术和计算机控制技术的发展上的优势,他们在研究远程控制方面相对早些,而且有些公司有相关的初级产品问世。国内由于因特网的飞速发展,近几年也开始积极的研究。国内外在基于因特网的远程机器人控制方面的研究相对其他领域要多一些。例如美国伯克立大学研制的是一个通过因特网远程控制的种植花草 工业机器人手臂。拥护通过机器人手臂上的摄像机所传输的图像,对这个花园内进行简单的操作。
这些基于因特网的远程控制系统普遍采用了客户/服务器网络模型,现场采用摄像机来监视,并通过网络发出指令。当前,由于网络基础设施还不够完善,所以监视图像由于数据量大,其传输时间过长。即使是采用了数据压缩技术,也仍然有很大的数据量需要传输,因而由此产生的远程控制时间延迟也必然很大。此外,这类系统普遍采用瘦客户/肥服务器的网络模型,监控端的控制操作功能过于简单,都只是发一些简单的指令,而不能实现一些复杂的必要的逻辑处理功能。第三,这类系统在处理上由于时间延迟影响现场控制系统不稳定时,仍然采用的执行-等待-执行-等待的单步执行流程,生产设备运行效率相当低下,第四,大量的采用以图像监视为主的方式,虽然可以使得监控人员更能直观的感受到现场情况,便与监控人员的控制;但是我们应该注意到,有些设备的被监控状态是难以用图像方式表示出来的,比如温度、速度、压力这类精确的数值量;此外有些采用图像传输的数据量也可以采用通过数据传输关键数据以在监控端进行实况模拟图,这样就会减少数据量,而使数据传输速度大大提高。
1.3 本课题的主要研究的内容
远程控制是一个具有重要的研究价值的课题,它在工业,国防等各个方面有着广泛的需求。然而,使用传统的方式,由于成本、技术、维护、传输距离等方面的问题,远程控制并没有很好的推广和利用。先进由于因特网的出现,使得成本低廉的远距离通信轻易的变成了现实。于是采用因特网作为远程控制平台,将远程控制的状态、命令等控制数据和信息通过因特网传输。既减少了开发成本、也增加远程控制的灵活性,人们也不必再为了实现一个临时的远程控制,而需要重建一套远程控制系统。
基于Windows的远程控制软件开发毕业设计的主要任务是要求做出从系统角度的远程控制模式,并制作相应实用软件。
采用服务器(Server),客户端(Client)模式,使用Socket编程的基本原理及Windows的消息系统。实现基本的远程控制要求,界面新颖友好。用VC开发!
本课题的研究主要内容主要包括以下几个方面:
1.简单远程控制系统相关理论研究
2.简单远程控制系统总体结构
3.简单远程控制系统的功能模块的设计
4.简单远程控制系统功能模块的编程实现
1.4 作者的主要工作
该系统软件是本人与张桐瑞同学共同研究开发的,张桐瑞同学主要负责主控的设计与开发,本人主要负责被控端的设计与开发。
本人在系统开发中的具体工作:
1.搜寻与系统开发相关的资料,熟悉c++开发语言。
2.完成被控端与主控端的连接。
3.完成被控端模块的程序代码。
4.与张桐瑞同学一起对系统进行调试和测试。
5.归并相关系统开发文档,完成毕业论文的撰写。
2简单远程控制系统相关理论研究
本系统采用C/S工作模式,由主控端和被控端两部分组成,被控端作为客户端运行在目标计算机上,接收指令,根据指令执行相应的操作;主控端运行在用户计算机向被控端发送指令。编码上是利用c++进行编程,使用Microsoft Visual C++ 6.0 进行编译。
2.1 远程控制系统概述
远程控制系统是以通信技术为基础的一门先进技术。正是由于通信技术的发展使得远程控制技术得到快速的发展。所有的远程控制系统几乎都可以无一例外的划分为:被控端(主要负责控制过程的实施)、网络、主控端(借助远程数据访问控制过程,进行控制)、三个子系统的构成。各部分分工协作,共同实现对设备的远程控制。
在本软件设计中,采用典型的C/S结构,由客户端与服务端两部分构成。客
户/服务器模式的最显著特点是非对等作用,即客户相对于服务器处于不平等的地位,服务端提供服务,客户端提供请求。结构如图2.1结构图所示:
主控端
被控端
服务响应
网络接口
网络接口
网络
服务请求
图2.1结构图
2.2 Socket套接字
在远程控制软件中,对于主控机和受控机进行的数据通信所使用的主要技术就是网络编程技术和系统编程技术。
随着计算机网络技术的发展TCP/IP协议,被集成到操作系统内核中时,相当于在操作系统中引入了一种新型的输入/输出操作,操作系统拥护进程与网络的交互作用比用户进程与传统的输入/输出设备互相作用复杂的多。首先,进行网络操作的两个进程不在同机器上,如何建立它们之间的联系?其次,有很多种网络协议,如何建立一种通用机制以支持多种协议?这些都是网络应用变成所要解决的问题。
20世纪80年代初,美国政府的高级研究工程机构ARPA给加利福尼亚大学BERKELEY分校提供了奖金,让他们在UNIX操作系统下实现TCP/IP协议。在这个项目中,研究人员为TCP/IP网络通信开发了一个应用程序接口API。这个API就称为SOCKET(套接字)接口,今天SOCKET接口是TCP/IP网络最为通用的API,也是在INTERNET上进行应用开发最为通用的API。
实际上,Socket在计算机中提供了一个通信端口(套接口)。通过这个端口,一台计算机可以与任何一台具有Socket接口的计算机通信。通信的接口是套接口,一个套接口是通信的一端,在这一端上可以找到与其对应的一个名字。一个正在被使用的套接口都有他的类型和与其相关的进程,套接口存在于通信域中。一个套接口通常和同一个域中的套接口交换数据(数据交换也可以穿越域的界限,但这时一定要执行某种解释程序。)应用程序在网络上传输,接受的信息都是通过这个套接口来实现。在应用开发中就像使用文件句柄一样,可以对Socket句柄进行读写操作。
2.2.1系统调用
socket()函数向应用程序提供套接字手段时的声明如下:
SOCKET PASCAL FAR socket(int af, int type, int protocol);
该函数有三个参数,其中参数af指定通信发生的区域,在DOS,Windows系统中支持AF_INET,它时网际网区域。
参数type描述要建立套接字的类型。也就是指是流式套接字还是数据报套接字。参数protocol说明该套接字使用的协议,如果该参数为0,则表示使用默认的连接模式。
Socket()函数根据这三个参数建立一个套接字,并将相应的资源分配给它,同时返回一个整形套接字句柄。
2.2.2 指定本机地址
当一个套接字用socket()创建以后,bind()将套接字地址(主机地址和端口)与所创建的套接字编号联系起来,即将名字赋予套接字。bind()声明如下:
int PASCAL FAR bind(SOCKET s, const struct sockaddr FAR *name, int namelen);
bind()函数共有三个参数,其中参数s是由socket()函数调用返回的并且未连接的套接字句柄。
参数name是赋给套接字s的本地地址。参数namelen指参数name的长度,调用成功,返回0;否则返回SOCKET_ERROR。
2.2.3 建立套接字连接
建立套接字是要用connect()与accept()。connect()函数的原型声明如下:
int PASCAL FAR connect (SOCKET s,const struct sockaddr FAR *name,int namelen);
Connect()共有三个参数,其中s指要建立连接的本届套接字句柄。参数name指对方套接字地址结构的指针,对方套接字地址长度由参数namelen说明。如果调有成功,返回0;否则返回SOCKET_ERROR。
Accept()函数原型声明如下:
SOCKETPASCAL FAR accept(SOCKET s, struct sockaddr FAR *addr,int FAR*addrlen);
该函数也由三个参数,其中参数s为本地套接字句柄,在做accept函数调用的参数前要先调用listen(),参数addr是指向客户方套接字地址结构的指针,用来接收连接实体的地址。addr的确切格式由套接字创建时建立的地址簇决定。参数addrlen为客户方套接字地址的长度。
如果调用成功,accept()函数返回一个SOCKET类型的值。否则返回INVALID_SOCKET。
Socket(),bind(),connect(),accept()这四个套接字系统调用可以晚上一个完全的通信建立,包括协议,本地主机地址和端口,目的地址和端口。socket()指定协议元,他的用法与是否为客户机和服务器,是否面向连接无关,bind()指定本机地址和端口号,时面向连接的。在服务器方必须调用bind()函数;
2.2.4 监听连接
建立连接以后,服务器端要调用listen()函数,表明愿意接收连接,listen()要在accept()之前调用,原函数声明如下:
int PASCAL FAR listen(SOCKET s,int backlog);
该函数有两个参数,参数s标志一个本地已建立单尚未连接的套接字句柄,服务器愿意从它上面接收请求。参数backlog表示请求连接队列的最大长度,用于限制排队的请求个数,目前最大值为5。如果调用成功,listen()函数返回0;否则返回SOCKET_ERROR。
2.2.5 数据传输
当连接建立以后,就可以传输数据了,通常调用send()和recv()函数。
send()函数原型声明如下:
int PASCAL FAR send(SOCKET s,const char FAR *buf,int len,int flags);
共有四个参数,其中s为已经连接的本地套接字句柄。buf指向存有发送数据的缓冲区指针,长度有len指定。flags智利队传输控制方式,如是否发送带外数据等。如果调用成功,返回总发送的字节数;否则,返回SOCKET_ERROR。
Recv()函数调用用于在参数s指定的已经连接的数据报或流套接字上接收输入数据,原型声明如下:
Int PASCAL FAR recv(SOCKET s ,char FAR *buf, int len,int flags);
参数的意义同send();
2.2.6 关闭套接字
closesocket()关闭套接字s并释放分配给该套接字的资源,cosesocket()函数原型声明如下:
BOOLPASCAL FAR close socket(SOCKET s);
该函数只有一个参数s,指待关闭的套接字句柄。如果调用成功,返回0,否则返回SOCKET_ERROR。
2.3 客户端/服务器(C/S)模式
在TCP/IP网络应用中,通信的两个进程间相互作用的主要模式是客户机/服务器模式(Client/Server)。即客户向服务器发出服务请求,服务器接受到请求后,提供相应的服务。客户机/服务器模式的建立基于一下两点:首先,建立网络的起因是网络中软硬件资源,运算能力和信息不均等,需要共享,从而造就拥有众多资源的主机提供服务,资源较少的客户请求服务这一非对等作用;其次,网间进程通信完全是异步的,相互通信的进程见既不存在父子关系,又不共享内存缓冲区,因此需要一种机制为希望通信的进程间建立联系,为两者的数据交换提供同步,这就是基于客户机/服务器模式的TCP/IP。
2.4因特网协议
TCP是面向连接的通信协议,通过三次握手建立连接,通讯完成时要拆除连接,由于TCP是面向连接的所以只能用于端到端的通讯。
TCP提供的是一种可靠的数据流服务,采用“带重传的肯定确认”技术来实现传输的可靠性。TCP还采用一种称为“滑动窗口”的方式进行流量控制,所谓窗口实际表示接收能力,用以限制发送方的发送速度。
如果IP数据包中有已经封好的TCP数据包,那么IP将把它们向‘上’传送到TCP层。TCP将包排序并进行错误检查,同时实现虚电路间的连接。TCP数据包中包括序号和确认,所以未按照顺序收到的包可以被排序,而损坏的包可以被重传。
TCP将它的信息送到更高层的应用程序,例如Telnet的服务程序和客户程序。应用程序轮流将信息送回TCP层,TCP层便将它们向下传送到IP层,设备驱动程序和物理介质,最后到接收方。
面向连接的服务(例如Telnet、FTP、rlogin、X Windows和SMTP)需要高度的可靠性,所以它们使用了TCP。DNS在某些情况下使用TCP(发送和接收域名数据库),但使用UDP传送有关单个主机的信息。
TCP基础:数据传输协议允许创建和维护与远程计算机的连接。连接两台计算机就可彼此进行数据传输。
如果创建客户应用程序,就必须知道服务器计算机名或者 IP 地址(RemoteHost属性),还要知道进行“侦听”的端口(RemotePort 属性),然后调用Connect方法。
如果创建服务器应用程序,就应设置一个收听端口(LocalPort属性)并调用 Listen 方法。当客户计算机需要连接时就会发生ConnectionRequest事件。为了完成连接,可调用ConnectionRequest事件内的Accept方法。
建立连接后,任何一方计算机都可以收发数据。为了发送数据,可调用 SendData方法。当接收数据时会发生DataArriva事件。调用DataArrival事件内的GetData方法就可获取数据。
3简单远程控制系统总体结构
3.1 系统规格说明
3.1.1 简单远程控制系统的概貌
“简单远程控制系统的设计与实现”主要包含两个部分:主控端和被控端。主控端是运行在用户计算机上的一个程序,该端主要实现对被控端的控制,以实现对被控计算机关机、注销、重启以及向被控端发送消息等功能。
被控端是运行在目标计算机(被控计算机)上的一个程序,以提供该计算机的各种信息,以及提供实现主控端对其执行的各种操作。
3.1.2 各模块功能要求
本系统在功能要求上主要实现的功能有:主控端获取被控端计算机系统信息、对被控端鼠标和键盘的控制、对被控端的系统控制、对被控端的进程进行监控和控制以及对向被控端发送消息。
1.主控端获取被控端系统信息。此模块的主要功能是主控端能通过此功能了解到被控计算机上的系统信息,为后面进一步的对被控端进行控制作一个简单的了解,也同时通过此功能对被控计算机上所安装的软、硬件进行了解,做到对被控计算机的了解程度跟了解本机一样。
2. 对被控端鼠标和键盘的控制。此模块主要实现主控端对被控计算机的鼠标和键盘的控制,包括对键盘和鼠标的开启和关闭。
3.对被控端的系统控制。此模块主要实现对被控计算机的机器系统的控制,包括对被控计算机实施关闭计算机、重新启动被控端计算机以及注销被控端计算机目前使用的用户功能。并且可以通过cmd命令打开和关闭windows程序。做到使主控端用户在主控计算机上就能很容易的控制被控计算机的系统。
4.被被控端的进程进行监控和控制。此模块主要实现主控计算机对被控计算机的所有进程进行浏览和对一些进程进行杀死操作。有了此功能模块的简历,主控端用户可以在本机更清楚的了解被控计算机的系统运行详细信息。
5.向被控端发送信息。此模块主要实现主控计算机向被控计算机发送文字性消息的功能,有了此功能模块的建立,主控端用户可以在本机上向被控端用户传递信息和发送消息,做到了主控端的用户与被控端用户的联系。
3.1.3 性能要求
主控端界面应当简单、友好、方便使用和操作;被控端是用作运行在被控计算机内的可执行文件,为提高执行速度,从客户端发送到服务端的信息应尽量的少。主控端与被控端之间通过使用TCP协议建立连接,以实现对被控计算机的控制。
3.1.4 运行要求
设计出的简单远程控制软件应当在现在使用的大量操作系统上都能运行。例如:Windows 2000、Windows XP、Windows 2003;能在较低的硬件配置上运行,如128M的内存,AMD 1800+的处理器。
3.2 数据要求
简单远程控制系统的结构中,主控端是相当于一个系统的前台,为用户提供了一个操作界面,而几乎所有的操作都是在被控端这个后台处理程序运行的,被控端界面提供的操作可分为运行和动作两个模块。运行模块是在被控端运行的,动作模块作为远程控制系统的核心,是在主控端运行实现的。
3.3 用户系统描述
首先设置被控计算机为被控端,被控端运行被控端文件,被控端操作完毕。之后主控端通过打开主控端程序进入主控端界面,输入被控端计算机的IP地址点击获取信息,出现被控端信息。被控端连接成功后,在主控端进行控制操作,被控端便可以在主控计算机发出的各种操作命令下完成相应操作。
4 简单远程控制系统的功能模块的设计
4.1 简单远程控制系统的主体设计
被控端窗口设计为输入主控计算机IP地址,连接主控端计算机的窗口,连接成功后自动进入托盘中,使被控计算机桌面很洁净,也体现出一些隐藏性。
流程图如图4.1系统流程图所示:
图4.1系统流程图
4.2 简单远程控制系统的系统功能的实现
简单远程控制通信系统的各类控制指令数据传输采用的是因特网通道,控制质量数据传输是基于因特网远程控制系统的关键。我们主要以TCP/IP协议上的通信为基础,使用C/S模型来解决控制数据的通信问题。我们在通信系统上的设计是采用WINSOCK,我们按客户/服务器模型来设计基于因特网的远程控制指令数据通信技术。WINSOCK通信系统采用的控制模式有两种方式,一个是多对一,即多个客户可以同时向服务器请求服务,而服务器也能够同时对这些请求给予相信处理。服务器负责控制控制质量的接受和处理。而客户则是控制指令数据的发送和状态数据的接受和显示,另一个一对多,既一个客户可以同时向多个服务器发送请求服务,而服务器也能够对这些请求给予相信处理。服务器负责控制控制指令的接受和处理,而客户则是控制指令的发送和状态数据的接受和显示。主控端与被控端的连接的系统结构图如图4.2功能结构层次图所示:
主
控
端
输入ip
与被控端连接成功
获取信息
鼠标控制
执行CMD
键盘控制
进程控制
图4.2 功能结构层次图
5 简单远程控制系统功能模块的编程及实现
以上介绍了远程控制软件编写的一些理论基础,下面介绍一下我们编写的一款远程控制软件所实现的功能,并对其所编程原理进行了剖析。这款软件同大多数远程控制软件一样有两部分组成:包含getinfo.exe和winlgon.exe两个程序,winlgon.exe是服务程序,是安装在与你联网的电脑里(就是被维护或者被控制的电脑),如果要进行控制,就必须在对方的电脑里运行winlgon.exe;getinfo.exe是客户端程序,安装在你自己的电脑里,如果要对对方电脑进行控制]时,就启动客户程序,并可以通过getinfo.exe程序界面的彩旦控制装有winlgon..exe程序的电脑(就是被维护或者被控制的电脑)。
5.1 简单远程控制的连接功能实现
被控端程序是远程控制软件的主体。远程控制软件的具体功能都是在被控制端实现的,主控端只负责传送要执行的命令和显示返回的结果。而几乎所有的操作控制都时在被控端本地实现的。远程控制的被控端要求自动运行,同时还应该要具有一定的隐藏性,不容易被客户端用户发现和关闭,当然,这要在Window任务管理器里看不到。
程序代码如下:
#define HKCU HKEY_CURRENT_USER//屏蔽任务管理器(注册表信息)
LPCTSTR KEY_DisableTaskMgr =
"Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\System";
LPCTSTR VAL_DisableTaskMgr = "DisableTaskMgr";
其中通过修改注册表HKEY_CURRENT_USER中的数值,屏蔽任务管理器等系统热键。
服务器端socket自一开始运行就一直保持侦听状态,等待来自客户端的连接。
5.2 简单远程控制的被控端获取信息的实现
此模块的主要功能是主控端能通过此功能了解到被控计算机上的系统信息,为后面进一步的对被控端进行控制作一个简单的了解,也同时通过此功能对被控计算机上所安装的软、硬件进行了解,做到对被控计算机的了解程度跟了解本机一样。
这部分的功能主要是通过GetInformation()函数实现的主要代码如下:
int CMainFrame::GetInformation()//获取信息
{
pThreadSendFile=::AfxBeginThread(_ReturnInformationThread,this); //开始传送文件线程
return 0;
}
主控端发送获取信息的命令后,启动*pThreadInformation线程查询被控端本机的基本机器信息,并且开启*pThreadReturnInformation线程向主控端发送本机的基本信息,通过socket套接口sockClient.Send(strMsg,strMsg.GetLength())命令向主控端返回如图5.1被控端基本信息的被控端基本信息。
图5.1被控端基本信息
5.3 简单远程控制的向被控端发送消息的实现
此模块主要实现主控计算机向被控计算机发送文字性消息的功能,有了此功能模块的建立,主控端用户可以在本机上向被控端用户传递信息和发送消息,做到了主控端的用户与被控端用户的联系。
这部分的代码是在主控端实现的,通过线程 _SendMsgThread,调用SetWindowText函数指定对话窗口,SetWindowText是一个Windows API函数。该函数改变指定窗口的标题栏的文本内容(如果窗口有标题栏)。如果指定窗口是一个控件,则改变控件的文本内容。
通过pDlg->GetDlgItem(IDC_SDMSG)->SetWindowText("")命令将信息发送到被控端进行处理。
通过网络,主控端向被控端发送信息并被显示在一个特定的窗口,如图5.2主控端显示是在主控端对话框显示的信息
图5.2主控端显示
而在被控端会弹出一个对话框,显示主控端发送的消息
图5.3被控端显示信息
5.4 简单远程控制的被控端键盘和鼠标的开启和锁定的实现
此模块主要实现主控端对被控计算机的鼠标和键盘的控制,包括对键盘和鼠标的开启和关闭。
钩子(Hook),是Windows消息处理机制的一个平台,应用程序可以在上面设置子程以监视指定窗口的某种消息,而且所监视的窗口可以是其他进程所创建的。当消息到达后,在目标窗口处理函数之前处理它。钩子机制允许应用程序截获处理window消息或特定事件。
钩子实际上是一个处理消息的程序段,通过系统调用,把它挂入系统。每当特定的消息发出,在没有到达目的窗口前,钩子程序就先捕获该消息,亦即钩子函数先得到控制权。这时钩子函数即可以加工处理(改变)该消息,也可以不作处理而继续传递该消息,还可以强制结束消息的传递。
我们在此功能模块中主要用到了WH_KEYBOARD_LL和WH_MOUSE_LL两个低级钩子也就是低级鼠标钩子和低级键盘钩子。由于WH_KEYBOARD和WH_MOUSE两个鼠标和键盘的钩子只能监视所在模块的事件,不能监视整个系统的事件,所以用鼠标和键盘的WH_KEYBOARD_LL和WH_MOUSE_LL两个低级钩子可以监视整个系统的鼠标和键盘事件。
其中我们还用到了回调函数
LRESULT CALLBACK LowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam) {
return true;
}
LRESULT CALLBACK 它们其实是宏,表示函数的返回类型,你可以在VC里面对它们点右键然后Go To Definition看到它的宏定义。
其实,这就表示了WinProg函数是一个回调函数。在MFC中,得到Message消息以后系统会进行回调,当然,我们需要编写一个回调函数来响应。为了区别于其它函数,在回调函数前加上LRESULT CALLBACK在微软vc提供的头文件中有定义 在winnt.h中typedef long LONG; 在windef.h中typedef LONG LRESULT; 所以LRESULT就是long,也就是长整形
之所以取名类LRESULT,L=>long result表示结果,说明这个函数的返回值是某个结果
此功能通过LowLevelKeyboardProc、onkey和lockkey三个函数实现的,实际上通过LockOrUnLockMouse和LockOrUnLockKey两个变量来修改被控端注册表信息来实现对鼠标和键盘的控制。
首先定义服务器端的键盘注册表键值KEY_DisableTaskMgr
客户端要向服务器端发送消息“K”,服务器初始设置LockOrUnLockKey为true,收到“K”并判断出后,设置keymouse为true,开始进程_LockKey;在函数里调用PostMessage(pDlg->GetSafeHwnd(),STATUS_MESSAGE,0,0);用GetSafeHwnd打开安全窗口,将消息传递给STATUS_MESSAGE,然后调用Onkey函数进行具体操作:
如果KeyMouse和LockOrUnLockKey为TRUE时,用RegOpenKey函数打开注册表键KEY_DisableTaskMgr,然后RegSetValueEx修改VAL_DisableTaskMgr键值为1,LockOrUnLockKey取反。
具体代码如下:
if(KeyMouse)
{
if(LockOrUnLockKey)
{
hhkLowLevelKybd2000= SetWindowsHookEx(WH_KEYBOARD_LL,LowLevelKeyboardProc,AfxGetApp()->m_hInstance,0);
HKEY hk;
if(RegOpenKey(HKCU, KEY_DisableTaskMgr,&hk)!=ERROR_SUCCE
展开阅读全文