如何调查 Windows 32/64 位 (WOW64) 转换

逆向工程 视窗 调试 x86 反调试 x64
2021-07-06 06:25:03

令人惊讶的是,关于 Windows WOW64 机制的信息很少。
我正在尝试调查它。

因此,当我们在 32-land 中进行系统调用时,它会调用存储在 中的地址FS,这导致我们jmp使用033:前缀很奇怪
如果我理解正确的话,这个跳跃将我们转移到 64-land,但仍处于用户模式。跳转到内核模式应该在之后发生。

我想跟随这个跳跃。我的调试器不会那样做。我该怎么做?

1个回答

当手动执行时,从 32 位 WOW64-ed 进程跳转到 64 位代码的技术通常被称为“天堂之门”。这通常是为了使用 64 位功能(例如通过调用 64 位版本的 Windows API 来操作 64 位进程)或通过恶意软件使调试更加困难,这恰好是您遇到的情况;)。

在线搜索该术语可能会产生更多结果。

由于多种原因,大多数用户模式调试器确实不能很好地处理这种转换(一个是调试器假定一个 32 位进程,而你现在正在执行 64 位代码,另一个是用户模式调试 API 不支持)。

TL;DR:这种情况的“解决方案”是使用调试器进行调试,该调试器明确支持 32 位和 64 位交错进程。尽管这对于内核模式调试器来说通常更容易),例如windbg,或其他同时支持32位和64位模式的调试器(x64dbg应该可以做到,尽管我从未尝试过如评论中提到的x64dbg无法做到)那)。

天门简述

在 64 位 Windows 环境中,有一个特殊的 DLL 加载到 32 位进程中,这个 DLL 是wow64cpu.dll. 这个 DLL 负责大部分 WOW64 魔法,特别是在 32 位进程(WOW64-ed 进程)内实现从 32 位到 64 位的转换。

这是强制性的,因为操作系统本身是 64 位的,所有实用程序、API 和低级功能都是使用 64 位代码实现的(否则拥有 64 位操作系统有什么意义??)。因此,每当一个 WOW64-ed 进程需要 OS 协助时,它必须首先从 32 位 CPU 模式转换为 64 位 CPU 模式。

那么,转换是如何完成的,你提到的 wow64cpu.dll 与它有什么关系?

长话短说,at 的值fs:[0c0h]被设置为 中的一个地址wow64cpu.dll这个字段被调用WOW32Reserved,它指向一个使用033的特定地址的远跳转将段选择器更改为33( from 23,用于 32 位代码)不会更改代码选择器或基址,您只是更改用于执行目标代码GDT条目,特别是 - 您将第 4 个 GDT 替换为6.

GDT 条目 4 和 6 仅在设置的几个标志上有所不同 - 那些控制 CPU 是否在 16、32 和 64 模式下执行(好吧,那些 GDT 条目仅设置了 32 和 64 位模式的标志,但过渡到16 位可以以类似的方式实现)。

从这里往哪里去?

由于这是一个大而复杂的话题,我更喜欢将您重定向到相关文章,而不是在这里接触到低级细节,而不是我已经做过的。这里有几篇有用的文章,关于事物的理论方面:

  1. “奇怪的跳转到33:段”的解释
  2. 从进程的角度解释整个WOW64机制,包括如何调试它以看到它发生
  3. 对执行的流程的非常简要的解释,以及历史上关键的术语“天堂之门”的文章
  4. 另一个深入的解释
  5. Windows Internals 系列丛书。

此外,这里有几个在WOW64-ed 32 位进程中本地执行 64 位代码的实际开源实现

  1. 是一个实现一些直接 64 位操作系统操作的代码片段。
  2. 是一个完整的天堂之门实现。
  3. 是另一个,后来,完全成熟的天堂之门实施。