1 / 132
文档名称:

《地面沉降水准测量规范 DZ-T0154-1995》.pdf.pdf

格式:pdf   页数:132页
下载后只包含 1 个 PDF 格式的文档,没有任何的图纸或源代码,查看文件列表

如果您已付费下载过本站文档,您可以点这里二次下载

《地面沉降水准测量规范 DZ-T0154-1995》.pdf.pdf

上传人:junli42416 2016/6/10 文件大小:0 KB

下载得到文件列表

《地面沉降水准测量规范 DZ-T0154-1995》.pdf.pdf

相关文档

文档介绍

文档介绍:HOOK 学****笔记一、概述千呼万唤始出来, 终于开始学****Win32 HOOK 机制了。虽然说 HOOK 早已不是什么新技术, 但是对于自己而言却是第一次接触。之前更多地只是从检测木马的钩子中感性地认识 HOOK 。由于之前从来没有真正接触过, 所以一上来缺的知识模块比较多。作为第一篇关于 HOOK 的学****笔记,先就 HOOK 的基本知识做个小结,然后给出一个简单的通过控制台实现的键盘钩子例子。本篇笔记结构如下: ? Windows 消息机制? Windows HOOK 机制(全局 HOOK ) ?核心函数?简单程序示例?问题二、 Windows 消息机制 Windows 操作系统是建立在事件驱动机制之上的, 系统各部分之间的沟通也都是通过消息的相互传递而实现的。但在通常情况下, 应用程序只能处理来自进程内部的消息或是从其他进程发过来的消息(借助进程间通信技术,如剪贴板,管道,邮槽等) ,如果需要对在进程外传递的消息进行拦截处理就必须采取一种称为 HOOK 的技术。 HOOK 作为 Windows 操作系统中非常重要的一种系统接口,用它可以轻松截获并处理在其他应用程序之间传递的消息, 并由此可以完成一些普通应用程序难以实现的特殊功能。首先我们对第一次接触 Window s 编程的同学们简单介绍一下 Windows 的消息机制。我们知道 Windows 系统各个部分的通信是通过发送 Message 进行的,这里的其实是一个 MSG 结构体: typedef struct tagMSG { HWND hwnd ; UINT message ; WPARAM wParam ; LPARAM lParam ; DWORD time ; POINT pt ;} MSG; 具体的用法感兴趣的同学可以去查阅下 MSDN ,这里还是啰嗦一句,学****Windows 编程的朋友们还是一定要去下载一个 MSDN , 用起来真的很方便。大致的过程是当系统 I/O 上发生一个事件时, 系统捕获该事件, 并向指定的应用程序的消息队列发送一个消息, 应用程序从消息队列中顺次取出一个消息, 交由系统调度相应的窗口回调程序进行消息处理。这里我们给出一个结构图方便大家理解。这里可以看到,从 OS 捕捉到消息开始处理, 到最后交还给 OS 调度回调函数, 就像走了一个循环, 我自己理解这也是为什么叫做“回调函数”的原因之一。接下来我们要进行的 HOO K 就是在上面的第二步和第三步之间进行的额外工作。三、 Windows HOOK 机制 HOOK (钩子)的本质是一段用以处理系统消息的程序,通过系统调用,将其挂入到系统。钩子的种类有很多, 每一种钩子负责截获并处理相应的消息。钩子机制允许应用程序截获并处理发往指定窗口的消息或特定事件, 其监视的窗口既可以是本进程内的也可以是由其他进程所创建的。在特定的消息发出并到达目的窗口之前, HOOK 程序先行截获此消息并得到对其的控制权。此时在钩子函数中就可以对截获的消息进行各种修改处理, 甚至强行终止该消息的继续传递。这里自己一开始没有弄明白的地方是, HOOK 的多少是按照 HOOK 的种类来划分的,比如 WH_MOUSE, WH_KEYBOARD 等。但是每一个 HOOK 实质上都由系统维护着一个指针列表,其指针指向 HOOK 的各个处理函数,我们称之为 HOOK 子程。当调用 SetWindowsHookEx() 时在该 HOOK 链的最开始安装一个新的 HOOK 子程, 有时不影响理解时我们也说成是安装一个新 HOOK , 最早的 HOOK 则放在链表的最后( 有点类似于栈)。当 HOOK 监视的消息出现时,操作系统调用链表开始处的第一个 HOOK 子程进行处理,也就是最后加入的 HOOK 优先获得控制权。这里的 HOOK 处理函数必须是一个回调函数, 而且不能定义为类成员函数,必须为普通的 C 函数。在使用钩子时根据其监视范围的不同可以将其分为全局钩子和线程钩子两大类,其中线程钩子指定某个线程 ID (可以是当前线程), 只能监视该线程;全局钩子可以对同一个窗口下的所有线程进行监视。这里的全局 HOO K 的本质还是由触发 HOOK 机制的线程调用自身进程空间中的代码进行处理,所以我们的 HOOK 子程代码必须映射进该线程所在的进程的地址空间, 即通过 DLL 的方式实现。为了方便大家理解,这里我们也给出一个图示: 首先我们编写 HOOK 驱动器,将 映射进内存中, 安装好 HOOK 后, 进行 HOO K 监视: 四、核心函数使用 Windows HOOK 所需要的核心函数不多,只有三个: SetWindowsHookEx() :安装一个 HOOK HOOK 子程: HOOK 的处理函数,如