gpt4 book ai didi

winapi - AMD64 jmp (FF25) 之前 REX.w 前缀的含义

转载 作者:行者123 更新时间:2023-12-02 11:50:26 24 4
gpt4 key购买 nike

在解决 bug 时,我发现两个 Win64 DLL 的导入跳转表之间存在差异。 64 位版本的 kernel32.dll 在其导入跳转表中使用普通的 FF25 jmp 指令。另一方面,64 位版本的 advapi32.dll 使用 48FF25,表示 jmp 之前的 REX.w=1 前缀> 操作码。然而,两者似乎都有指定 RIP+偏移地址的 32 位操作数。

此特定操作码上的 REX.w 前缀有什么含义吗?

我不经常使用机器代码,因此请原谅任何事实错误。

最佳答案

REX.W 前缀被忽略。在 64 位模式下,FF/4 操作码始终具有 64 位操作数 (JMP r/m64),因此操作数大小会更改前缀 (REX.W, 66 )没有效果。

出现此 REX.W 前缀的原因可能是为了符合 Microsoft 的 x64 调用约定有关展开的规则。跳转导入 stub 实际上是一个单指令函数,并且由于 Windows 上的异常是异步的,它们可能随时发生,因此在执行此函数时可能会生成异常。 Microsoft 放置了多个 restrictions on instructions used at the start and end of functions 。特别是,该函数必须以仅包含某些指令的尾声结束。根据Kevin Frei's blog在 MSDN 上,如果最后一条指令是间接跳转,则必须使用 REX.W 前缀:

One other note: if the final jmp isn’t an ip-relative jmp, but an indirect jmp, it must be preceded by the REX prefix, to indicate to the OS unwind routines that the jump is headed outside of the function, otherwise, the OS assumes it’s a jump to a different location inside the same function.

使用 REX.W 之间的不一致可能是因为上述规则与 Microsoft 官方文档对最终 JMP 指令的要求并不完全一致:

Only a subset of jmp statements are allowable in the epilog. These are exclusively of the class of jmps with ModRM memory references where ModRM mod field value 00. The use of jmps in the epilog with ModRM mod field value 01 or 10 is prohibited.

请注意,由于这会排除不使用 ModR/M 编码的相对 JMP 指令(这是结束函数的最常见类型的 JMP),因此我倾向于认为这是官方文档,此处存在错误.

造成不一致的其他可能原因是 Microsoft 的展开程序专门处理导入跳转 stub ,或者没有 REX.W 前缀的跳转 stub 是一个错误,并且会导致程序在发生异常时在极不可能的情况下终止当他们被处决时。

关于winapi - AMD64 jmp (FF25) 之前 REX.w 前缀的含义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36788685/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com