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 process | PROCESSOR_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_MOUSE,WH_KEYBOARD,WH_JOURNAL*,WH_SHELL和低级挂钩,而不是处理挂钩的线程。 对于这些挂钩,如果32位挂钩位于挂钩链中的64位挂钩之前,则可能会调用32位和64位挂钩。 有关更多信息,请参阅使用挂钩。