Also davon auszugehen, dass die ersten fünf Bytes einer jeden
Win32-
API-Funktion IMMER vollständige Befehle sind (also nicht z.B. ein Befehl von Byte vier bis sieben geht) finde ich schon sehr gewagt. Es gibt fertige Disassemblermodule die einem die Länge des Assemblerbefehls an einer beliebigen Speicheradresse zurückliefern, mit denen kann man dann so viele Bytes kopieren wie notwendig sind, um nicht einen Assemblerbefehl zu schreddern. Dabei kommen sonst nämlich oft genug die seltsamsten Pseudobefehle heraus... Dass der Prozess sich dann seltsam verhält oder falsche Ergebnisse liefert, darf nicht verwundern.
Also: Nicht immer davon ausgehen, dass "fünfe gerade ist"
Das kann derb ins Auge gehen. Einfach Opcodelängen zählen und die notwendige Anzahl Bytes kopieren. Und BTW: Das Gejammer über eine allozierte Speicherpage mehr ist echt kindisch. Speicher wird immer nur in kompletten Pages alloziert, selbst wenn man nur ein Byte über die Pagegrenze kommt. Das ist Windows echt total schnurz, also einfach eine page allozieren, Anfang der
API-Funktion wie oben beschrieben rüberkopieren, absoluten Jump hinter den kopierten Bytes einfügen und dann mittels WriteProcessMemory den Anfang der
API-Funktion überschreiben.
Achtung beim prozessübergreifenden Hooking: Viele "Kopierschutz"-Tools checken APIs oder zumindest deren Anfang auf bekannte Manipulationen (EB FE,
CC, etc.) und verweigern dann die Benutzung der "geschützten" Software.