我正在研究它。
因此,当我们在32位域中进行系统调用时,它将调用存储在
FS
中的地址,这会将我们引向带有jmp
前缀的怪异033:
。如果我理解正确,这jump使我们转移到64地,但仍处于用户模式。跳转到内核模式应该在此之后。
我想跟随此跳转。我的调试器不这样做。我该怎么办?
#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
评论
您在使用x86调试器吗?哪一个?您是否阅读过Russinovitch等人的“ Windows Internals”。 ?
同样相关:reverseengineering.stackexchange.com/questions/14848/…TLDR:使用WinDbg。