Какова цель «mov edi, edi»?


45

Я вижу эту инструкцию в начале нескольких программ Windows. Это копирование регистра на себя, поэтому в основном это действует как nop. Какова цель этой инструкции?

+4

Сущность: это двухбайтовый NOP. Таким образом, вы можете исправить два байта атомарно, не загружая процессор неполной/неправильной инструкцией, когда он пытается выполнить эту часть кода во время его изменения. 25 мар. 132013-03-25 16:40:20

+10

В x86-64 'mov edi, edi' не является NOP. В x86-64 он обнуляет верхние 32 бита 'rdi'. В 32-битном коде 'mov edi, edi' может использоваться как NOP. 08 апр. 132013-04-08 18:18:44

59

Рэймонд Чен (Microsoft) имеет запись в блоге обсуждал это в деталях:

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

Короче говоря, это время компиляции дополнение применяется для поддержки во время выполнения горячих заплаток, так что функция может иметь первые два байта, переписанные инструкцией JMP, перенаправляют выполнение другому фрагменту кода.

+3

Возможно, вы должны добавить примечание о 5 пустых байтах, предшествующих инструкции «mov edi, edi». 03 окт. 152015-10-03 09:59:30


17

Предназначен для определения местоположения , 5 байт до команды mov. Оттуда у вас есть 5 байтов, которые предназначены для изменения в длинном прыжке в другое место в 32-битной памяти. Обратите внимание, что при горячем исправлении сначала следует разместить этот 5-байтовый скачок, а затем mov можно заменить. Идя в другую сторону, вы рискуете сначала заменить mov-jmp, и прыгните на 5 байтов, что бы там ни было (все по умолчанию, но вы никогда не знаете).

[дополнение следует]

Что касается написания скачки 5 байт - есть также проблема есть только одна команды, которая позволит вам писать более чем 4 байта атомарно - CMPXCHG8B, и это не идеальная инструкция для цель. Если вы сначала напишите 0xe9, а затем dword, тогда у вас есть условие гонки, если 0xe9 выполняется до того, как вы поместите dword. Еще одна причина сначала написать длинный прыжок.

  0

Это, как правило, NOP или INT3. 30 мар. 132013-03-30 02:06:50

  0

Правильно, но в случае с INT3 вы определенно не хотите запускать это случайно. 05 апр. 132013-04-05 20:41:17


6

courtsey HotPatching и подъем Сторонние Патчи презентации на BlackHat США 2006 года Александр Сотирова

Что HotPatching? Hotpatching - это способ изменения поведения приложения путем изменения его двоичного кода во время выполнения. Это распространенный метод со многими областями:

• отладки (программные точки останова)

• выполнения приборов

• перекинув функции Windows API,

• модифицирующих исполнение или добавление новая функциональность до с закрытыми источниками

• развертывание обновления программного обеспечения без перезагрузки

• фиксирующей безопасности уязвимость

Hotpatches генерируется с помощью автоматического инструмента, который сравнивает исходные и исправленные двоичные файлы. Функции, которые были изменены , включены в файл с расширением .hp.dll. Когда загружаемая версия hotpatch загружается в запущенном процессе, первая команда уязвимой функции заменяется на прыжок до hotpatch.

Опция компилятора /hotpatch гарантирует, что первая инструкция каждая функция является мов еди, еди инструкция, которая может быть безопасно перезаписаны hotpatch. Старые версии Windows не являются , скомпилированными с этой опцией и не могут быть hotpatched.