also CodeCaves sind im Prinzip recht einfach.
Ich werde dir das mal am Beispiel meines Health Cheats für Unepic versuchen zu erklären.
Zunächst findet man die Healthadresse und findet dann via Debugger heraus, welche Befehle auch die Adresse zugreifen (Cheat Engine hat sehr elegante Lösungen dafür).
Also habe ich jetzt z.B folgenden Befehl:
|
Du kannt per WriteProcessMemory die Bytes verändern. Jede Reihenfolge von Bytes hat einen bestimmten Befehl zur Folge.
Würde an der oben genannten Adresse z.B lea eax,[ecx-0000E224] stehen, so hättest du als Bytes folgende Sequenz: 8D 81 DC1DFFFF
Ich hoffe bis hierhin ist alles klar?!
Okay, nun kommen wir zum eigentlichen Thema, den Caves.
Als erstes brauchen wir freien Speicher (Cheat Engine hat wieder elegante Lösungen dafür). Ich alloziiere meinen immer dynamisch (siehe meine Funktion im C++ Forum), aber um es hier zu verdeutlichen nehmen wir mal an, ich hätte freien Speicher an folgender Adresse gefunden: 00400288 (unepic.exe+288)
Hier kann ich meinen eigenen Code schreiben, also z.B:
1 |
|
Die Bytes dieses Codes sind im Folgenden fett markiert:
unepic.exe+288 - 9C - pushfd
unepic.exe+289 - 83 B8 24040000 01 - cmp dword ptr [eax+00000424],01
unepic.exe+290 - 75 0A - jne unepic.exe+29C
unepic.exe+292 - C7 80 8C030000 804FC347 - mov [eax+0000038C],47C34F80
unepic.exe+29C - 9D - popfd
unepic.exe+29D - D8 98 8C030000 - fcomp dword ptr [eax+0000038C]
Nun überschreiben wir an unserer Ausgangsadresse (unepic.exe+12FC6) den fcomp Befehl mit einem Jump Befehl zu unserer Cave (einfach die Bytes per WriteProcessMemory schreiben)
unepic.exe+12FC6 - E9 BDD2FEFF - jmp unepic.exe+288
Da der Ausgangsbefehl 6 Bytes groß ist (D8 98 8C030000) und unserer Jump Befehl nur 5 (E9 BDD2FEFF), müssen wir noch den Nop Befehl (90) hinter unseren Jump schreiben.
Nun am Ende unserer Cave nur noch einen Sprung zurück zu 00412FCC (unepic.exe+12FCC), wo der eigentliche Code weitergeht und die Magie ist vollbracht.