- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在解决 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/
我正在 C 中的一些 asm 代码中执行相对跳转。我已经让跳转按预期工作,但它会在跳转发生并完成运行代码后立即返回。 #include void function() { asm("jmp
我需要为漏洞利用演示制作一个跳转操作码。 我需要在跳转指令之后跳转到大约 200 个字节。这对于 jmp short 来说太多了。 如果我生成一个带有常规跳转的操作码,jmp $200 我得到这个:
在 AT&T 汇编语法中,文字值必须以 $ 符号为前缀 但是,在内存寻址中,文字值没有$ 符号 例如: mov %eax, -100(%eax) 和 jmp 100 jmp $100, $100 不同
尽管这两个程序都遵守 shellcode 执行所需的相对寻址指令,并且都在执行时打印所需的消息,但当用作 shellcode 时,2nd Sample 失败了。谁能解释这种行为?奇怪的是,与第一个相同
我听说使用 jmp -2 我们可以进行无限循环。这听起来很奇怪,但是在解释了相对跳转需要一个字节之后,下一条指令地址(eip)将比 jmp 地址少 2 个字节。所以,我决定实现它,但我无法让它发挥作用
我偶尔会使用汇编。因此,我需要更专家的帮助来解码我必须处理的一小段代码。 0000: 48 ff 25 61 57 07 00 rex.W jmp QWORD PTR [rip+0x75761
当程序集有像 jmp f 这样的指令时,堆栈和帧指针会发生什么? 我的意思是 - f 是内存中的标签,对吗?我们如何跳转到内存中的不同地址而不更新我们的帧和堆栈指针... 编辑:我说的是 Intel
好的,所以我一直在尝试在汇编/C 中制作一个两步引导加载程序,但我无法让 JMP 工作。起初我以为读取失败了,但是经过以下测试我排除了这种可能性: __asm__ __volatile__(
我正在尝试计算跳转的正确操作码,我在其他线程中看过这个,但我仍然不明白: 我以为公式是desination - (from+5)但它只是不工作,它很远,这是我想跳转到/从的地址: FROM: 6259
我正在尝试编写一个 exe 打包程序/保护程序,作为了解有关汇编程序、C++ 以及 PE 文件工作原理的更多信息的一种方式。我目前已经让它工作了,所以包含 EP 的部分与一个 key 进行异或,并创建
我只是在看我用 C 编写的一个简单 exe 的 .text 部分,我只是想弄清楚一些 x86 操作码的结构。 从我一直在阅读的内容来看,0xe9 似乎是相对跳转 (JMP) 的单字节操作码,但是我不确
所以我在 %eax 有一个地址我想 jmp 到但代码无法编译,有没有办法解决这个问题? movl 0xdeadbeef, %eax jmp %eax ; <--- compile error: typ
对JMP机器指令的十六进制代码转换有疑问。我有我想跳转到的绝对地址,比如“JMP 0x400835”。 首先,这是允许的吗?如果是,相应的十六进制代码是什么? 如果没有,我可以先将地址存储在某个寄存器
在 Google Native Client 的论文中,作者定义了一个 nacljmp如这两条指令: and $0xffffffe0, %eax # Clears the 5 least si
我试图从 Bootloader 编写引导加载程序。编写的代码是 BITS 16 start: mov ax, 07C0h ; Set up 4K stack space after
我被告知尝试使用“jmp”而不是“call”,但是“jmp”不喜欢我..当我跳跃时它不会返回(所以它永远不会退出并且不快乐的日子),但是调用会返回并正常退出。 我很高兴使用“call”,但实际上我应该
我正在尝试用 java 分析一个简单的应用程序,它基本上只打开一个 RMI 接口(interface)并等待消息。当我通过 TIJMP 打开应用程序时,它从头开始报告: 堆:init - 0,已用 -
如何使用jump family指令? 这就是他们所拥有的: JL label "It" jumps if it is less than or if it is not larger than or
在为 x86 平台构建汇编器时,我在编码 JMP 指令时遇到了一些问题: OPCODE INSTRUCTION SIZE EB cb JMP rel8 2 E9 cw
我正在查看 IDA 中的一个程序,试图弄清楚某个函数是如何工作的,这时我遇到了这样的事情: ; C_TestClass::Foo(void) __text:00000000 __ZN14C_TestC
我是一名优秀的程序员,十分优秀!