Windows桌面应用程序(1-3-3-2nd) WOW64实现细节

WOW64仿真器负责在64位系统上运行32位应用程序,通过提供特定DLL实现用户模式下的系统调用。它包含多个组件如Wow64.dll、Wow64Win.dll等,支持不同架构如x64、Intel Itanium和ARM64。在启动时,加载32位Ntdll.dll并初始化,加载所需32位DLL。环境变量在创建进程时被调整以适应不同架构需求。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

WOW64仿真器以用户模式运行。它提供32位版本的Ntdll.dll与处理器内核之间的接口,并拦截内核调用。 WOW64模拟器包含以下DLL:

  • Wow64.dll提供核心仿真基础结构和Ntoskrnl.exe入口点函数的thunk。
  • Wow64Win.dll为Win32k.sys入口点函数提供了thunk。
  • (仅限x64)Wow64Cpu.dll支持在x64上运行x86程序。
  • (仅限Intel Itanium)IA32Exec.bin包含x86软件模拟器。
  • (仅限Intel Itanium)Wowia32x.dll提供IA32Exec.bin和WOW64之间的接口。
  • (仅限ARM64)xtajit.dll包含x86软件模拟器。
  • (仅限ARM64)wowarmw.dll支持在ARM64上运行ARM32程序。

这些DLL以及64位版本的Ntdll.dll是唯一可以加载到32位进程中的64位二进制文​​件。在ARM上的Windows 10上,CHPE(编译混合可移植可执行文件)二进制文件也可以加载到x86 32位进程中。

在启动时,Wow64.dll加载x86版本的Ntdll.dll(或CHPE版本,如果启用)并运行其初始化代码,该代码加载所有必需的32位DLL。几乎所有32位DLL都是32位Windows二进制文件的未修改副本,但由于性能原因,有些是作为CHPE加载的。编写这些DLL中的一些在WOW64上的行为与在32位Windows上的行为不同,通常是因为它们与64位系统组件共享内存。系统保留超过32位限制的所有用户模式地址空间。有关更多信息,请参阅WOW64下的性能和内存消耗

不使用x86系统服务调用序列,而是重建进行系统调用的32位二进制文​​件以使用自定义调用序列。这个调用序列对于WOW64来说是很便宜的,因为它完全处于用户模式。检测到自定义调用序列时,WOW64 CPU将转换回本机64位模式并调用Wow64.dll。 Thunking在用户模式下完成,以减少对64位内核的影响,并降低可能导致内核模式崩溃,数据损坏或安全漏洞的thunk中的错误风险。 thunk从32位堆栈中提取参数,将它们扩展为64位,然后进行本机系统调用。

环境变量

当64位进程创建32位进程时,或者32位进程创建64位进程时,WOW64会为创建的进程设置环境变量,如下表所示。

进程环境变量
64位进程PROCESSOR_ARCHITECTURE=AMD64或PROCESSOR_ARCHITECTURE=IA64或PROCESSOR_ARCHITECTURE=ARM64
ProgramFiles=%ProgramFiles%
ProgramW6432=%ProgramFiles%
CommonProgramFiles=%CommonProgramFiles%
CommonProgramW6432=%CommonProgramFiles%
Windows Server 2008, Windows Vista, Windows Server 2003 和 Windows XP:
从Windows 7和Windows Server 2008 R2开始添加ProgramW6432和CommonProgramW6432环境变量。
32-bit processPROCESSOR_ARCHITECTURE=x86
PROCESSOR_ARCHITEW6432=%PROCESSOR_ARCHITECTURE%
ProgramFiles=%ProgramFiles(x86)%
ProgramW6432=%ProgramFiles%
CommonProgramFiles=%CommonProgramFiles(x86)%
CommonProgramW6432=%CommonProgramFiles%

Global Hooks

如果满足以下条件,SetWindowsHookEx函数可用于将DLL注入另一个进程:

  • 32位DLL只能注入32位进程,而64位DLL只能注入64位进程。 无法将32位DLL注入64位进程,反之亦然。
  • 32位和64位DLL必须具有不同的名称。
  • DLL和进程的体系结构必须匹配。 例如,您不能将32位x86 DLL注入32位ARM进程。

有关更多信息,请参阅SetWindowsHookEx

请注意,可以在安装挂钩的线程上调用WH_MOUSEWH_KEYBOARDWH_JOURNAL*WH_SHELL和低级挂钩,而不是处理挂钩的线程。 对于这些挂钩,如果32位挂钩位于挂钩链中的64位挂钩之前,则可能会调用32位和64位挂钩。 有关更多信息,请参阅使用挂钩


原文链接:WOW64 Implementation Details

wow64_hook 源码历史更新 --------------------------------------------------------------- 2021/4/16  模块源码1.8.7 更新: 1:重新架构了穿插汇编指令,优化了一些代码和流程 2:在 远程hook64指令_安装()时新增可回调的3个自定义参数值,这些值在回调接口的[寄存器64.自定义值123]里可获取到该值 3:修复 寻找无效8字节指令地址()中一个重要BUG,此BUG极大可能导致之前版本在 远程hook64指令_安装()时即导致目标程序崩溃的现象 本次更新比较重要 建议使用者更新到此版本使用............ --------------------------------------------------------------- 2021/4/15  模块源码1.8.6 更新: 1:新增3组函数:X64_取模块代码区起始地址(),X64_取模块入口地址(),X64_取模块代码执行段大小() 2:自定义类型:模块信息64,的成员构成新增改动为 以下,在枚举模块中亦可直接取得 成员 模块基址, 长整数型, , , 模块映像的内存地址 也称为句柄 成员 模块长度, 整数型, , , 整个模块文件长度 成员 模块入口, 长整数型, , , 模块入口函数地址 如 Mian/DllMain 成员 模块代码入口, 长整数型, , , 模块代码执行区起始地址 成员 模块代码长度, 整数型, , , 模块代码执行区的长度 成员 模块名称, 文本型, , , 文件名称 成员 模块路径, 文本型, , , 完整的路径地址 3:新消息接口()远程返回_调用回调子程序()优化了代码严谨性,减少hook目标崩溃的可能性 4:寻找无效8字节指令地址()由之前的全模块查找 改动为 在模块代码执行区查找 5:改写模块实列为 一对多的模式 6:模块实列操作控件的方式由变量改为堆内存,避免引起多线程自身崩溃 7:模块实列 对 recv,recvfrom两个函数的hook方式由原先 在回调内 暂停recv-->recv_call-->恢复recv,的方式改为经过特殊改造的 recv_call,这个call经过特殊处理,在recv回调函数内调用,用来取得真实长度,这个调用会绕过hook置,所以不会触发 recv回调,详见源码 8:修改了一些已知可能出现的问题 --------------------------------------------------------------- 2021/4/12 模块源码 v1.8.2更新 1:修复 x64_远调用函数()在 易语言 主线程调用时造成消息无法回调,导致易语言主线程窗口卡死的问题。      感谢楼下易友发现的BUG,已经第一时间更新 --------------------------------------------------------------- 2021/4/12 模块源码 v1.8.1更新 1:修复 hook全部卸载时的流程写法的一个错误,由于句柄的提前关闭导致多个hook点卸载不干净的问题 2:改写了消息回调时线程传参的代码优化,优化了其他一些小问题 3:  鉴于很多朋友需要,改写了模块自带实列,对TCP,UDP的两组封包函数做了hook实列写法 4:列子中同样增加对x64_远调用函数()的应用写了几个列子,如使用套接字取得本地或远端IP端口API调用的的应用实列 5:本hook模块不支持非模块内存区hook,如申请的动态分配页等,不是不能支持,只是觉得没有任何意义,对这方面有需求的,自行改写模块源码使用 提醒:hook回调函数中尽量减少耗时代码,时间越长返回越慢,回调中谨慎操作控件,如必须要用到可参考源码中实列写法采用线程操作 --------------------------------------------------------------- 2021/3/1   模块源码v1.6更新: 1:修复  x64_远程调用函数()命令,在没有提供 寄存器 参数时,没有返回值的BUG。 --------------------------------------------------------------- 2021/2/28 模块源码v1.5更新: 一:修复win7 64系统下枚举模块 出现部分模块长度出现负数的问题,从而导致部分win7用户不能使用 二:强化 远程hook64指令_安装 的稳定性:        1,穿插代码中增加对标志的保护,避免hook置长度下一条指令为跳转时产生跳转错乱的问题,强化了hook任意置的定        2,因为穿插代码中会调用AP
现在源码里自动判断v4.0.3.36 v4.0.3.39 v4.0.3.40 也就是说上面三个版本全部都支持!!! 众所周知VX4.0已经重构,大概从 v4.0.3.19 版本起,产品脱离测试阶段,转为正式版。 目前(截止发帖2025年4月16日 22:24:34)已经发布 v4.0.3.39 版本,官网可下载到,如官网又更新了新版本,可以到源码里备注的地址下载4.0.3.39版本安装包。 之前有研究一段时间3.9版本,最新版本号3.9.12.51可能以后再也不会更新了,所以现在要开始学习4.0版本。 无奈本人技术有限,目前只能勉强做到HOOK实时消息、获取登录用户信息、获取所有联系人信息列表、实现多开和消息防撤回 研究VX纯属个人兴趣爱好,没有任何商业相关,如有志同道合的朋友可以加我一起交流。 源码内相关功能我已经自己正常使用长达10个月多,从未出现过封号或限制登录等情况! 源码相关: 一、多开和消息防撤回:通过修改dll2个字节实现,一次修改永久生效。可以在已经登录了之后再同时打开多个。 二、获取登录用户信息:直接读取偏移地址读出wxid、account、昵称、手机号、签名、数据文件路径 三、获取所有联系人信息:用到了搜索,所以联系人很多的话可能要几秒时间吧 四、HOOK实时消息:可惜的是没找到图片消息的图片文件名(3.9.12.51是可以取到的),可能是我Hook点不对吧,xml消息里cdnthumbaeskey和cdnthumburl也不知道怎么拿来下载图片 源码内使用模块说明(已全部一起打包):精易模块[v11.1.5].ec、wow64_hook_3.32_修正.ec、特征码模糊搜索Ex.ec 前面2个不用讲也知道,特征码模糊搜索Ex.ec这个模块是我从别的模块里复制粘贴出来的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值