关于Windows WOW64机制的信息很少,令人惊讶。
我正在研究它。

因此,当我们在32位域中进行系统调用时,它将调用存储在FS中的地址,这会将我们引向带有jmp前缀的怪异033:
如果我理解正确,这jump使我们转移到64地,但仍处于用户模式。跳转到内核模式应该在此之后。

我想跟随此跳转。我的调试器不这样做。我该怎么办?

评论

您在使用x86调试器吗?哪一个?

您是否阅读过Russinovitch等人的“ Windows Internals”。 ?

同样相关:reverseengineering.stackexchange.com/questions/14848/…TLDR:使用WinDbg。

#1 楼

手动执行时,从32位WOW64版本的进程跳转到64位代码的技术通常称为“天堂之门”。通常是通过使用64位功能(例如通过调用64位版本的Windows API来操纵64位进程)或通过恶意软件使调试更加困难而实现的,这恰好是您似乎正在经历的事情;)。

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

大多数用户模式调试器确实由于多种原因不能很好地处理该转换(一个原因是调试器假定使用32位进程,而现在您正在执行64位代码,另一种是用户模式调试API不支持该代码。)TL; DR:针对这种情况的“解决方案”是使用明确致力于支持的调试器进行调试32和64位交错处理。尽管对于内核模式调试器(例如windbg)或同时支持32位和64位模式的其他调试器(x64dbg应该能够做到,尽管我从未尝试过)来说,这通常更容易,但是x64dbg无法做到

天堂之门的简要说明

64位Windows环境中的32位进程中加载​​了一个特殊的DLL,该DLL是wow64cpu.dll。该DLL负责大多数WOW64魔术,尤其是用于在32位进程(WOW64版本的进程)内部实现从32位到64位的转换。本机为64位,所有实用程序,API和低级功能都是使用64位代码实现的(否则拥有64位OS的意义是什么?)。因此,每次WOW64版本的进程需要操作系统帮助时,都必须首先从32位CPU模式转换为64位CPU模式。

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

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

GDT条目4和6仅在设置了几个标志方面有所不同-那些标志控制CPU是否以16、32和64模式执行(嗯,那些GDT条目仅具有标志设置为32位和64位模式,但可以通过类似的方式转换到16位)。

从这里继续下去?

因为这是一个这个话题既庞大又复杂,与我以前相比,我更喜欢将您重定向到相关文章,而不是在这里接触底层细节。以下是一些有用的文章,它们从理论上讲是更正确的:从流程的角度介绍整个WOW64机制,包括如何调试它以了解它的发生。 br />
另一个深入的解释。
Windows Internals丛书。此外,这里还有一些实际的开源实现,它们在33: -ed中本机执行64位代码32位进程:



这是实现一些直接64位OS操作的代码段。

这是一个完整的天堂之门实现。

这是又一个全面的天堂之门实现。


评论


x64dbg无法做到这一点。它是一对调试器,一个用于x86,一个用于x64。两者兼而有之。

– Shmuel Fomberg
17年8月29日在7:49

@ShmuelFomberg感谢您的澄清,因为我说我不知道​​。我会改正我的答案。

– NirIzr
17年8月29日在7:52

WinDbg(x64)可以调试。由于各种技术原因,尚未在x64dbg中实现它。

– mrexodia
17年8月29日在11:41

Derp,您是对的(只需醒来并仔细阅读即可)...但是,您不需要内核模式调试器即可对此进行调试。

– mrexodia
17年8月29日在12:10

我发现了一个库,它确实可以完成我想做的事情:github.com/rwfpl/rewolf-wow64ext

– Shmuel Fomberg
17年3月3日在6:51