毕业设计(论文)网络虚拟实验平台的构建与测试_第1页
毕业设计(论文)网络虚拟实验平台的构建与测试_第2页
毕业设计(论文)网络虚拟实验平台的构建与测试_第3页
毕业设计(论文)网络虚拟实验平台的构建与测试_第4页
毕业设计(论文)网络虚拟实验平台的构建与测试_第5页
已阅读5页,还剩18页未读 继续免费阅读

下载本文档

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

文档简介

PAGE网络虚拟实验平台的构建与测试摘要基于网络的虚拟实验平台是在能够进行网络通信的基础之上将计算机上虚拟的各种仪器、器件,按实验要求组装成一个完整的实验环境,实现搭接实验电路,演示实验过程等功能。远程指导模块是其中的一个功能模块。它分成指导端和被指导端两部分,指导端通过HOOK技术,采集本地机鼠标和键盘信息;然后将这些信息打包,通过P2P网络通信机制将信息包传给被指导端;在被指导端将信息包信息解出,通过mouse_event、keybd_event等函数去控制被指导端的鼠标、键盘动作,实现相关的一些远程指导动作。本模块在VC环境下开发,用到了WindowsSocket编程技术,P2P编程思想,HOOK技术,多线程技术等多方面的技术。由于整个系统模块很多,本设计中编写了独立的测试程序,经过测试基本达到预期的设计目标。关键词:远程指导;P2P;WindowsSocket编程;HOOK;多线程DesignandImplementationofRemoteGuidanceModuleBasedonNetworkVirtualExperimentPlatformAbstractUnderthefoundationofnetworkcommunications,thenetwork-basedVirtualExperimentalPlatformcouldintegratevariouscomputervirtualdevicesintoacompleteexperimentalenvironmentaccordingtotheexperimentrequirements,andconnecttheexperimentcircuitanddemonstratetheprocessofexperiment.Theremoteguidingmodulewasoneoffunctionmodules,whichwasdividedintoguidingendandtheguidedend.WithHOOK,theguidingendcapturedtheinformationoflocalmouseandkeyboard,andpackedtheinformationtosendtotheguidedpartthroughpeer-to-peernetworkcommunicationmechanism.Theguidedendwillunpacktheinformation,andcontrolthemouseandkeyboardoftheguidedendbymouse_event,keybd_eventfunctionstoimplementsomeremotecontrolactions.DevelopedunderVCenvironment,theremoteguidancemoduleusedWindowsSocketprogrammingtechnology,P2Pprogrammingideas,HOOKtechnology,multithreadingtechnology,andetc.Becausetherearemanymodulesforthewholesystem,anindependenttestingprocedurewasprogrammedtotestthemodules,whichhadbeenproventoachievethedesiredobjectivesKeywords:Remoteguidance;Peer-to-Peer;WindowsSocketprogramming;HOOK;Multithreading目录论文总页数:23页1引言 1项目背景 1项目介绍 11.2.1基于网络的虚拟实验平台 11.2.2远程指导模块 21.3项目要求 21.3.1功能要求 21.3.2Client/Server(客户端/服务器)结构工作过程 22网络基础知识简介 32.1OSI与TCP/IP参考模型的对应关系 32.1.1OSI参考模型 32.1.2TCP/IP参考模型 42.2WindowsSocket编程原理及操作步骤 52.3P2P网络介绍 83相关函数分析与代码实现 8多线程 83.1.1进程介绍 83.1.2线程介绍 83.1.3进程与线程的关系 93.1.4多线程实现 93.2Hook技术 93.2.1Hook函数简介及类型 93.2.2Hook子过程处理 123.2.3Hook的安装/卸载 133.3设计流程及函数思想 153.3.1简述 153.3.2代码分析 154程序测试与相应改进 184.1程序界面 18程序相关测试 194.2.1获取对方相关信息 19发送消息及存贮 19被指导端显示信息 204.3相关改进 20结论 20参考文献 21第19页共23页1引言 近年来,随着信息技术的发展,计算机的普及,网络为我们带了更多的便利。网络技术的发展,引发了控制领域的深刻技术变革,控制系统结构沿着网络化方向与控制系统体系沿着开放性方向发展将是控制系统技术创新的大潮流。计算机局域网络、企业网络、现代信号处理等等使自动化系统与工业控制系统从体系结构、控制方法、产品系列、人机协作方法等都发生了重大的变化。进入21世纪的控制系统以网络为主要特征:一方面是在自动化与工业控制中需要更深层次地渗透通信与网络技术,另一方面是在通信网络的管理与控制中也要求更多的采用控制理论与策略并且由于系统中需要大量的数据交换,服务器的负担很重,所以我们就研究出了基于网络的虚拟实验平台。作为基于网络的虚拟实验平台的远程指导模块,本文通过WindowsSocket编程,以HOOK技术,多线程技术作为基础,再利用其他的API函数来实现被指导端对指导端发送请求信息,将信息打包以后通过网络传输到服务器端,指导端收到信息以后,将信息解包,根据信息提示来对被指导端进行相关指导:获取客户的相关信息、锁定鼠标和键盘,对鼠标进行动态的控制和指导键盘的信息输入。项目背景全球信息化的发展,计算机网络给我们提供了优越的通信平台,优秀的软件系统必须要具有网络功能。虚拟实验平台正是应这个大需求而诞生。并且随着信息技术的发展,网络无疑为我们带了更多的便利,同时一个优秀的系统必须要具有网络功能,要完成这些功能,那就要把各种网络通过某种方式连接起来,在网络实现过程中存在穿透NAT的问题,此问题存在较长时间,后来因为网络地址不够而产生了P2P技术,伴随着P2P技术的出现,利用UDP实现P2P网络穿越NAT的即时通讯技术,而问题即被解决。项目介绍基于网络的虚拟实验平台计算机技术、大规模集成电路技术和通讯技术的飞速发展,为虚拟实验的发展奠定了坚实的基础。虚拟实验就是在通用计算机上加载相应的软件或硬件,使得使用者在操作这台计算机时,就像是在操作一台专用的传统试验设备一样。在虚拟实验系统中,软件是整个系统的关键,任何使用者都可以通过软件的相关设置来达到要实现实验的效果。虚拟实验就是利用外部输入(如鼠标的点击、拖动和键盘的敲击等),将计算机上虚拟的各种仪器,按实验要求、过程,组装成一个完整的实验环境,同时在这个环境中完成实验操作,包括实验器材的添加、实验条件的改变、数据采集以及实验结果的模拟、分析。它包含了虚拟仿真技术、计算机技术、实验技术、网络技术与专业等多方面理论知识。远程指导模块远程指导模块是基于网络的虚拟实验平台的一个通信模块,是基于WindowsSocket编程,使用Client/Server(客户端/服务器)结构来实现模块的功能,以VC为开发环境,同时以HOOK技术和多线程技术作为基础,再利用API相关函数来实现指导端和被指导端的互动。1.3项目要求功能要求完成远程指导的基本功能,指导端和被指导端能够进行P2P网络通信,指导端能够控制被指导端的鼠标和键盘,并且能够存储相关信息,还能够对鼠标进行动态控制和指导键盘的输入。1.Client/Server(客户端/服务器)结构工作过程Client/Server(客户端/服务器)结构,通过将任务合理分配到Client端和Server端,降低了系统的通讯开销,可以充分利用两端硬件环境的优势,在TCP/IP网络应用中,通信的两个进程间相互作用的主要模式是客户机/服务器模式(client/server),即客户向服务器提出请求,服务器接收到请求后,提供相应的服务。客户机/服务器模式的建立基于以下两点:首先,建立网络的起因是网络中软硬件资源、运算能力和信息不均等,需要共享,从而造就拥有众多资源的主机提供服务,资源较少的客户请求服务这一非对等作用。其次,网络之间进程通信完全是异步的,相互通信的进程间既不存在父子关系,又不共享内存缓冲区,因此需要一种机制为希望通信的进程间建立联系,为二者的数据交换提供同步,这就是基于客户机/服务器模式的TCP/IP:客户机/服务器模式在操作过程中采取的是主动请求的方式。首先服务器方要先启动,并根据请求提供相应的服务:打开一个通信通道并告知本地主机,它愿意在某一地址和端口上接收客户请求。等待客户请求到达该端口。接收到重复服务请求,处理该请求并发送应答信号。接收到并发服务请求,要激活一个新的进程(或线程)来处理这个客户请求。新进程(或线程)处理此客户请求,并不需要对其它请求做出应答。服务完成后,关闭此新进程与客户的通信链路,并终止。返回第二步,等待另一客户请求,关闭服务器。客户方:打开一个通信通道,并连接到服务器所在主机的特定端口。向服务器发送服务请求报文,等待并接收应答;继续提出请求。请求结束后关闭通信通道并终止。2网络基础知识简介OSI与TCP/IP参考模型的对应关系OSI参考模型国际标准化组织(ISO)开发了开放式系统互联(OSI)参考模型,以促进计算机系统的开放互联。开放式互联就是可在多个厂家的环境中支持互联。该模型为计算机间开放式通信所需要定义的功能层次建立了全球标准。OSI模型将通信会话需要的各种进程划分成7个相对独立的功能层次,这些层次的组织是以在一个通信会话中事件发生的自然顺序为基础的。表1描述了OSI,1-3层提供了网络访问,4-7层用于支持端端通信。1、物理层是OSI模型的最低层,它建立在物理通信介质的基础上,规定了机械的、电气的功能;该层负责建立、保持和拆除物理链路;规定如何在此链路上传送原始比特流;比特如何编码,使用的电平,极性,连接插头插座的插脚如何分配等。所以在物理层数据的传送单位是比特(bit)。2、数据链路层它把相邻两个节点间不可靠的物理链路变成可靠的无差错的逻辑链路,包括把原始比特流分帧(frame)、顺序、排序、设置检错、确认、重发、流控等功能;数据链路层传动信息的单位是frame,每帧(frame)包括一定数量的数据和一些必要的控制信息,在每帧(frame)的控制信息中,包括同步信息、地址信息、流量信息等;同物理层相似,数据链路层负责建立、维护和释放数据链路。3、网络层,它连接网络中任何两个计算机点,从一个节点上接收数据,正确的传送到另一个节点;在网络层,传送的信息单位是分组或包(packet)。网络层的主要任务是要选择合适的路由和交换节点,透明地向目的站交付发送站所发的分组或包,这里的透明表示收发两端好像是直接连通的,另外网络层还要解决网络互连、拥挤控制等问题。上述三层组成了所谓的通信子网,用户计算机连接到此子网上。通信子网负责把一个地方的数据可靠地传送到另一个地方,但并未实现两个地方主机上进行进程之间的通信,通信子网的主要功能是面向通信的。4、传输层上真正地实现了端对端通信,把数据可靠地从一方的用户进程或程序送到另一方的用户进程或程序。这一层的控制通常由通信两端的计算机完成。中间节点一般不提供这一层的服务,这一层的通信与通信子网无关。从这一层开始的以上各层全部是针对通信的最终的源端目的端计算机的进程之间的。传输层传送的信息单位是报文(message)。传输层向上一层提供一个可靠的端一端服务,使上一层看不见下面几层的通信细节。正因为如此,传输层成为网络体系结构中关键的一层,对于传输层的功能,主要在主机内实现。而对于物理层、数据链路层以及网络层的功能均能在报文接口机中实现。对于传输层之上的各个层次的功能通常在主机中实现。5、会话层又称对话层会话层允许两个计算机上的用户进程建立对话连接,双方相互确认身份,协商对话连接的细节;它可管理对话是双向同时进行的,还是任何时刻只能一个方向进行。在后一种情况下,对话层控制哪一方有权发送数据;对话层还提供同步机制,在数据流中插入同步点机制,在每次网络出现故障后可以仅重传最近一个同步点以后的数据,而不必从头开始。以上两层为两个计算机上的用户进程或程序之间提供了正确传送数据的手段。6、表示层主要解决用户信息的语法表示问题。表示层将数据从适合于某一系统的语法转变为适合于OSI系统内部使用的语法。具体地讲,表示层对传送的用户数据进行翻译、编码和变换,使得不同类型的机器对数据信息的不同表示方法可以相互理解。7、应用层主要处理资源可用性和安全问题,它包含了大量人们普遍需要的协议,如FTP、TELNET、HTTP、SMTP等。最近几年,应用层协议发展很快,出现了很多新的应用,如ICQ、Multimediastream等。TCP/IP参考模型与OSI参考模型不同,TCP/IP模(表2)更侧重于互联设备间的数据传送,而不是严格的功能层次划分。它通过解释功能层次分布的重要性来做到这点,但仍为设计者具体实现协议留下很大的余地。因此,OSI参考模型在解释互联网络通信机制比较适合,但TCP/IP成为了互联网络协议的市场标准。TCP/IP老-模型是在它所解释的协议出现很久以后才发展起来的,更重要的是,在于它更强调功能分布而不是严格的功能层次的划分,因此它比OSI模型更灵活。1应用层应用层包括SMTP,FTP,HTTP,NFS,NIS,LPD,TelnetfIIRemoteLogin应用层包括一些服务,这些服务在OSI中由独立的三层实现。这些服务是和用户相关的认证、数据处理以及压缩。包括电子邮件、浏览器、Telnet以及其他的Internet应用。2传输层传输层包括TCP(TransportControlProtocol,传输控制协议)和UDP(UserDatagramProtocol,用户数据报协议)。UDP几乎不进行检查,而TCP提供传输保证。与OSI中传输层不一样,TCP不保证报文的准确传输。TCP为两台主机提供高可靠性的数据通信。而另一方面,UDP则为应用层提供一种非常简单的服务,它只是把称作数据报的分组从一台主机发送到另一台主机,但并不保证该数据报能到达另一端。任何必需的可靠性必须由应用层来提供。3网络层TCP/IP协议族中,网络层由以下协议组成:ICMP(Internt联网托制报文协议)、IP(网际协议)、IGMP(Internet组管理协议)、RIP,OSPF和路由的EGP网络层处理报文的路由管理。4链路层链路层包括ARP和RARP,负责报文传输。链路层管理网络的连接并提供网络上的报文输入/输出。表1OSI模型0SI参考模型层次描述OSI层次号应用层7表示层6会话层5传输层4网络层3数据链路层2物理层1表2TCP/IP模型TCP/IP参考模型层次描述TCP/IP层次号应用层4传输层3网络层2数据链路层1

2.2WindowsSocket编程原理及操作步骤WindowsSockets是MicrosoftWindows的网络程序设计接口,它是从BerkeleySockets扩展而来的,以动态链接库的形式提供给我们使用。WindowsSockets在继承了BerkeleySockets主要特征的基础上,又对它进行了重要扩充。这些扩充主要是提供了一些异步函数,并增加了符合Windows消息驱动特性的网络事件异步选择机制。和BerkeleySockets都是基于TCP/IP协议的;WindowsSockets2从发展而来,与协议无关并向下兼容,可以使用任何底层传输协议提供的通信能力,来为上层应用程序完成网络数据通讯,而不关心底层网络链路的通讯情况,真正实现了底层网络通讯对应用程序的透明。流式套接字(SOCK_STREAM)提供面向连接、可靠的数据传输服务,数据无差错、无重复的发送,且按发送顺序接收。数据报式套接字(SOCK_DGRAM)提供无连接服务。数据包以“独立包”形式发送,不提供无错保证,数据可能丢失或重复,并且接收顺序混乱。原始套接字(SOCK_RAW)。基于TCP(面向连接)的socket编程:服务器端程序:1、创建套接字(socket)。 2、将套接字绑定到一个本地地址和端口上(bind)。3、将套接字设为监听模式,准备接收客户请求(listen)。4、等待客户请求到来;当请求到来后,接受连接请求,返回一个新的对应于此次连接的套接字(accept)。5、用返回的套接字和客户端进行通信(send/recv)。6、返回,等待另一客户请求。7、关闭套接字。客户端程序:1、创建套接字(socket)。 2、向服务器发出连接请求(connect)。3、和服务器端进行通信(send/recv)。4、关闭套接字。基于UDP(面向无连接)的socket编程:服务器端(接收端)程序:1、创建套接字(socket)。 2、将套接字绑定到一个本地地址和端口上(bind)。3、等待接收数据(recvfrom)。4、关闭套接字。客户端(发送端)程序:1、创建套接字(socket)。 2、向服务器发送数据(sendto)。3、关闭套接字。相关函数说明;intbind(SOCKETs,conststructsockaddrFAR*name,intnamelen);这个函数接收三个参数。第一个参数s指定要绑定的套接字,第二个参数指定了该套接字的本地地址信息,是指向sockaddr结构的指针变量,由于该地址结构是为所有的地址家族准备的,这个结构可能(通常会)随所使用的网络协议不同而不同,所以,要用第三个参数指定该地址结构的长度。sockaddr结构定义如下:structsockaddr{u_shortsa_family;charsa_data[14];};sockaddr的第一个字段sa_family指定该地址家族,在这里必须设为AF_INET。sa_data仅仅是表示要求一块内存分配区,起到占位的作用,该区域中指定与协议相关的具体地址信息。由于实际要求的只是内存区,所以对于不同的协议家族,用不同的结构来替换sockaddr。除了sa_family外,sockaddr是按网络字节顺序表示的。在TCP/IP中,我们可以用sockaddr_in结构替换sockaddr,以方便我们填写地址信息。sockaddr_in的定义如下:structsockaddr_in{shortsin_family;unsignedshortsin_port;struct

in_addrsin_addr;charsin_zero[8];};其中,sin_family表示地址族,对于IP地址,sin_family成员将一直是AF_INET。成员sin_port指定的是将要分配给套接字的端口。成员sin_addr给出的是套接字的主机IP地址。而成员sin_zero只是一个填充数,以使sockaddr_in结构和sockaddr结构的长度一样。如果这个函数调用成功,它将返回0。如果调用失败,这个函数就会返回一个SOCKET_ERROR,错误信息可以通过WSAGetLastError函数返回。将IP地址指定为INADDR_ANY,允许套接字向任何分配给本地机器的IP地址发送或接收数据。多数情况下,每个机器只有一个IP地址,但有的机器可能会有多个网卡,每个网卡都可以有自己的IP地址,用INADDR_ANY可以简化应用程序的编写。将地址指定为INADDR_ANY,允许一个独立应用接受发自多个接口的回应。如果我们只想让套接字使用多个IP中的一个地址,就必须指定实际地址,要做到这一点,可以用inet_addr()函数,这个函数需要一个字符串作为其参数,该字符串指定了以点分十进制格式表示的IP地址(如6)。而且inet_addr()函数会返回一个适合分配给S_addr的u_long类型的数值。inet_ntoa()函数会完成相反的转换,它接受一个in_addr结构体类型的参数并返回一个以点分十进制格式表示的IP地址字符串。P2P网络介绍P2P技术源于局域网共享,其目标是改变人们通过服务器中转交换文件的传统方式,达到自由交换资源的目的。IBM为P2P下了如下定义:系统由若干互联协作的计算机构成,且至少具有如下特征之一:系统依存于边缘化(非中央式服务器)设备的主动协作,每个成员直接从其他成员而不是从服务器的参与中受益;系统中成员同时扮演服务器与客户端的角色;系统应用的用户能够意识到彼此的存在,构成一个虚拟或实际的群体。P2P网络是互联网整体架构的基础,互联网中最基本的TCP/IP协议并没有客户端和服务器的概念,在通讯过程中,所有的设备都是平等的一端。P2P技术改变了“内容”所在的位置,使其正在从“中心”走向“边缘”,也就是说不再如C\S模式将内容存于主要的服务器上,而是存在所有用户的PC机上。广义的P2P网络将P2P网络划分为纯分散式P2P网络(如gnutella模型)、超级结点式网络和混合式P2P网络等大类。3相关函数分析与代码实现3.1多线程3.1.1进程介绍进程:通常被定义为一个正在运行的程序的实例,是一个程序在其自身的地址空间中的一次执行活动。进程是资源申请、调度和独立运行的单位,因此,它使用系统中的运行资源;而程序不能申请系统资源,不能被系统调度,也不能作为独立运行的单位,因此,它不占用系统的运行资源进程由两个部分组成:1、操作系统用来管理进程的内核对象。内核对象也是系统用来存放关于进程的统计信息的地方。2、地址空间。它包含所有可执行模块或DLL模块的代码和数据。它还包含动态内存分配的空间。如线程堆栈和堆分配空间。3.1.2线程介绍线程由两个部分组成:1、线程的内核对象,操作系统用它来对线程实施管理。内核对象也是系统用来存放线程统计信息的地方。2、线程堆栈,它用于维护线程在执行代码时需要的所有参数和局部变量。当创建线程时,系统创建一个线程内核对象。该线程内核对象不是线程本身,而是操作系统用来管理线程的较小的数据结构。可以将线程内核对象视为由关于线程的统计信息组成的一个小型数据结构。线程总是在某个进程环境中创建。系统从进程的地址空间中分配内存,供线程的堆栈使用。新线程运行的进程环境与创建线程的环境相同。因此,新线程可以访问进程的内核对象的所有句柄、进程中的所有内存和在这个相同的进程中的所有其他线程的堆栈。这使得单个进程中的多个线程确实能够非常容易地互相通信。进程与线程的关系进程是不活泼的。进程从来不执行任何东西,它只是线程的容器。若要使进程某操作,它必须拥有一个在它的环境中运行的线程,此线程负责执行包含在进程的地址空间中的代码。单个进程可能包含若干个线程,这些线程都“同时”执行进程地址空间中的代码。每个进程至少拥有一个线程,来执行进程的地址空间中的代码。当创建一个进程时,操作系统会自动创建这个进程的第一个线程,称为主线程。此后,该线程可以创建其他的线程。3.1.4多线程实现线程只有一个内核对象和一个堆栈,保留的记录很少,因此所需要的内存也很少。因为线程需要的开销比进程少,因此在编程中经常采用多线程来解决编程问题,而尽量避免创建新的进程。Hook技术3.2.1Hook函数简介及类型Hook(钩子)是WINDOWS提供的一种消息处理机制,是指在程序正常运行中接受信息之前预先启动的函数,用来检查和修改传给该程序的信息,(钩子)实际上是一个处理消息的程序段,通过系统调用,把它挂入系统。每当特定的消息发出,在没有到达目的窗口前,钩子程序就先捕获该消息,亦即钩子函数先得到控制权。这时钩子函数即可以加工处理(改变)该消息,也可以不作处理而继续传递该消息,还可以强制结束消息的传递。安装钩子函数将会影响系统的性能。监测“系统范围事件”的系统钩子特别明显。因为系统在处理所有的相关事件时都将调用您的钩子函数,这样系统将会明显的减慢。HOOK链WINDOWS提供了14种不同类型的HOOKS,不同的HOOK可以处理不同的消息。例如:WH_MOUSEHOOK用来监视鼠标消息。WINDOWS为这几种HOOKS维护着各自的HOOK链表。HOOK链表是一串由应用程序定义的回调函数(CALLBACKFunction)队列,当某种类型的消息发生时,WINDOWS向此种类型的HOOK链的第一个函数(HOOK链的顶部)发送该消息,在第一函数处理完该消息后由该函数向链表中的下一个函数传递消息,依次向下。如果链中某个函数没有向下传送该消息,那么链表中后面的函数将得不到此消息。(对于某些类型的HOOK,不管HOOK链中的函数是否向下传递消息,与此类型HOOK联系的所有HOOK函数都会收到系统发送的消息)一些Hook子过程可以只监视消息,或者修改消息,或者停止消息的前进,避免这些消息传递到下一个Hook子过程或者目的窗口。最近安装的钩子放在链的开始,而最早安装的钩子放在最后,也就是后加入的先获得控制权。HOOK的作用范围两种类型:局部和远程一、局部钩子仅钩挂您自己进程的事件。二、远程的钩子还可以将钩挂其它进程发生的事件。远程的钩子又有两种:1、基于线程的它将捕获其它进程中某一特定线程的事件。简言之,就是可以用来观察其它进程中的某一特定线程将发生的事件。2、系统范围的将捕捉系统中所有进程将发生的事件消息。HOOK类型Windows共有14种HOOKS,每一种类型的Hook可以使应用程序能够监视不同类型的系统消息处理机制。下面描述所有可以利用的Hook类型的发生时机。(这些常数值均可以API浏览器里查到)1、WH_CALLWNDPROC和WH_CALLWNDPROCRETHooksWH_CALLWNDPROC和WH_CALLWNDPROCRETHooks使你可以监视发送到窗口过程的消息。系统在消息发送到接收窗口过程之前调用WH_CALLWNDPROCHook子过程,并且在窗口过程处理完消息之后调用WH_CALLWNDPROCRETHook子过程。WH_CALLWNDPROCRETHook传递指针到CWPRETSTRUCT结构,再传递到Hook子过程。CWPRETSTRUCT结构包含了来自处理消息的窗口过程的返回值,同样也包括了与这个消息关联的消息参数。2、WH_CBTHook在以下事件之前,系统都会调用WH_CBTHook子过程,这些事件包括:1.激活,建立,销毁,最小化,最大化,移动,改变尺寸等窗口事件;2.完成系统指令;3.来自系统消息队列中的移动鼠标,键盘事件;4.设置输入焦点事件;5.同步系统消息队列事件。Hook子过程的返回值确定系统是否允许或者防止这些操作中的一个。3、WH_DEBUGHook在系统调用系统中与其它Hook关联的Hook子过程之前,系统会调用WH_DEBUGHook子过程。你可以使用这个Hook来决定是否允许系统调用与其它Hook关联的Hook子过程。4、WH_FOREGROUNDIDLEHook当应用程序的前台线程处于空闲状态时,可以使用WH_FOREGROUNDIDLEHook执行低优先级的任务。当应用程序的前台线程大概要变成空闲状态时,系统就会调用WH_FOREGROUNDIDLEHook子过程。5、WH_GETMESSAGEHook应用程序使用WH_GETMESSAGEHook来监视从GetMessageorPeekMessage函数返回的消息。你可以使用WH_GETMESSAGEHook去监视鼠标和键盘输入,以及其它发送到消息队列中的消息。6、WH_JOURNALPLAYBACKHookWH_JOURNALPLAYBACKHook使应用程序可以插入消息到系统消息队列。以使用这个Hook回放通过使用WH_JOURNALRECORDHook记录下来的连续的鼠标和键盘事件。WH_JOURNALPLAYBACKHook已经安装,正常的鼠标和键盘事件就是无效的。WH_JOURNALPLAYBACKHook是全局Hook,它不能像线程特定Hook一样使用。WH_JOURNALPLAYBACKHook返回超时值,这个值告诉系统在处理来自回放Hook当前消息之前需要等待多长时间(毫秒)。这就使Hook可以控制实时事件的回放。WH_JOURNALPLAYBACK是system-widelocalhooks,它们不会被注射到任何行程地址空间。7、WH_JOURNALRECORDHookWH_JOURNALRECORDHook用来监视和记录输入事件。典型的,可以使用这个Hook记录连续的鼠标和键盘事件,然后通过使用WH_JOURNALPLAYBACKHook来回放。WH_JOURNALRECORDHook是全局Hook,它不能像线程特定Hook一样使用。WH_JOURNALRECORD是system-widelocalhooks,它们不会被注射到任何行程地址空间。8、WH_KEYBOARDHook在应用程序中,WH_KEYBOARDHook用来监视WM_KEYDOWNandWM_KEYUP消息,这些消息通过GetMessageorPeekMessagefunction返回。可以使用这个Hook来监视输入到消息队列中的键盘消息。9、WH_KEYBOARD_LLHookWH_KEYBOARD_LLHook监视输入到线程消息队列中的键盘消息。10、WH_MOUSEHookWH_MOUSEHook监视从GetMessage或者PeekMessage函数返回的鼠标消息。使用这个Hook监视输入到消息队列中的鼠标消息。11、WH_MOUSE_LLHookWH_MOUSE_LLHook监视输入到线程消息队列中的鼠标消息。12、WH_MSGFILTER和WH_SYSMSGFILTERHooksWH_MSGFILTER和WH_SYSMSGFILTERHooks使我们可以监视菜单,滚动条,消息框,对话框消息并且发现用户使用ALT+TABorALT+ESC组合键切换窗口。WH_MSGFILTERHook只能监视传递到菜单,滚动条,消息框的消息,以及传递到通过安装了Hook子过程的应用程序建立的对话框的消息。WH_SYSMSGFILTERHook监视所有应用程序消息。WH_MSGFILTER和WH_SYSMSGFILTERHooks使我们可以在模式循环期间过滤消息,这等价于在主消息循环中过滤消息。通过调用CallMsgFilterfunction可以直接的调用WH_MSGFILTERHook。通过使用这个函数,应用程序能够在模式循环期间使用相同的代码去过滤消息,如同在主消息循环里一样。13、WH_SHELLHook外壳应用程序可以使用WH_SHELLHook去接收重要的通知。当外壳应用程序是激活的并且当顶层窗口建立或者销毁时,系统调用WH_SHELLHook子过程。WH_SHELL共有5种情况:1.只要有个top-level、unowned窗口被产生、起作用、或是被摧毁;2.当Taskbar需要重画某个按钮;3.当系统需要显示关于Taskbar的一个程序的最小化形式;4.当目前的键盘布局状态改变;5.当使用者按Ctrl+Esc去执行TaskManager(或相同级别的程序)。按照惯例,外壳应用程序都不接收WH_SHELL消息。所以,在应用程序能够接收WH_SHELL消息之前,应用程序必须调用SystemParametersInfofunction注册它自己。3.2.2Hook子过程处理回调函数(HOOK处理子过程)为了拦截和处理特定的消息,你可以使用SetWindowsHookEx函数(下面将具体说明这些函数的声明及各种参数)在该类型的HOOK链中安装你自己的处理HOOK的子过程(回调函数)。只要您安装的钩子的消息事件类型发生,WINDOWS就将调用钩子函数。譬如您安装的钩子是WH_MOUSE类型,那么只要有一个鼠标事件发生时,该钩子函数就会被调用。不管您安装的是那一类型钩子,钩子函数的原型都时是一样的,语法如下:publicfunctionMyHook(ByValnCodeAsLong,ByValwParamAsLong,ByVallParamAsLong)aslong处理代码endfunction其中MyHook可以随便命名,其它不能变。该函数必须放在模块段。参数说明:nCode指定HOOK传入的信息类型。Hook子过程使用这个参数来确定任务。这个参数的值依赖于Hook类型,每一种Hook都有自己的Hook代码特征字符集。wParam:短整型参数。lParam:长整型参数。wParam,iParam的取值随nCode不同而不同,它代表了某种类型的HOOK的某个特定的动作。它们的典型值是包含了关于发送或者接收消息的信息。至于以上的几个参数及返回值的具体含义,各种类型的钩子都不相同,所以您必须查询WIN32API指南来得到不同类型钩子参数的详细定义以及它们返回值的意义。譬如:WH_CALLWNDPROCnCode只能是HC_ACTION,它代表有一个消息发送给了一个窗口wParam如果非0,代表正被发送的消息lParam指向CWPSTRUCT型结构体变量的指针returnvalue:未使用,返回0WH_MOUSEnCode为HC_ACTION或HC_NOREMOVEwParam包含鼠标的事件消息lParam指向MOUSEHOOKSTRUCT型结构体变量的指针returnvalue:如果不处理返回0,否则返回非0值3.2.3Hook的安装/卸载安装钩子使用SetWindowsHookEx函数(API函数),指定一个HOOK类型、自己的HOOK过程是全局还是局部HOOK,同时给出HOOK过程的进入点,就可以轻松的安装你自己的HOOK过程。SetWindowsHookEx总是将你的HOOK函数放置在HOOK链的顶端。你可以使用CallNextHookEx函数将系统消息传递给HOOK链中的下一个函数。[注意]对于某些类型的HOOK,系统将向该类的所有HOOK函数发送消息,这时,HOOK函数中的CallNextHookEx语句将被忽略。全局(远程钩子)HOOK函数可以拦截系统中所有线程的某个特定的消息,为了安装一个全局HOOK过程,必须在应用程序外建立一个DLL,并将该HOOK函数封装到其中,应用程序在安装全局HOOK过程时必须先得到该DLL模块的句柄。将DLL名传递给LoadLibrary函数,就会得到该DLL模块的句柄;得到该句柄后,使用GetProcAddress函数可以得到HOOK过程的地址。最后,使用SetWindowsHookEx将HOOK过程的首址嵌入相应的HOOK链中,SetWindowsHookEx传递一个模块句柄,它为HOOK过程的进入点,线程标识符置为0,指出:该HOOK过程同系统中的所有线程关联。如果是安装局部HOOK此时该HOOK函数可以放置在DLL中,也可以放置在应用程序的模块段。SetWindowHookEx函数参数说明:idHook:代表是何种Hook(也就是上面讲的14种Hook)lpfn:代表处理Hook的过程所在的Address,这是一个CallBackFucnction(也就是上面讲的回调函数),当挂上某个Hook时,我们便得定义一个Function来当作某个信息产生时,来处理它的Function。因这个参数是一个Function的Address所以我们固定将HookFunction放在.Bas中,并以AddressOfHookFunc传入hmod:代表.DLL的hInstance,如果是LocalHook,该值可以是Null(VB中可传0进去),而如果是RemoteHook,则可以使用GetModuleHandle(".dll名称")来传入。dwThreadId:代表执行这个Hook的ThreadId(线程ID),如果不设定是那个Thread(线程)来做,则传0。该参数可以决定该钩子是局部的还是系统范围的。如果该值为NULL,那么该钩子将被解释成系统范围内的,那它就可以监控所有的进程及它们的线程。如果您指定了您自己进程中的某个线程ID号,那该钩子是一个局部的钩子。如果该线程ID是另一个进程中某个线程的ID,那该钩子是一个全局的远程钩子。这里有两个特殊情况:WH_JOURNALRECORD和WH_JOURNALPLAYBACK总是代表局部的系统范围的钩子,之所以说是局部,是因为它们没有必要放到一个DLL中。WH_SYSMSGFILTER总是一个系统范围内的远程钩子。其实它和WH_MSGFILTER钩子类似,如果把参数ThreadID设成0的话,它们就完全一样了。etWindowHookEx函数返回值:如果SetWindowsHookEx()成功,它会传回一个值,代表目前的Hook的Handle,否则返回NULL。您必须保存该句柄,因为后面我们还要它来卸载钩子。卸载钩子使用UnhookWindowsHookEx函数来卸载创建的钩子。函数声明:DeclareFunctionUnhookWindowsHookExLib"user32"Alias"UnhookWindowsHookEx"(ByValhHookAsLong)AsLong参数说明:hHook:是SetWindowsHookEx()的传回值3.3设计流程及函数思想简述本模块是基于Client/Server(客户端/服务器)结构的WindowsSocket编程,基本函数思想是与被控制端向控制端发送一个消息可以是字符,数字等,然后控制端根据相关信息采取相关的操作,主要是主要是通过多线程技术来实现,同时也运用了HOOK技术,还有相关的API函数来支持。代码分析 4程序测试与相应改进获取对方相关信息图2获取对方相关信息发送消息及存贮图3发送信息及存储被指导端显示信息结论本文在Client/Server(客户端/服务器)结构下实现了远程指导,利用了VC++中比较重要的HOOK技术、多线程技术,同时调用API当中的相关函数来实现,编程方面采用了WindowsScoket编程,最终能够实现网络通信,使得指导端能够响应被指导端的请求,控制被指导端的鼠标和键盘、存储被指导端键盘和鼠标信息,而且也能够进行控制鼠标和指导键盘的输入等其它相关的操作。在我们进行网络通信的时候,还可以进行“组播”消息,即通过一个指导端能够向多个被指导端传递消息,响应多个被指导端的请求,使得此模块效率更高,使其能够有更大的实用价值。参考文献[1][M].北京:人民邮电出版社,2006。[2]孙鑫,余安萍.VC++深入详解[M].北京:电子工业出版社,2006。[3]张友生.远程控制编程技术[M].北京:电子工业出版社,2001。[4]辛长安,梅林.VC++编程技术与难点解析[M].北京:清华大学出版社,2002。[5]周金,徐丙立,姜小光.Windows系统编程[M].北京:人民邮电出版社,2002。[6]汪晓平,钟军.VisualC++网络通信协议分析与应用实现[M].北京:人民邮电出版社,2003。[7]王险峰,刘宝宏.Windows环境下的多线程编程原理与应用[M].北京:清华大学出版社,2002。附录:外文翻译InWangZuoliang’stranslationpractices,hetranslatedmanypoems,especiallythepoemswrittenbyRobertBurns.HistranslationofBurn’s“ARed,RedRose”broughthimfameasaversetranslator.Atthesametime,hepublishedabouttenpapersonthetranslationofpoems.Somearguethatpoemscannotbetranslated.Froststressesthatpoetrymightgetlostintranslation.AccordingtoWang,versetranslationispossibleandnecessary,for“Thepoet-translatorbringsoversomeexcitingworkfromanothercultureandindoingso

温馨提示

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

评论

0/150

提交评论