83 Stimmen

Welchen Zweck erfüllt der Opcode CIL nop?

Ich gehe gerade MSIL durch und stelle fest, dass es eine Menge nop Anweisungen in der MSIL.

Im MSDN-Artikel heißt es, dass sie keine Aktion ausführen und zum Auffüllen des Platzes verwendet werden, wenn der Opcode gepatcht wird. Sie werden viel mehr in Debug-Builds als in Release-Builds verwendet.

Ich weiß, dass diese Art von Anweisungen in Assembler-Sprachen verwendet werden, um spätere Anweisungen auszurichten, aber warum sind MSIL nops in MSIL erforderlich?

(Anmerkung des Herausgebers: Die akzeptierte Antwort bezieht sich auf Maschinencode-NOPs, nicht auf MSIL/CIL-NOPs, nach denen die Frage ursprünglich gestellt wurde).

19 Stimmen

Es gibt in diesen Antworten eine große Verwirrung zwischen der MSIL nop-Anweisung, die vom Sprachcompiler in die Assemblerdatei ausgegeben wird, und den x86 nop-Anweisungen (auf dieser Plattform), die vom JIT-Compiler ausgegeben werden, wenn die Assemblerdatei ausgeführt wird. [Idealerweise sollte diese Frage in 2 verschiedene Fragen aufgeteilt werden: Zweck von MSIL::nop? und Zweck von native platform nop?

5voto

Makis Punkte 11700

Bei einem Prozessor, für den ich vor kurzem gearbeitet habe (vier Jahre lang), wurde NOP verwendet, um sicherzustellen, dass die vorherige Operation abgeschlossen war, bevor die nächste Operation gestartet wurde. Zum Beispiel:

Wert in Register laden (dauert 8 Zyklen) nop 8 1 zum Register hinzufügen

Dadurch wurde sichergestellt, dass die Register vor dem Additionsvorgang den richtigen Wert hatten.

Ein weiterer Verwendungszweck war das Auffüllen von Ausführungseinheiten, wie z. B. die Unterbrechungsvektoren, die eine bestimmte Größe haben mussten (32 Byte), weil die Adresse für Vektor 0 z. B. 0 war, für Vektor 1 0x20 usw., so dass der Compiler dort bei Bedarf NOPs einfügte.

4voto

Toad Punkte 15025

50 Jahre zu spät, aber hey.

Nop's sind nützlich, wenn Sie Assembler-Code von Hand eintippen. Wenn Sie Code entfernen müssen, können Sie die alten Opcodes nop setzen.

Ähnlich könnte man neuen Code einfügen, indem man einen Opcode überschreibt und an eine andere Stelle springt. Dort legt man die überschriebenen Opcodes ab und fügt den neuen Code ein. Wenn Sie fertig sind, springen Sie zurück.

Manchmal musste man die zur Verfügung stehenden Mittel einsetzen. In einigen Fällen war dies nur ein sehr einfacher Maschinencode-Editor.

Bei den heutigen Compilern machen diese Techniken überhaupt keinen Sinn mehr.

4voto

Rob Walker Punkte 45267

Sie könnten sie nutzen, um die bearbeiten und fortsetzen während der Fehlersuche. Es bietet dem Debugger Raum zum Arbeiten, um den alten Code durch neuen zu ersetzen, ohne Offsets usw. zu ändern.

4 Stimmen

Ich habe die Debugger-Unterstützung in VS für Edit und Continue implementiert (ich habe die CLR- oder Compiler-Teile nicht implementiert). Nops sind Teil der Geschichte, um korrekte Zuordnungen von der alten zur neuen Version einer Methode zu gewährleisten (insbesondere in den Fällen von Sprüngen aus dem Code zur Behandlung von Ausnahmen). Das Ersetzen der MSIL erfolgt jedoch auf Basis der gesamten Funktion. Bei CLR-verwaltetem Code ist es nicht notwendig, in der MSIL "Platz zu lassen", um diesen Teil zu erreichen. Was Sie hier sagen, ist richtig in Bezug auf native Edit und continue.

3voto

TheMarko Punkte 7984

Ich habe auch schon NOPs in Code gesehen, der sich selbst modifiziert, um zu verschleiern, was er als Platzhalter tut (ein uralter Kopierschutz).

3voto

mdm Punkte 5439

Eine etwas unorthodoxe Verwendung sind NOP-Folien die in Pufferüberlauf-Exploits verwendet werden.

0 Stimmen

Das habe ich gesucht :)

0 Stimmen

Korrigieren Sie Ihren Link, er funktioniert nicht, bitte stellen Sie immer sicher, dass Sie den Link zum Webarchiv eingereicht haben, denn sie werden nicht 404 don't found anzeigen.

0 Stimmen

Ich arbeite derzeit an Shellcode und wollte mehr über NOP erfahren. Ich musste ein wenig zurückgehen, aber hier ist ein Archiv: web.archive.org/web/20110124015428/http://www.phreedom.org:80/

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X