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?

3voto

Alex Gartrell Punkte 2454

Wie ddaa sagte, können Sie mit Nops die Varianz im Stack berücksichtigen, so dass beim Überschreiben der Rücksprungadresse zum Nop-Schlitten gesprungen wird (viele Nops in einer Reihe) und dann der ausführbare Code korrekt getroffen wird, anstatt zu einem Byte in der Anweisung zu springen, das nicht der Anfang ist.

3voto

shoosh Punkte 73374

In der Software-Cracking-Szene besteht eine klassische Methode zum Entsperren einer Anwendung darin, die Zeile, die nach dem Schlüssel oder der Registrierung oder der Zeitspanne oder was auch immer sucht, mit einem NOP zu patchen, so dass sie nichts tut und die Anwendung einfach weiter startet, als ob sie registriert wäre.

5 Stimmen

Ich bin mir ziemlich sicher, dass No-Op-Anweisungen nicht erfunden wurden, um Softwarepiraten zu unterstützen :-)

3voto

Larry OBrien Punkte 8341

Ein klassischer Verwendungszweck ist, dass der Debugger immer eine Quellcodezeile mit einer AWL-Anweisung verknüpfen kann.

0 Stimmen

Da MSIL bei der Ausführung JIT-kompiliert wird, kann diese Zuordnung verloren gehen (z. B. hat eine native Anweisung keine eindeutige MSIL-Anweisung). NOPs werden als Kommunikationsmechanismus zwischen dem Sprachcompiler und dem JIT-Compiler verwendet, um eine solche Zuordnung zu erhalten.

1voto

Das erste Assembler, das ich gelernt habe, war SPARC, daher bin ich mit dem Verzweigungsverzögerungsschlitz vertraut. Wenn man ihn nicht mit einer anderen Anweisung füllen kann, normalerweise mit der Anweisung, die man über die Verzweigungsanweisung setzen oder einen Zähler in Schleifen inkrementieren wollte, verwendet man ein NOP.

Ich kenne mich mit Cracking nicht aus, aber ich glaube, es ist üblich, den Stack mit NOP zu überschreiben, damit Sie nicht genau berechnen müssen, wo Ihre bösartige Funktion beginnt.

1voto

Brian Knoblauch Punkte 19629

Richten die .NET-Compiler die MSIL-Ausgabe aus? Ich könnte mir vorstellen, dass es für die Beschleunigung des Zugriffs auf die IL nützlich sein könnte... Auch mein Verständnis ist, dass es entworfen ist, um portabel zu sein und ausgerichtete Zugriffe auf einige andere Hardware-Plattformen erforderlich sind.

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