很多人对windows钩子比较熟悉,也可以轻易的写出一个全局钩子程序。但是一个32位钩子是否可以捕获64位进程的消息呢?又或者64位钩子能否捕获32位进程的消息呢?下面我们分析一下。

MSDN在对SetWindowsHookEx函数有如下说明:

SetWindowsHookEx can be used to inject a DLL into another process. A 32-bit DLL cannot be injected into a 64-bit process, and a 64-bit DLL cannot be injected into a 32-bit process. If an application requires the use of hooks in other processes, it is required that a 32-bit application call SetWindowsHookEx to inject a 32-bit DLL into 32-bit processes, and a 64-bit application call SetWindowsHookEx to inject a 64-bit DLL into 64-bit processes. The 32-bit and 64-bit DLLs must have different names.
Because hooks run in the context of an application, they must match the "bitness" of the application. If a 32-bit application installs a global hook on 64-bit Windows, the 32-bit hook is injected into each 32-bit process (the usual security boundaries apply). In a 64-bit process, the threads are still marked as "hooked." However, because a 32-bit application must run the hook code, the system executes the hook in the hooking app's context; specifically, on the thread that called SetWindowsHookEx. This means that the hooking application must continue to pump messages or it might block the normal functioning of the 64-bit processes.

首先解释的一点是如果安装hook的进程没有调用UnhookWindowsHookEx而提前结束掉,windows消息hook还有效吗?答案是无效的,之后启动的进程不会被注入hook dll,已注入hook dll的进程会注销钩子、卸载hook dll。

32位dll是不能注入到64位进程中,同理64位dll不能注入到32位进程中。如果32位进程调用SetWindowsHookEx 注入32位dll,其只能注入到32位进程中,虽然不能注入到64位进程,但是64位进程的线程依然被标注为hooked。当64位进程产生需要被hook处理的事件时,系统会在调用SetWindowsHookEx函数的进程(严格的说是线程)中执行hook例程。这要求调用SetWindowsHookEx的线程拥有一个消息泵,否则会阻止64位进程的执行。

据我的推测,要求调用SetWindowsHookEx的线程拥有一个消息泵,是因为64位进程通过windows消息向调用SetWindowsHookEx的线程发送windows消息,通知钩子事件发生。如果这个线程没有处理消息,通信阻塞,64位进程挂起。如果此时安装hook的进程结束掉,64位进程继续执行。

注:64位进程安装hook,对32位目标进程的影响同上。

如果系统针对某些钩子同时安装了32位hook dll及64位hook dll,那hook例程怎么执行呢?在先安装64位hook dll再安装32位hook dll的情况下,32位hook位于hook 链表的顶端。如果某个32位进程产生了hook事件,就会在其进程上下文中执行hook例程,执行完毕后交由下一个消息钩子执行。如果下一个消息钩子是64位hook dll,则向安装此hook的线程发送消息,在安装hook的线程上下文中执行hook例程。如果是64位进程产生了hook事件,则向安装顶端32位hook的线程发送消息,交由此线程执行hook例程,执行完毕后由下一个消息钩子执行。在我的测试中,即便下一个消息钩子为64位进程安装,依然是向此安装hook的64位进程发送消息处理hook。

在先安装32位hook dll再安装64位hook dll的情况下,64位hook位于hook 链表的顶端。如果某个64位进程产生了hook事件,就会在其进程上下文中执行hook例程,执行完毕后交由下一个消息钩子执行。如果下一个消息钩子是32位hook dll,则向安装此hook的线程发送消息,在安装hook的线程上下文中执行hook例程。如果是32位进程产生了hook事件,则向安装顶端64位hook的线程发送消息,交由此线程执行hook例程,执行完毕后由下一个消息钩子执行。在我的测试中,即便下一个消息钩子为32位进程安装,依然是向此安装hook的32位进程发送消息处理hook。

MSDN文档中说The 32-bit and 64-bit DLLs must have different names. 在我的测试及我搜索的文档中,这是不必须的。

问题来了,如果在安装hook的进程中执行hook例程怎么确认究竟是哪个进程产生的hook事件呢?

windows钩子在64位系统下行为分析相关推荐

  1. 关于Windows 7的64位系统不兼容某些控件的问题

    我的问题是vsflex7.ocx 不能在64位系统下运行,导致软件的一个涉及到这个控件的功能出错. 如下: 解决的办法基本思路是把这个控件注册一下.然后就可以了. 就是这个控件: 目录中没有自己下载个 ...

  2. Windows 32、64位系统编译器各数据类型大小和字节对齐关系

    何为32位64位? 32位64位其实就是32bit 64bit ,32位cpu单次处理指令4字节,64位8字节,因为1字节=1byte=8bit(32/8=4字节,64/8=8字节) 32位编译器:3 ...

  3. windows 2008 R2 64位系统杀毒软件

    微软免费64位杀毒软件  Forefront Client Securit 软件下载地址 http://download.microsoft.com/download/d/c/b/dcb3f88c-6 ...

  4. Windows系统的32位和64位系统区别

    第一,设计初衷不同 64位的操作系统原本的初衷就是为了满足视频剪辑.三维动画.特效渲染.机械设计.高速运算等生产使用和前沿科技,换句简明的话说就是:它们是高科技人员使用本行业特殊软件的运行平台.32位 ...

  5. win7原版iso_【JUJUMAO_MSDN系统】Windows 10 1903 64位 五版合一 原版ISO镜像

    [JUJUMAO_MSDN系统]Windows 10 1903 64位 五版合一 原版ISO镜像  MSDN系统具有更安全.更稳定.更纯净等特点,设置布局更加突出完美,采用全新技术,全自动无人值守安装 ...

  6. 五种方法安装Windows 7 64位系统

    安装64位硬件要求: 一.安装64位位操作系统的CPU的要求: 安装64位位操作系统首先CPU必须支持64位操作系统,目前来看AMD的CPU必较好确定.只要是针脚是939.940,938,1207的C ...

  7. hpoem系统服务器,hp(惠普)Windows 7 32/64位-OEM版

    hp(惠普)Windows 7 32/64位-OEM版 一.系统概述 惠普-集成常见硬件+预PE下一键全自动安装,自动识别隐藏分区,方便快捷,系统兼营性.稳定性.安全性较均强!完全无人值守自动安装.安 ...

  8. 【安装win7 64位系统】- 出现《Windows安装程序无法将Windows配置为在此计算机的硬件上运行》错误-解决方法

    安装win7 64位系统出现<Windows安装程序无法将Windows配置为在此计算机的硬件上运行>错误的解决方法 出现的原因 解决办法 分割线:以下为查找的资料 博主用U盘安装台式wi ...

  9. Windows 64位系统System32目录和SysWOW64目录的区别

    引用自:什么是SysWow64 结论 在32位操作系统的Windows文件夹中,SYSTEM和SYSTEM32两个文件夹,分别用来存放16位和32位的DLL文件. 在64位操作系统的Windows文件 ...

最新文章

  1. 山寨上网本溃败的两点教训
  2. celery源码分析-定时任务
  3. mysql 视图 字符集_MySQL创建子视图并查看的时候,字符集报错问题
  4. 记录 之 跨服务器上传和下载文件
  5. Cloud一分钟 | 微软Azure云服务宣布又一重磅应用落地;微软云计算转型迅猛,或助其市值短期达到1万亿美元...
  6. lua运算与php运算符,Lua 运算符
  7. cpu —>内存—>硬盘这种方式是不是更慢?
  8. 小程序入门学习18--springboot环境配置02
  9. SylixOS 内存管理源代码分析--pageLib.c
  10. DEBUG模式下,视频丢包严重;RELEASE就好了
  11. 添加solr库工具类
  12. matlab中如何求导数,matlab如何求导数
  13. ruby + cucumber环境搭建
  14. 千锋python培训班怎么样
  15. 八. geotrellis使用 矢量数据栅格化
  16. B+树|MYSQL索引使用原则
  17. leetcode每日一题 911在线选举
  18. 通过RGB或YUV改变图像的色度和饱和度
  19. 《惢客创业日记》2021.06.21-22(周一)创业者融资成本有多高?
  20. 取模运算(包括负数)

热门文章

  1. Linux聊天室项目知识整理(一)
  2. day15笔记:抽象类和抽象类方法、接口、内部类
  3. 云计算和虚拟机(VMWare)有什么区别?
  4. Matlab修改字体方法,解决中文乱码问题
  5. [css]版心和布局流程
  6. Python3 pip安装-Star.hou
  7. 蓝汛之5365脚位图
  8. yp集之p8简单数论
  9. 值得学习的100个网站推广方法
  10. 百度搜索屏蔽掉右侧的推荐