毕业设计(论文)-网络虚拟实验平台的构建与测试.doc_第1页
毕业设计(论文)-网络虚拟实验平台的构建与测试.doc_第2页
毕业设计(论文)-网络虚拟实验平台的构建与测试.doc_第3页
毕业设计(论文)-网络虚拟实验平台的构建与测试.doc_第4页
毕业设计(论文)-网络虚拟实验平台的构建与测试.doc_第5页
免费预览已结束,剩余17页可下载查看

下载本文档

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

文档简介

网络虚拟实验平台的构建与测试网络虚拟实验平台的构建与测试 摘摘 要要 基于网络的虚拟实验平台是在能够进行网络通信的基础之上将计算机上虚 拟的各种仪器、器件,按实验要求组装成一个完整的实验环境,实现搭接实验 电路,演示实验过程等功能。远程指导模块是其中的一个功能模块。它分成指 导端和被指导端两部分,指导端通过 hook 技术,采集本地机鼠标和键盘信息; 然后将这些信息打包,通过 p2p 网络通信机制将信息包传给被指导端;在被指 导端将信息包信息解出,通过 mouse_event、keybd_event 等函数去控制被指导 端的鼠标、键盘动作,实现相关的一些远程指导动作。本模块在 vc 环境下开发, 用到了 windows socket 编程技术,p2p 编程思想,hook 技术,多线程技术等多 方面的技术。由于整个系统模块很多,本设计中编写了独立的测试程序,经过 测试基本达到预期的设计目标。 关键词关键词:远程指导;p2p;windows socket 编程;hook;多线程 design and implementation of remote guidance module based on network virtual experiment platform abstract under the foundation of network communications,the network-based virtual experimental platform could integrate various computer virtual devices into a complete experimental environment according to the experiment requirements, and connect the experiment circuit and demonstrate the process of experiment. the remote guiding module was one of function modules, which was divided into guiding end and the guided end. with hook, the guiding end captured the information of local mouse and keyboard, and packed the information to send to the guided part through peer-to- peer network communication mechanism. the guided end will unpack the information, and control the mouse and keyboard of the guided end by mouse_event, keybd_event functions to implement some remote control actions. developed under vc environment, the remote guidance module used windows socket programming technology, p2p programming ideas, hook technology, multithreading technology, and etc. because there are many modules for the whole system, an independent testing procedure was programmed to test the modules, which had been proven to achieve the desired objectives key words: remote guidance;peer-to-peer;windows socket programming;hook;multithreading 目目 录录 论文总页数:23 页 1 引言.1 1.1 项目背景1 1.2 项目介绍1 1.2.1 基于网络的虚拟实验平台1 1.2.2 远程指导模块2 1.3 项目要求.2 1.3.1 功能要求2 1.3.2 client/server(客户端/服务器)结构工作过程 .2 2 网络基础知识简介3 2.1 osi 与 tcp/ip 参考模型的对应关系3 2.1.1 osi 参考模型.3 2.1.2 tcp/ip 参考模型 .4 2.2 windows socket编程原理及操作步骤 5 2.3 p2p 网络介绍8 3 相关函数分析与代码实现8 3.1 多线程8 3.1.1 进程介绍8 3.1.2 线程介绍8 3.1.3 进程与线程的关系9 3.1.4 多线程实现9 3.2 hook技术.9 3.2.1 hook 函数简介及类型.9 3.2.2 hook 子过程处理.12 3.2.3 hook 的安装/卸载13 3.3 设计流程及函数思想.15 3.3.1 简述15 3.3.2 代码分析15 4 程序测试与相应改进18 4.1 程序界面.18 4.2 程序相关测试19 4.2.1 获取对方相关信息19 4.2.2 发送消息及存贮.19 4.2.3 被指导端显示信息.20 4.3 相关改进.20 结 论20 参考文献21 第 2 页 共 23 页 1 1 引言引言 近年来,随着信息技术的发展,计算机的普及,网络为我们带了更多的便 利。网络技术的发展,引发了控制领域的深刻技术变革,控制系统结构沿着网 络化方向与控制系统体系沿着开放性方向发展将是控制系统技术创新的大潮流。 计算机局域网络、企业网络、现代信号处理等等使自动化系统与工业控制系统 从体系结构、控制方法、产品系列、人机协作方法等都发生了重大的变化。进 入 21 世纪的控制系统以网络为主要特征:一方面是在自动化与工业控制中需要 更深层次地渗透通信与网络技术,另一方面是在通信网络的管理与控制中也要 求更多的采用控制理论与策略并且由于系统中需要大量的数据交换,服务器的 负担很重,所以我们就研究出了基于网络的虚拟实验平台。 作为基于网络的虚拟实验平台的远程指导模块,本文通过 windows socket 编程,以 hook 技术,多线程技术作为基础,再利用其他的 api 函数来实现被指 导端对指导端发送请求信息,将信息打包以后通过网络传输到服务器端,指导 端收到信息以后,将信息解包,根据信息提示来对被指导端进行相关指导:获 取客户的相关信息、锁定鼠标和键盘,对鼠标进行动态的控制和指导键盘的信 息输入。 1.11.1 项目背景项目背景 全球信息化的发展,计算机网络给我们提供了优越的通信平台,优秀的软 件系统必须要具有网络功能。虚拟实验平台正是应这个大需求而诞生。并且随 着信息技术的发展,网络无疑为我们带了更多的便利,同时一个优秀的系统必 须要具有网络功能,要完成这些功能,那就要把各种网络通过某种方式连接起 来,在网络实现过程中存在穿透 nat 的问题,此问题存在较长时间,后来因为 网络地址不够而产生了 p2p 技术,伴随着 p2p 技术的出现,利用 udp 实现 p2p 网络穿越 nat 的即时通讯技术,而问题即被解决。 1.21.2 项目介绍项目介绍 .1 基于网络的虚拟实验平台基于网络的虚拟实验平台 计算机技术、大规模集成电路技术和通讯技术的飞速发展,为虚拟实验的 发展奠定了坚实的基础。虚拟实验就是在通用计算机上加载相应的软件或硬件, 使得使用者在操作这台计算机时,就像是在操作一台专用的传统试验设备一样。 在虚拟实验系统中,软件是整个系统的关键,任何使用者都可以通过软件的相 关设置来达到要实现实验的效果。 虚拟实验就是利用外部输入(如鼠标的点击、拖动和键盘的敲击等),将计 算机上虚拟的各种仪器,按实验要求、过程,组装成一个完整的实验环境,同 时在这个环境中完成实验操作,包括实验器材的添加、实验条件的改变、数据 第 3 页 共 23 页 采集以及实验结果的模拟、分析。它包含了虚拟仿真技术、计算机技术、实验 技术、网络技术与专业等多方面理论知识。 .2 远程指导模块远程指导模块 远程指导模块是基于网络的虚拟实验平台的一个通信模块,是基于 windows socket 编程,使用 client/server(客户端/服务器)结构来实现模块的 功能,以 vc 为开发环境,同时以 hook 技术和多线程技术作为基础,再利用 api 相关函数来实现指导端和被指导端的互动。 1.31.3 项目要求项目要求 .1 功能要求功能要求 完成远程指导的基本功能,指导端和被指导端能够进行 p2p 网络通信,指 导端能够控制被指导端的鼠标和键盘,并且能够存储相关信息,还能够对鼠标 进行动态控制和指导键盘的输入。 .2 client/server(client/server(客户端客户端/ /服务器服务器) )结构工作过程结构工作过程 client/server(客户端/服务器)结构,通过将任务合理分配到client 端和 server 端,降低了系统的通讯开销,可以充分利用两端硬件环境的优势,在 tcp/ip网络应用中,通信的两个进程间相互作用的主要模式是客户机/服务器模 式(client/server),即客户向服务器提出请求,服务器接收到请求后,提供相 应的服务。客户机/服务器模式的建立基于以下两点:首先,建立网络的起因是 网络中软硬件资源、运算能力和信息不均等,需要共享,从而造就拥有众多资 源的主机提供服务,资源较少的客户请求服务这一非对等作用。其次,网络之 间进程通信完全是异步的,相互通信的进程间既不存在父子关系,又不共享内 存缓冲区,因此需要一种机制为希望通信的进程间建立联系,为二者的数据交 换提供同步,这就是基于客户机/服务器模式的tcp/ip: 客户机/服务器模式在操作过程中采取的是主动请求的方式。首先服务器方 要先启动,并根据请求提供相应的服务:打开一个通信通道并告知本地主机, 它愿意在某一地址和端口上接收客户请求。等待客户请求到达该端口。接收到 重复服务请求,处理该请求并发送应答信号。接收到并发服务请求,要激活一 个新的进程(或线程)来处理这个客户请求。新进程(或线程) 处理此客户请求, 并不需要对其它请求做出应答。服务完成后,关闭此新进程与客户的通信链路, 并终止。返回第二步,等待另一客户请求,关闭服务器。 客户方:打开一个通信通道,并连接到服务器所在主机的特定端口。向服 务器发送服务请求报文,等待并接收应答;继续提出请求。请求结束后关闭通 信通道并终止。 第 4 页 共 23 页 2 2 网络基础知识简介网络基础知识简介 2.12.1 osiosi 与与 tcp/iptcp/ip 参考模型的对应关系参考模型的对应关系 .1 osiosi 参考模型参考模型 国际标准化组织(iso)开发了开放式系统互联(osi)参考模型,以促进计算 机系统的开放互联。开放式互联就是可在多个厂家的环境中支持互联。该模型 为计算机间开放式通信所需要定义的功能层次建立了全球标准。osi 模型将通 信会话需要的各种进程划分成 7 个相对独立的功能层次,这些层次的组织是以 在一个通信会话中事件发生的自然顺序为基础的。表 1 描述了 osi, 1-3 层提供 了网络访问,4-7 层用于支持端端通信。 1、物理层是 osi 模型的最低层,它建立在物理通信介质的基础上,规定了 机械的、电气的功能;该层负责建立、保持和拆除物理链路;规定如何在此链 路上传送原始比特流;比特如何编码,使用的电平,极性,连接插头插座的插 脚如何分配等。所以在物理层数据的传送单位是比特(bit) 。 2、数据链路层它把相邻两个节点间不可靠的物理链路变成可靠的无差错的 逻辑链路,包括把原始比特流分帧(frame)、顺序、排序、设置检错、确认、重 发、流控等功能;数据链路层传动信息的单位是 frame,每帧(frame)包括一定 数量的数据和一些必要的控制信息,在每帧(frame)的控制信息中,包括同步信 息、地址信息、流量信息等;同物理层相似,数据链路层负责建立、维护和释 放数据链路。 3、网络层,它连接网络中任何两个计算机点,从一个节点上接收数据,正 确的传送到另一个节点;在网络层,传送的信息单位是分组或包(packet) 。网 络层的主要任务是要选择合适的路由和交换节点,透明地向目的站交付发送站 所发的分组或包,这里的透明表示收发两端好像是直接连通的,另外网络层还 要解决网络互连、拥挤控制等问题。上述三层组成了所谓的通信子网,用户计 算机连接到此子网上。通信子网负责把一个地方的数据可靠地传送到另一个地 方,但并未实现两个地方主机上进行进程之间的通信,通信子网的主要功能是 面向通信的。 4、传输层上真正地实现了端对端通信,把数据可靠地从一方的用户进程或 程序送到另一方的用户进程或程序。这一层的控制通常由通信两端的计算机完 成。中间节点一般不提供这一层的服务,这一层的通信与通信子网无关。从这 一层开始的以上各层全部是针对通信的最终的源端目的端计算机的进程之间的。 传输层传送的信息单位是报文(message) 。传输层向上一层提供一个可靠的端 一端服务,使上一层看不见下面几层的通信细节。正因为如此,传输层成为网 络体系结构中关键的一层,对于传输层的功能,主要在主机内实现。而对于物 第 5 页 共 23 页 理层、数据链路层以及网络层的功能均能在报文接口机中实现。对于传输层之 上的各个层次的功能通常在主机中实现。 5、会话层又称对话层会话层允许两个计算机上的用户进程建立对话连接, 双方相互确认身份,协商对话连接的细节;它可管理对话是双向同时进行的, 还是任何时刻只能一个方向进行。在后一种情况下,对话层控制哪一方有权发 送数据;对话层还提供同步机制,在数据流中插入同步点机制,在每次网络出 现故障后可以仅重传最近一个同步点以后的数据,而不必从头开始。以上两层 为两个计算机上的用户进程或程序之间提供了正确传送数据的手段。 6、表示层主要解决用户信息的语法表示问题。表示层将数据从适合于某一 系统的语法转变为适合于 osi 系统内部使用的语法。具体地讲,表示层对传送 的用户数据进行翻译、编码和变换,使得不同类型的机器对数据信息的不同表 示方法可以相互理解。 7、应用层主要处理资源可用性和安全问题,它包含了大量人们普遍需要的 协议,如 ftp、telnet、http、smtp 等。最近几年,应用层协议发展很快,出 现了很多新的应用,如 icq、multimedia stream 等。 .2 tcp/iptcp/ip 参考模型参考模型 与 osi 参考模型不同,tcp/ip 模(表 2)更侧重于互联设备间的数据传送, 而不是严格的功能层次划分。它通过解释功能层次分布的重要性来做到这点, 但仍为设计者具体实现协议留下很大的余地。因此,osi 参考模型在解释互联 网络通信机制比较适合,但 tcp/ip 成为了互联网络协议的市场标准。tcp/ip 老-模型是在它所解释的协议出现很久以后才发展起来的,更重要的是,在于它 更强调功能分布而不是严格的功能层次的划分,因此它比 osi 模型更灵活。 1 应用层 应用层包括 smtp, ftp, http, nfs, nis, lpd, telnet f ii remote login 应用层包括一些服务,这些服务在 osi 中由独立的三层实现。这些服务 是和用户相关的认证、数据处理以及压缩。包括电子邮件、浏览器、telnet 以 及其他的 internet 应用。 2 传输层 传输层包括 tcp ( transport control protocol,传输控制协议)和 udp (user datagram protocol,用户数据报协议)。udp 几乎不进行检查,而 tcp 提供传输保证。与 osi 中传输层不一样,tcp 不保证报文的准确传输。tcp 为两 台主机提供高可靠性的数据通信。而另一方面,udp 则为应用层提供一种非常 简单的服务,它只是把称作数据报的分组从一台主机发送到另一台主机,但并 不保证该数据报能到达另一端。任何必需的可靠性必须由应用层来提供。 第 6 页 共 23 页 3 网络层 tcp/ip 协议族中,网络层由以下协议组成:icmp (internt 联网托制报文协 议)、ip(网际协议)、igmp (internet 组管理协议)、rip, ospf 和路由的 egp 网 络层处理报文的路由管理。 4 链路层 链路层包括 arp 和 rarp,负责报文传输。链路层管理网络的连接并提供网 络上的报文输入/输出。 表 1 osi 模型 表 2 tcp/ip 模型 0 si 参考模型 层次描述 osi 层次号 应用层7 表示层6 会话层5 传输层4 网络层3 数据链路层2 物理层1 第 7 页 共 23 页 2.22.2 windowswindows socketsocket 编程原理及操作步骤编程原理及操作步骤 windows sockets 是 microsoft windows 的网络程序设计接口,它是从 berkeley sockets 扩展而来的,以动态链接库的形式提供给我们使用。 windows sockets 在继承了 berkeley sockets 主要特征的基础上,又对它进行 了重要扩充。这些扩充主要是提供了一些异步函数,并增加了符合 windows 消 息驱动特性的网络事件异步选择机制。windows sockets 1.1 和 berkeley sockets 都是基于 tcp/ip 协议的;windows sockets 2 从 windows sockets 1.1 发展而来,与协议无关并向下兼容,可以使用任何底层传输协议提供的通 信能力,来为上层应用程序完成网络数据通讯,而不关心底层网络链路的通讯 情况,真正实现了底层网络通讯对应用程序的透明。 流式套接字(sock_stream) 提供面向连接、可靠的数据传输服务,数据无差错、无重复的发送,且按 发送顺序接收。 数据报式套接字(sock_dgram) 提供无连接服务。数据包以“独立包”形式发送,不提供无错保证,数据 可能丢失或重复,并且接收顺序混乱。 原始套接字(sock_raw)。 基于tcp(面向连接)的socket编程: 服务器端程序: 1、创建套接字(socket)。 2、将套接字绑定到一个本地地址和端口上(bind)。 3、将套接字设为监听模式,准备接收客户请求(listen)。 4、等待客户请求到来;当请求到来后,接受连接请求,返回一个新的对应 于此次连接的套接字(accept)。 tcp/ip 参考模型层 次描述 tcp/ip 层次号 应用层4 传输层3 网络层2 数据链路层1 第 8 页 共 23 页 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、向服务器发送数据(send to)。 3、关闭套接字。 相关函数说明; int bind( socket s, const struct sockaddr far *name, int namelen ); 这个函数接收三个参数。第一个参数s指定要绑定的套接字,第二个参数指 定了该套接字的本地地址信息,是指向sockaddr结构的指针变量,由于该地址 结构是为所有的地址家族准备的,这个结构可能(通常会)随所使用的网络协 议不同而不同,所以,要用第三个参数指定该地址结构的长度。 sockaddr结构 定义如下: struct sockaddr u_shortu_short sa_family; charchar sa_data14; ; sockaddr的第一个字段sa_family指定该地址家族,在这里必须设为 af_inet。sa_data仅仅是表示要求一块内存分配区,起到占位的作用,该区域 中指定与协议相关的具体地址信息。由于实际要求的只是内存区,所以对于不 同的协议家族,用不同的结构来替换sockaddr。除了sa_family外,sockaddr是 第 9 页 共 23 页 按网络字节顺序表示的。在tcp/ip中,我们可以用sockaddr_in结构替换 sockaddr,以方便我们填写地址信息。 sockaddr_in的定义如下: structstruct sockaddr_in shortshort sin_family; unsignedunsigned shortshort sin_port; structstruct in_addrin_addr sin_addr; charchar sin_zero8; ; 其中,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地址字符串。 2.32.3 p2pp2p 网络介绍网络介绍 p2p技术源于局域网共享,其目标是改变人们通过服务器中转交换文件的传 统方式,达到自由交换资源的目的。ibm为p2p下了如下定义:系统由若干互联 协作的计算机构成,且至少具有如下特征之一:系统依存于边缘化(非中央式 服务器)设备的主动协作,每个成员直接从其他成员而不是从服务器的参与中 受益;系统中成员同时扮演服务器与客户端的角色;系统应用的用户能够意识 到彼此的存在,构成一个虚拟或实际的群体。p2p网络是互联网整体架构的基础, 互联网中最基本的 tcp/ip协议并没有客户端和服务器的概念,在通讯过程中, 所有的设备都是平等的一端。p2p 技术改变了“内容”所在的位置,使其正在 第 10 页 共 23 页 从“中心”走向“边缘”,也就是说不再如cs模式将内容存于主要的服务器上, 而是存在所有用户的 pc 机上。广义的p2p 网络将 p2p网络划分为纯分散式 p2p网络(如gnutella模型)、超级结点式网络和混合式 p2p网络等大类。 3 3 相关函数分析与代码实现相关函数分析与代码实现 3.13.1 多线程多线程 .1 进程进程介绍介绍 进程:通常被定义为一个正在运行的程序的实例,是一个程序在其自身的 地址空间中的一次执行活动。进程是资源申请、调度和独立运行的单位,因此, 它使用系统中的运行资源;而程序不能申请系统资源,不能被系统调度,也不 能作为独立运行的单位,因此,它不占用系统的运行资源 进程由两个部分组成: 1、操作系统用来管理进程的内核对象。内核对象也是系统用来存放关于进 程的统计信息的地方。 2、地址空间。它包含所有可执行模块或dll模块的代码和数据。它还包含 动态内存分配的空间。如线程堆栈和堆分配空间。 .2 线程介绍线程介绍 线程由两个部分组成: 1、线程的内核对象,操作系统用它来对线程实施管理。内核对象也是系统 用来存放线程统计信息的地方。 2、线程堆栈,它用于维护线程在执行代码时需要的所有参数和局部变量。 当创建线程时,系统创建一个线程内核对象。该线程内核对象不是线程本 身,而是操作系统用来管理线程的较小的数据结构。可以将线程内核对象视为 由关于线程的统计信息组成的一个小型数据结构。 线程总是在某个进程环境中创建。系统从进程的地址空间中分配内存,供 线程的堆栈使用。新线程运行的进程环境与创建线程的环境相同。因此,新线 程可以访问进程的内核对象的所有句柄、进程中的所有内存和在这个相同的进 程中的所有其他线程的堆栈。这使得单个进程中的多个线程确实能够非常容易 地互相通信。 .3 进程与线程的关系进程与线程的关系 进程是不活泼的。进程从来不执行任何东西,它只是线程的容器。若要使 进程某操作,它必须拥有一个在它的环境中运行的线程,此线程负责执行包含 在进程的地址空间中的代码。单个进程可能包含若干个线程,这些线程都“同 时” 执行进程地址空间中的代码。每个进程至少拥有一个线程,来执行进程的 第 11 页 共 23 页 地址空间中的代码。当创建一个进程时,操作系统会自动创建这个进程的第一 个线程,称为主线程。此后,该线程可以创建其他的线程。 .4 多线程实现多线程实现 线程只有一个内核对象和一个堆栈,保留的记录很少,因此所需要的内存 也很少。因为线程需要的开销比进程少,因此在编程中经常采用多线程来解决 编程问题,而尽量避免创建新的进程。 3.23.2 hookhook 技术技术 .1 hookhook 函数简介及类型函数简介及类型 hook(钩子)是windows提供的一种消息处理机制,是指在程序正常运行中 接受信息之前预先启动的函数,用来检查和修改传给该程序的信息,(钩子) 实际上是一个处理消息的程序段,通过系统调用,把它挂入系统。每当特定的 消息发出,在没有到达目的窗口前,钩子程序就先捕获该消息,亦即钩子函数 先得到控制权。这时钩子函数即可以加工处理(改变)该消息,也可以不作处 理而继续传递该消息,还可以强制结束消息的传递。安装钩子函数将会影响系 统的性能。监测“系统范围事件”的系统钩子特别明显。因为系统在处理所有 的相关事件时都将调用您的钩子函数,这样系统将会明显的减慢。 hook链 windows提供了14种不同类型的hooks,不同的hook可以处理不同的消息。 例如:wh_mouse hook用来监视鼠标消息。windows为这几种hooks维护着各自的 hook链表。hook链表是一串由应用程序定义的回调函数(callback function)队 列,当某种类型的消息发生时,windows向此种类型的hook链的第一个函数 (hook链的顶部)发送该消息,在第一函数处理完该消息后由该函数向链表中 的下一个函数传递消息,依次向下。如果链中某个函数没有向下传送该消息, 那么链表中后面的函数将得不到此消息。(对于某些类型的hook,不管hook链 中的函数是否向下传递消息,与此类型hook联系的所有hook函数都会收到系统 发送的消息)一些hook子过程可以只监视消息,或者修改消息,或者停止消息 的前进,避免这些消息传递到下一个hook子过程或者目的窗口。最近安装的钩 子放在链的开始,而最早安装的钩子放在最后,也就是后加入的先获得控制权。 hook的作用范围 两种类型:局部和远程 一、局部钩子仅钩挂您自己进程的事件。 二、远程的钩子还可以将钩挂其它进程发生的事件。 远程的钩子又有两种: 第 12 页 共 23 页 1、基于线程的 它将捕获其它进程中某一特定线程的事件。简言之,就是 可 以用来观察其它进程中的某一特定线程将发生的事件。 2、系统范围的 将捕捉系统中所有进程将发生的事件消息。 hook类型 windows共有14种hooks,每一种类型的hook可以使应用程序能够监视不同 类型的系统消息处理机制。下面描述所有可以利用的hook类型的发生时机。 (这些常数值均可以api浏览器里查到) 1、wh_callwndproc和wh_callwndprocret hooks wh_callwndproc和wh_callwndprocret hooks使你可以监视发送到窗口过程 的消息。系统在消息发送到接收窗口过程之前调用wh_callwndproc hook子过程, 并且在窗口过程处理完消息之后调用wh_callwndprocret hook子过程。 wh_callwndprocret hook传递指针到cwpretstruct结构,再传递到hook子 过程。cwpretstruct结构包含了来自处理消息的窗口过程的返回值,同样也包 括了与这个消息关联的消息参数。 2、wh_cbt hook 在以下事件之前,系统都会调用wh_cbt hook子过程,这些事件包括: 1. 激活,建立,销毁,最小化,最大化,移动,改变尺寸等窗口事件; 2. 完成系统指令; 3. 来自系统消息队列中的移动鼠标,键盘事件; 4. 设置输入焦点事件; 5. 同步系统消息队列事件。 hook子过程的返回值确定系统是否允许或者防止这些操作中的一个。 3、wh_debug hook 在系统调用系统中与其它hook关联的hook子过程之前,系统会调用 wh_debug hook子过程。你可以使用这个hook来决定是否允许系统调用与其它 hook关联的hook子过程。 4、wh_foregroundidle hook 当应用程序的前台线程处于空闲状态时,可以使用wh_foregroundidle hook执行低优先级的任务。当应用程序的前台线程大概要变成空闲状态时,系 统就会调用wh_foregroundidle hook子过程。 5、wh_getmessage hook 应用程序使用wh_getmessage hook来监视从getmessage or peekmessage函 数返回的消息。你可以使用wh_getmessage hook去监视鼠标和键盘输入,以及 第 13 页 共 23 页 其它发送到消息队列中的消息。 6、wh_journalplayback hook wh_journalplayback hook使应用程序可以插入消息到系统消息队列。以使 用这个hook回放通过使用wh_journalrecord hook记录下来的连续的鼠标和键盘 事件。wh_journalplayback hook已经安装,正常的鼠标和键盘事件就是无效的。 wh_journalplayback hook是全局hook,它不能像线程特定hook一样使用。 wh_journalplayback hook返回超时值,这个值告诉系统在处理来自回放hook当 前消息之前需要等待多长时间(毫秒)。这就使hook可以控制实时事件的回放。 wh_journalplayback是system-wide local hooks,它们不会被注射到任何行程 地址空间。 7、wh_journalrecord hook wh_journalrecord hook用来监视和记录输入事件。典型的,可以使用这个 hook记录连续的鼠标和键盘事件,然后通过使用wh_journalplayback hook来回 放。wh_journalrecord hook是全局hook,它不能像线程特定hook一样使用。 wh_journalrecord是system-wide local hooks,它们不会被注射到任何行程地 址空间。 8、wh_keyboard hook 在应用程序中,wh_keyboard hook用来监视wm_keydown and wm_keyup消息, 这些消息通过getmessage or peekmessage function返回。可以使用这个hook 来监视输入到消息队列中的键盘消息。 9、wh_keyboard_ll hook wh_keyboard_ll hook监视输入到线程消息队列中的键盘消息。 10、wh_mouse hook wh_mouse hook监视从getmessage 或者 peekmessage 函数返回的鼠标消息。 使用这个hook监视输入到消息队列中的鼠标消息。 11、wh_mouse_ll hook wh_mouse_ll hook监视输入到线程消息队列中的鼠标消息。 12、wh_msgfilter 和 wh_sysmsgfilter hooks wh_msgfilter 和 wh_sysmsgfilter hooks使我们可以监视菜单,滚动条, 消息框,对话框消息并且发现用户使用alt+tab or alt+esc 组合键切换窗口。 wh_msgfilter hook只能监视传递到菜单,滚动条,消息框的消息,以及传递到 通过安装了hook子过程的应用程序建立的对话框的消息。wh_sysmsgfilter hook监视所有应用程序消息。 wh_msgfilter 和 wh_sysmsgfilter hooks使我们可以在模式循环期间过滤 第 14 页 共 23 页 消息,这等价于在主消息循环中过滤消息。 通过调用callmsgfilter function可以直接的调用wh_msgfilter hook。通 过使用这个函数,应用程序能够在模式循环期间使用相同的代码去过滤消息, 如同在主消息循环里一样。 13、wh_shell hook 外壳应用程序可以使用wh_shell hook去接收重要的通知。当外壳应用程序 是激活的并且当顶层窗口建立或者销毁时,系统调用wh_shell hook子过程。 wh_shell 共有种情况: 1. 只要有个top-level、unowned 窗口被产生、起作用、或是被摧毁; 2. 当taskbar需要重画某个按钮; 3. 当系统需要显示关于taskbar的一个程序的最小化形式; 4. 当目前的键盘布局状态改变; 5. 当使用者按ctrl+esc去执行task manager(或相同级别的程序)。 按照惯例,外壳应用程序都不接收wh_shell消息。所以,在应用程序能够 接收wh_shell消息之前,应用程序必须调用systemparametersinfo function注 册它自己。 .2 hookhook 子过程处理子过程处理 回调函数(hook处理子过程) 为了拦截和处理特定的消息,你可以使用setwindowshookex函数(下面将 具体说明这些函数的声明及各种参数)在该类型的hook链中安装你自己的处理 hook的子过程(回调函数)。只要您安装的钩子的消息事件类型发生,windows 就将调用钩子函数。譬如您安装的钩子是wh_mouse类型,那么只要有一个鼠标 事件发生时,该钩子函数就会被调用。不管您安装的是那一类型钩子,钩子函 数的原型都时是一样的,语法如下: public function myhook(byval ncode as long, byval wparam as long, byval lparam as long) as long 处理代码 end function 其中myhook可以随便命名,其它不能变。该函数必须放在模块段。 参数说明: ncode指定hook传入的信息类型。hook子过程使用这个参数来确定任务。这 个参数的值依赖于hook类型,每一种hook都有自己的hook代码特征字符集。 wparam:短整型参数。 第 15 页 共 23 页 lparam:长整型参数。 wparam,iparam的取值随ncode不同而不同,它代表了某种类型的hook的某 个特定的动作。它们的典型值是包含了关于发送或者接收消息的信息。至于以 上的几个参数及返回值的具体含义,各种类型的钩子都不相同,所以您必须查 询win32 api 指南来得到不同类型钩子参数的详细定义以及它们返回值的意义。 譬如: wh_callwndproc ncode 只能是hc_action,它代表有一个消息发送给了一个窗口 wparam 如果非0,代表正被发送的消息 lparam 指向cwpstruct型结构体变量的指针 return value: 未使用,返回0 wh_mouse ncode 为hc_action 或 hc_noremove wparam 包含鼠标的事件消息 lparam 指向mousehookstruct型结构体变量的指针 return value: 如果不处理返回0,否则返回非0值 .3 hookhook 的安装的安装/ /卸载卸载 安装钩子 使用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中,也可以放置在应用程序的模块段。 第 16 页 共 23 页 setwindowhookex函数参数说明: idhook:代表是何种hook(也就是上面讲的14种hook) lpfn:代表处理hook的过程所在的address,这是一个callback fucnction(也就是上面讲的回调函数),当挂上某个hook时,我们便得定义一个 function来当作某个信息产生时,来处理它的function。因这个参数是一个 function的address所以我们固定将hook function放在.bas中,并以addre

温馨提示

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

评论

0/150

提交评论