x64 操作系统上的 Windows x86 兼容性

逆向工程 视窗 x86 x64 核心 仿真
2021-06-28 17:55:57

我对 wow64 系统有一些了解,在 x64 windows 版本中,我查看了这个 wow64* dll,看看实际的系统调用转换是如何发生的,但我找不到的东西,这可能是由 windows 内核完成的,是如何实际的 x86 汇编指令处理是否有效?我知道进程有两个选择器,x86 为 0x23,x64 为 0x33,内核如何处理进程的 0x23 选择器中的汇编代码?是否有某种虚拟机可以使用 x64 指令模拟 x86 指令?

1个回答

不需要仿真,因为 x64 处理器可以使用所谓的兼容模式本机执行 x86(32 位)代码您只需要在 GDT 中设置适当的描述符(L=0 表示 32 位代码,L=1 表示 64 位代码)并且它“正常工作”。这就是 Windows 所做的。例如,从这个 OSR post,windows 7 x64 GDT 有这些条目:

GDT[0x04] = 32 bit ring 3 Code: Execute/Read
GDT[0x05] = 32 bit ring 3 Data: Read/Write, Accessed
GDT[0x06] = 64 bit ring 3 Code: Execute/Read, Accessed

索引4对应选择器0x23(4*8=0x20),6对应0x33(6*8=0x30)。

因此,通过切换到选择器 0x23,您可以让 CPU 作为 x86 执行您的代码,然后通过切换到 0x33 返回到 x64。

wow64cpu.dll包含 32 位和 64 位代码,负责在 x64 和 x86 之间切换时所需的大部分内务处理。内核本身是 x64 only AFAIK,仅在用户模式下支持 32 位代码。

有关 Wow64 实现的更多详细信息,请参阅 George Nicolaou 的这篇不错的文章:

http://rce.co/knockin-on-heavens-gate-dynamic-processor-mode-switching/