令人惊讶的是,关于 Windows WOW64 机制的信息很少。
我正在尝试调查它。
因此,当我们在 32-land 中进行系统调用时,它会调用存储在 中的地址FS
,这导致我们jmp
使用033:
前缀很奇怪。
如果我理解正确的话,这个跳跃将我们转移到 64-land,但仍处于用户模式。跳转到内核模式应该在之后发生。
我想跟随这个跳跃。我的调试器不会那样做。我该怎么做?
令人惊讶的是,关于 Windows WOW64 机制的信息很少。
我正在尝试调查它。
因此,当我们在 32-land 中进行系统调用时,它会调用存储在 中的地址FS
,这导致我们jmp
使用033:
前缀很奇怪。
如果我理解正确的话,这个跳跃将我们转移到 64-land,但仍处于用户模式。跳转到内核模式应该在之后发生。
我想跟随这个跳跃。我的调试器不会那样做。我该怎么做?
当手动执行时,从 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 模式。
长话短说,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 位可以以类似的方式实现)。
由于这是一个大而复杂的话题,我更喜欢将您重定向到相关文章,而不是在这里接触到低级细节,而不是我已经做过的。这里有几篇有用的文章,关于事物的理论方面:
33:
段”的解释。此外,这里有几个在WOW64
-ed 32 位进程中本地执行 64 位代码的实际开源实现: