2 Byte NOP
-
Hallo,
hab gerade anlässlich des neuen IE Exploits mal meine mshtml.dll disassembliert. Dabei ist mir was merkwürdiges aufgefallen
638D5B89 mov edi,edi 638D5B8B push ebp 638D5B8C mov ebp,esp 638D5B8E sub esp,18h
Das ist der Auszug aus einem Prolog. Nur frage ich mich was es bewirken soll, wenn der Compiler ein
mov edi, edi
erzeugt.
Hat jemand eine Ahnung wieso das gemacht wird?
-
fuer ein pipline flush.
-
Ähm, also ich habe mir das gerade mal bei Wikipedia angesehen und ich muss sagen: Irgendwie versteh ich das nicht. Bin auch zufälligerweise gerade über einen interessanten Artikel gestolpert. War allerdings auf englisch.. Ist als nicht gerad meine Stärke. Aber kann es vielleicht sein das das ganz auch beim EInspielen von Hot Fixes benutzt wird? Also alte Funktion wird nicht sofort ersetzt sonder damit das Programm nicht neu gestartet werden muss wird einfach der Prolog + dem "mov edi, edi" mit einem jump zur gepatchten Funktion überschrieben.
Wenn ich auf de Schotterweg bin dann bitte bescheid sagen
-
Genau so ist es.
Vollkommen Richtig!
Sonst hättest Du eine Rekursion machen müssen, zwangsweise und ohne Zweifel.:xmas2:B3NN3
-
secondsun schrieb:
Das ist der Auszug aus einem Prolog. Nur frage ich mich was es bewirken soll, wenn der Compiler ein
mov edi, edi
erzeugt.
Das kann man nutzen für einen Hotfix (zur Laufzeit? Vermutlich wird die DLL beim nächsten Neustart sowieso ersetzt).
Die zwei Byte lange Instruktion "mov edi, edi" lässt sich ersetzen durch einen auch zwei Byte langen Sprung.
Zweimal "nop" nimmt man dehalb nicht damit das Überschreiben der zwei Bytes halbwegs "threadsafe" ist.
Es könnte ja sein, daß das Betriebssystem einen Thread nach Ausführung des ersten "nop" unterbricht und "weiterschedult".
Wenn dann beide "nop"s durch einen zwei Byte langen Sprung überschrieben werden, zeigt der IP des vorher unterbrochenen Threads mit hoher Wahrscheinlichkeit auf einen dann ungültigen Befehl.
-
aber wozu braucht man diesen platzhalter?
man kann doch einfach die ersten 2 bytes der funktion mit dem sprungbefehl überschreiben, der rest der funktion ist doch egal.
-
wird dieses "mov edi,edi" im progol dann schon von haus aus bei kritischen funktionen eingebaut, wo man weiss, dass später en hot-fix nötig sein könnte oder wie? oder grundsätzlich überall?
un was hat es mit nem pipeline-flush auf sich?