Äh, man sollte zuerst den 0xE9 Sprung schreiben.
Stell dir vor das Program das du gerade patchen willst will genau in diesem Moment MessageBoxA ausführen.
Code:
NOP
NOP
NOP
NOP
NOP
MOV EDI, EDI
whatever
ist der normale Code. Jetzt fängst du an zu patchen aber dein Thread (Thread A) wird unterbrochen.
Code:
NOP
NOP
NOP <-- EIP
NOP
NOP
JMP -5
whatever
Der andere Thread B führt jetzt in einer Endlosschleife immer NOPs aus. Erstmal nicht schlimm, aber irgendwann wird ja auch B unterbrochen und du kannst weiter patchen.
Code:
JMP hook
JMP -5
whatever
Nur leider sieht es für B so aus:
Code:
0xE9
0xAF
0xFE <-- EIP
0x12
0x34
JMP -5
whatever
und dann versucht es einen Teil der Adresse als Befehl zu interpretieren.
(Ich ignoriere hier jetzt mal instruction caches)