"Memory Hack" - theorethische Frage

Hallo liebe Community,

ich interessiere mich für die Theorie hinter den "Memory-Hacks" wie sie insbesondere bei Trainern für Spiele benutzt werden. Der Wikipedia Artikel ist mir irgendwie zu schwammig: http://de.wikipedia.org/wiki/Trainer_(Software)

Mir ist nämlich nicht klar, wie das überhaupt funktionieren kann.

Als Programmierer eines Hauptprogrammes deklariere ich mir ja eine Variable, die dann irgendwo auf den Speicher zeigt um Werte reinzupacken. Ich gehe ja mal davon aus, dass zur Laufzeit entschiedenen wird wo Werte auf meinen Speicher abgebildet werden. Geht ja schlecht zu compilezeit, weil das Programm ja auf unterschiedlichen Rechnern laufen könnte.

Wie ist es dann möglich, dass diese Trainer immer genau "wissen" wo ein Wert hinterlegt wurde ? Der Programmierer des Trainers kann ja schlecht im Vorfeld wissen, welcher Speicher für den abzuspeichernden Wert zur Verfügung stehen wird. Ich gehe mal davon aus, dass ich da irgendwas durcheinander hauhe.

Bpsw. benutzen die Leute diese cheatEngine und dort steht bspw.

Adress 000AFCC4 Value 20


Was um gotteswillen ist denn diese "Adress" ? Ist das der konkrete Speicher meines Rechners? Aber wenn ich bspw. mein Programm jetzt auf einen anderen anderen Rechner start und dort den Trainer, dann kann es ja sein, dass in der Adresse 000AFCC4 irgendetwas anderes hinterlegt ist?

Weil ich ein Stück Code gesehen habe bei dem so auf den Speicher zugegriffen wird:

PHP:
WriteProcessMemory(hProc, (LPVOID)0x000AFCC4, &newValue, (DWORD)sizeof(newValue), NULL);

Das würde ja aber kein Sinn machen?

Nochmal falls es unverständlich ist , konkret habe ich gerade folgendes Bild:

- Hauptogramm wird untersucht.
- Hauptpogramm speichert momentan den Wert 20 in den Speicher mit der Adresse 000AFCC4
- Programmierer schreibt einen Trainer, der den Wert im Speicher mit der Adresse 000AFCC4 umändert.
- Jetzt wird sowohl Trainer als auch das Hauptprogramm auf einen anderen Rechner gestartet.
- Hauptprogramm speichert den Wert 20 nun in eine völlige andere Adresse, der Trainer greift allerdings noch auf die Adresse 000AFCC4 zu.

Kann mir jemand erklären , wo hier der Denkfehler ist?

Viele Grüße :)
 
Zuletzt bearbeitet:
Mal eine knappe Antwort: Das funktioniert auf "jedem" System trotzdem, weil diese Adresse nicht die tatsächliche physische Adresse auf dem RAM ist. Wenn du allein mal in OllyDbg schaust, startet fast jede exe bei 0x00400000. Les dir einfach mal die Artikel zur Speicherverwaltung durch:
Virtuelle Speicherverwaltung
Memory Management Unit
 
ich habe inzwischen herausgefunden, dass es wohl nicht geht. Man muss den Pointer ausfindig machen und dann damit manipulieren. Dann geht es immer. Trotzdem Danke !
 
Man muss den Pointer ausfindig machen und dann damit manipulieren.

Klar, aber den Pointer wirst du schlecht bzw. zumindestens sehr schwierig einfach "allgemein" finden können ohne auch nur eine feste VA. Daher hast du dann vielleicht einen Pointer auf einen Pointer auf einen Pointer auf einen Wert, aber wenigstens den ersten Pointer wirst du fest angeben.
Mittlerweile muss man natürlich nur dran denken den Trainer auch für 64-Bit Systeme zu schreiben ;)
 
Zurück
Oben