我注意到Windows 7 x64 WOW64上的用户模式下有一个内存区域,该区域在系统调用期间发生变化。它位于地址空间中非常低的位置,具有堆栈的特性,即它以较大的保留区域,页面保护和几页R / W开始。只有一个线程在运行,并且它有自己的堆栈,所以我认为它不是连接的。 struct而不修改地址空间的任何其他内容,即使这样,存储区域也会随着分散在此处和此处的某些更改而更新。有人知道这是什么吗?

我还注意到,当有两个线程时,还会有另一个这样的隐藏区域,所以它可能是每个线程的。 >
任何有关Windows标准内存布局的文档都很棒。

评论

您能否更具体一点?您是怎么看的?内容是什么?怎么改变?您能否在图像中包含某种内存映射?

#1 楼

在系统调用期间不会发生这种情况。它发生在用户模式下。

WOW64进程具有两个用户模式堆栈-一个32位堆栈(通常使用的堆栈)和一个64位堆栈。 WOW64 ntdll不会进行系统调用。在本地32位ntdll将sysenter(通过间接调用SharedUserData!SystemCallStub)的地方,WOW64 ntdll具有对wow64cpu!X86SwitchTo64BitModecall dword ptr fs:[0C0h])的间接调用。

此函数与一个特殊的选择器相差很远,导致从32位模式切换到64位模式。然后,WOW64层将复制参数,扩展所有必要内容,等等,然后进行真正的系统调用。

我敢打赌,您使用了32位调试器来调试您的WOW64进程和32位调试器未显示模式转换。不可以但这仍然在用户模式下发生。

WOW64上任何最基本的资源都可以告诉您这一点,并且您应该能够自行猜测。用户模式组件负责模式转换并仅将内核保持在64位,而不是让内核处理来自32位和64位模式的系统调用,这是更为合理的。

MSDN页面WOW64实现细节实际上说明了这两个方面:自定义调用顺序。对于WOW64而言,此调用序列是廉价的,因为它完全处于用户模式。当检测到自定义调用顺序时,WOW64 CPU会转换回本机64位模式并调用Wow64.dll。在用户模式下执行thunk,以减少对64位内核的影响,并减少thunk中可能导致内核模式崩溃,数据损坏或安全漏洞的bug的风险。 thunk从32位堆栈中提取参数,将其扩展到64位,然后进行本机系统调用。


最后一句话是我的。它没有明确指出参数的提取和扩展是在单独的堆栈上完成的,但这并不是一个疯狂的猜测。

评论


是的,我使用的是32位调试器。我一直以为WOW64开关是一个非常薄的包装器,因此它具有64位堆栈的概念似乎很陌生,但是显然还有更多的方法。现在,我已经使用64位调试器进行了验证,您的建议已得到体现。谢谢,真的很有帮助!

– Mikubyte
17年3月15日在8:31



#2 楼

您可以使用内核调试器并在该区域上设置硬件断点以捕获对该区域的访问(用户模式调试器无法捕获对内核的访问)。希望能给你一些线索。