Подтвердить что ты не робот

Какова цель опционного кода?

Я собираюсь через MSIL и замечаю, что существует много nop. В статье MSDN говорится, что они не предпринимают никаких действий и используются для заполнения пробела, если код операции исправлен. Они используются намного больше в отладочных сборках, чем в выпусках. Я знаю, что эти типы операторов используются в языках ассемблера, чтобы убедиться, что код операции соответствует границе слова, но зачем это нужно в MSIL?

4b9b3361

Ответ 1

NOP выполняют несколько целей:

  • Они позволяют отладчику помещать точку останова на строку, даже если она объединена с другими в сгенерированном коде.
  • Он позволяет загрузчику исправлять скачок с помощью смещения цели другого размера.
  • Он позволяет выровнять блок кода на определенной границе, что может быть полезно для кэширования.
  • Он позволяет инкрементную привязку к перезаписывать куски кода вызовом нового раздела, не беспокоясь об изменении общей функции.

Ответ 2

Здесь как nops используются отладки:

Nops используются компиляторами языка (С#, VB и т.д.) для определения неявных точек последовательности. Они сообщают компилятору JIT, где обеспечить, чтобы машинные инструкции могли отображаться в соответствии с инструкциями IL.

Запись блога Рика Байера DebuggingModes.IgnoreSymbolStoreSequencePoints, объясняет некоторые подробности.

С# также помещает Nops после инструкций по вызову, так что местоположение возвращаемого сайта в источнике - это вызов, а не строка после вызова.

Ответ 3

Он предоставляет возможность для линейных маркеров (например, точек останова) в коде, в котором релиз-сборник не будет генерировать.

Ответ 4

Чувак! Нет-op - это потрясающе! Это инструкция, которая ничего не делает, кроме потребления времени. В тускло-темные века вы должны использовать его для микроадаптации по времени в критических циклах или, что более важно, в качестве наполнителя в самомодифицируемом коде.

Ответ 5

Он также может ускорить выполнение кода при оптимизации для конкретных процессоров или архитектур:

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

В этих обстоятельствах выделенный nop может заставить следующую команду в конкретный конвейер (первый или не первый) и улучшить сопряжение следующих инструкций, так что стоимость nop больше, чем амортизируется.

Ответ 6

Одно из классических применений для них заключается в том, что ваш отладчик всегда может связывать строку исходного кода с инструкцией IL.

Ответ 7

Они могут использовать их для поддержки редактирования и продолжения во время отладки. Он предоставляет отладчику возможность работать, чтобы заменить старый код новым без изменения смещений и т.д.

Ответ 8

Nop имеет важное значение в полезной нагрузке эксплойтов переполнения буфера.

Ответ 9

Как сказал ddaa, nops позволяют вам учитывать отклонения в стеке, так что, когда вы перезаписываете обратный адрес, он перескакивает на nop sled (много nops в строке), а затем корректно удаляет исполняемый код, а не переходя к некоторому байту в инструкции, которая не является началом.

Ответ 10

50 лет слишком поздно, но эй.

Nop полезны, если вы вводите код сборки вручную. Если вам нужно было удалить код, вы могли бы заблокировать старые коды операций.

similary, вы можете вставить новый код, перезаписав некоторый код операции и перепрыгните куда-нибудь еще. Там вы помещаете перезаписанные коды операций и вставляете свой новый код. Когда будете готовы, отпрыгните назад.

Иногда вам приходилось использовать доступные инструменты. В некоторых случаях это был очень простой редактор машинного кода.

В настоящее время с компиляторами методы больше не имеют смысла.

Ответ 11

В сценарии взлома программного обеспечения классический метод разблокировки приложения должен заключаться в патче с NOP-строкой, которая проверяет наличие ключа или регистрации или периода времени или что-то не делает ничего, и просто продолжает запускать приложение, как будто он зарегистрирован.

Ответ 12

Я также видел NOP в коде, который модифицирует себя, чтобы запутать то, что он делает в качестве заполнителя (защита старой копии от veeery).

Ответ 13

Несколько неортодоксальное использование NOP-Slides, используемое в эксплоитах переполнения буфера.

Ответ 14

В одном процессоре, который я работал недавно (в течение четырех лет), NOP использовался, чтобы убедиться, что предыдущая операция завершилась до начала следующей операции. Например:

значение нагрузки для регистрации (занимает 8 циклов) nop 8 добавить 1 для регистрации

Это обеспечило правильное значение регистра перед операцией добавления.

Другое использование заключалось в том, чтобы заполнить исполняемые единицы, такие как векторы прерываний, которые должны были быть определенного размера (32 байта), потому что адрес для vector0 был, скажем, 0, для вектора 1 0x20 и т.д., поэтому компилятор помещал NOP там, если необходимо.

Ответ 15

Они позволяют компоновщику заменять более длинную инструкцию (обычно длинный прыжок) с более коротким (короткий прыжок). NOP занимает дополнительное пространство - код не может быть перемещен, поскольку он остановит другие прыжки от работы. Это происходит во время соединения, поэтому компилятор не может знать, подходит ли длинный или короткий прыжок.

По крайней мере, это одно из их традиционных применений.

Ответ 16

Это не ответ на ваш конкретный вопрос, но в прежние времена вы могли использовать NOP, чтобы заполнить временной интервал отладки, если вам не удалось заполнить его полезной для использования инструкцией.

Ответ 17

Сопоставляют ли компиляторы .NET вывод MSIL? Я бы предположил, что это может быть полезно для ускорения доступа к IL... Кроме того, я понимаю, что он предназначен для портативного и согласованного доступа на некоторых других аппаратных платформах.

Ответ 18

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

Я не знаком с взломом, но я считаю, что для перезаписывания стека используется NOP, поэтому вам не нужно точно рассчитать, где начинается ваша злонамеренная функция.

Ответ 19

Я использовал NOP для автоматической корректировки задержки, накопленной после ввода ISR. Очень удобно для гвоздя.