• henfredemars@infosec.pub
      link
      fedilink
      English
      arrow-up
      7
      ·
      edit-2
      8 months ago

      Fascinating question you’ve asked! The answer is quite complicated. Skip to the end of my post for TLDR.

      First, let’s review the purpose of WoW64. This is a compatibility layer that enables 32-bit applications to work with a 64-bit Windows installation. More concretely, it appears to enable applications that are compiled for the binary x86 architecture to work with with Windows operating system that is compiled for x64. Interfaces to the operating system have changed, so a translation layer is needed to talk to 64-bit Windows.

      Please note that I’m talking about the common case and ignoring the implementation of WoW64 on Itanium because this version of WoW64 never saw wide consumer adoption. For our purposes I’m considering specifically the x86/64 variants only and pretending Itanium never existed like Intel would like us to believe today to keep the explanation simple.

      There’s a temptation to think that this is the same problem as running 32-bit ARM on 64-bit hardware. It’s similar in the sense that you are trying to run in 64-bit mode, but if you examine the differences between x86 and x64 and then compare something like Armv7-A (32-bit) and Armv9 (64-bit) on these upcoming chips, you’ll notice an extremely important difference between their Intel counterparts.

      These 64-bit chips can’t decode the 32-bit instructions! You cannot feed the instruction stream to this hardware. It doesn’t look like anything it knows how to execute. It’s so different that it’s completely unreadable.

      With Intel or Amd, you can simply directly execute 32-bit binary code on the 64-bit CPU (and 16-bit too!) and fix up interactions with other binaries. In the ARM version of the problem, the CPU can’t understand the instruction stream at all. You can’t just set it back to 32-bit mode and translate system calls. You’re going to have to rewrite it.

      WoW64 is like someone from New York learning to talk to an American with a deep southern accent. New Armv9 chips trying to execute 32-bit code is like an American learning German. I’d argue they’re not even the same language. This kind of binary translation is significantly more challenging because your new CPU cannot understand the 32-bit instructions whereas your 64-bit Intel chip still has the hardware to understand the legacy instructions.