'mov edi,edi'的用途是什么?


45

我在几个Windows程序的开始就看到了这条指令。 它正在复制一个寄存器到自己,所以基本上,这充当了nop。 这条指令的目的是什么?

+4

本质:它是一个双字节的NOP。因此,您可以在不改变处理器代码的情况下尝试执行这部分代码时自动修补两个字节,而不会导致处理器加载不完整/不正确的指令。 25 3月. 132013-03-25 16:40:20

+10

在x86-64中'mov edi,edi'不是NOP。在x86-64中,它将“rdi”的前32位清零。在32位代码中,mov edi可以用作NOP。 08 4月. 132013-04-08 18:18:44

59

雷蒙德·陈(微软)的博客文章中详细讨论本:

http://blogs.msdn.com/b/oldnewthing/archive/2011/09/21/10214405.aspx

总之,这是为了支持运行时热补丁应用于编译时间增加,所以该功能可以有前两个字节用JMP指令覆盖,将执行重定向到另一段代码。

+3

您应该添加关于'mov edi,edi'指令前5个空字节的注释。 03 10月. 152015-10-03 09:59:30


17

它旨在跳转到特定的位置,在mov指令之前的5个字节。从那里,你有5个字节,这些字节将被修改为跳转到32位内存空间的其他位置。请注意,热补丁时,应首先放置5个字节的跳转,然后可以替换mov。换个角度来说,你冒险把替换后的mov-jmp先运行一下,然后跳到5个字节(这是默认情况下所有的nops,但你永远不知道)。

[此外如下]

关于写5个字节跳 - 也有这个问题的只有一个指令,可以让你写超过4个字节的原子 - CMPXCHG8B,这不是对一个理想的指令目的。如果先写入0xe9,然后再写入双字,那么如果在放置双字之前执行0xe9,则会出现竞争状态。还有另一个首先写出跳远的原因。

  0

通常是NOP或INT3。 30 3月. 132013-03-30 02:06:50

  0

没错,但在INT3的情况下,你绝对不希望意外运行。 05 4月. 132013-04-05 20:41:17


6

courtsey 热修补功能和 第三方补丁呈现中的黑帽子美国2006年通过 亚历山大 索蒂罗夫

什么是热修补的崛起? Hotpatching是一种通过在运行时修改其二进制代码来修改应用程序的行为的方法。它与许多采用 常用技术:

• 调试(软件断点)

• 运行时间检测

• 挂钩Windows API函数

• 修改执行或增加新功能 闭源应用程序

• 而无需重新引导

• 固定安全部署软件更新漏洞

Hotpatches由自动工具 比较原始和修补的二进制文件生成。 已更改的功能包含在扩展名为.hp.dll的文件中。 当正在运行的进程中加载​​热插拔DLL时,易受攻击函数的第一个 指令被跳转到 hotpatch。

/hotpatch编译选项确保的 每功能的第一指令是 MOV EDI, EDI 指令可以是由hotpatch安全 覆盖。较旧版本的Windows不是使用此选项编译的 ,不能进行热补丁。