谁知道"mov edi,edi"有什么用?

COM*_*Mer 12 x86 assembly mov

69A8AB13  int         3    
69A8AB14  int         3    
69A8AB15  mov         edi,edi 
69A8AB17  push        ebp  
69A8AB18  mov         ebp,esp 
Run Code Online (Sandbox Code Playgroud)

mov edi,edi 对我来说没有意义,它是为了什么?

sno*_*one 32

这是一个2字节的NOP指令.它包含在使用/ hotpatch选项编译的映像中的任何函数的开头:

http://msdn.microsoft.com/en-us/library/ms173507.aspx

斯科特

  • 这是一种"无操作",换句话说它根本不做任何事情.它只是在函数的开头提供了一些空间,这样O/S中的hotpatching支持就有了放置Detours样式钩子的地方.两个字节实际上只有足够的空间用于短的相对跳转,因此在函数之前也会添加一些空格(钩子会在执行长跳转的函数之前跳转到一个位置). (5认同)
  • 你会知道@COMer,如果你读了@snoone提供的链接. (2认同)
  • 这是一个非常低效的NOP选择;为什么他们不使用真正的 NOP“66 90”? (2认同)

Jea*_*ach 5

根据此页面:StackExchange 的逆向工程

在 x86-64 mov edi 中,edi 不是 NOP。在 x86-64 中,它将 rdi 的前 32 位清零。

我认为指出这一点很重要,以补充snoone的答案。