这个系统调用的跳转指令是什么?

问题描述

我想看看系统调用是如何在 x64 Windows 系统上的 x86 下进行的,因为我已经熟悉它是如何在 x64 上完成的。

无论如何,当我遇到这个我不理解的 jmp 指令时,我正在逐条指令。这是我观察到的调用堆栈:

ntdll.dll!_Wow64SystemServiceCall@0()
ntdll.dll!_NtReadVirtualMemory@20()
KernelBase.dll!ReadProcessMemory()

然后,有一个 jmp dword ptr [_Wow64Transition]。这就是我感到困惑的地方。在跳转之后,有一条指令jmp 0033::77CE7009。由于某种原因,进入此说明将回到 ntdll.dll!_NtReadVirtualMemory@20() 的末尾。

这是什么跳远,它有什么作用?

解决方法

您尝试使用 32 位调试器调试 seg:off jmp。指令被设计困在内核模式并被转换成 64 位代码。 32 位调试器无法继续调试,调试 API 实际失败,直到程序再次返回 32 位代码。

如果你有一个 64 位调试器,你可以一直调试到系统调用。