Hallo,
ich habe eine Frage und zwar habe ich mit der Cheat Engine aus ein paar Spielen die Variablen rausgesucht, in denen z.B. das Geld gespeichert wird. die Adressen sehen z.B so aus: 01B2B89C.
Wie kann ich aus einem C#-Programm auf diese Speicherstellen zugreifen?
Hat da jemand ne idee?
Für Pointer musst du dein Projekt allerdings mit der Option 'Unsicheren Code zulassen' kompilieren. [offtopic]Für welches Spiel? Und welche Cheat Engine?[/offtopic]
mfg.
markus111
Also Cheat Engine ist einfach ein Programm, mit dem man Speicherwerte auslesen kann. Und das mit dem Spiel, es is Call of Duty Modern Warfare 2 und Divinity 2.
Ich würd mal ganz konkret sagen, dass das aufgrund der Speicherverwaltung von Windows am einfachsten mit einem Debugger zustande gebracht werden kann... also eher nicht so einfach zu programmieren.
Ich bin mir gar nicht so sicher, ob man überhaupt mit einem einfachen Pointer auf den Speicherbereich eines anderen Programms zugreifen kann... zumindest ohne irgendwelche AccessViolationExcpetions.
Das ist eigentlich sogar relativ einfach unter Windows zu erreichen mit der WriteProcessMemory Methode
Hilfreich dabei ist auch die ReadProcessMemory Methode und pinvoke ist bei sowas sowieso immer hilfreich ;). Ausserdem ist es sinvoll den Prozess mit den richtigen Access-Privilegien zu öffnen: OpenProcess
Du musst nur aufpassen, da bei den meisten Spielen die Speicheradressen nicht konstant bleiben. Das heisst bei jedem Neustart, oder Levelwechsel, etc. ändert sich die Adresse. Bei sowas brauchst du dann Multilevel Pointer. Das heisst einen Pointer auf einen Pointer auf einen Pointer...
Pseudo Code:
//Prozess ID suchen
//ProcessAccessFlags.AllAccess -> siehe pinvoke.net
IntPtr hProc = OpenProcess(ProcessAccessFlags.AllAccess, false, proc.Id);
//Richtige Adresse einsetzen
int address = 0xFFFFFFFF
int buffer;
//bytesToWrite ist ein byte[], und bytesToWrite.Length ist die Anzahl an bytes, die geschrieben werden soll
WriteProcessMemory(hProc, (IntPtr)address, bytesToWrite, bytesToWrite.Length, out buffer);
Dieser Beitrag wurde 2 mal editiert, zum letzten Mal von Vitab am .
Also Cheat Engine... es is Call of Duty Modern Warfare 2 und Divinity 2.
[offtopic]
Ich halte es für ein wenig problematisch Hilfe beim Programmieren von Cheats anzufordern, vor allem, da es in CODMW2 einen Multiplayer Teil gibt. Für Übungszwecke oder Singleplayer (In der Form eines Trainers) ginge das imo in Ordnung - Alles andere kann ich nicht unterstützen.
[/offtopic]
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von edsplash am .
@edsplash: Bei Divinity 2 gibt es (so weit ich weis) gar keinen Multiplayer, daher ist es ein Singleplayer-Trainer und beim CoDMW2 hab ich keine Lust meinen Account zu verlieren. Es soll nur eine Übung sein, damit ich ein bischen was ausprobieren kann.
[offtopic]
Im Multiplayer wird sowas meistens sowieso nicht funktionieren, weil Informationen wie Lebenspunkte, Munition, ... auf dem Server gespeichert werden.
[/offtopic]
Also ein Problem habe ich noch und zwar sind die Addressen immer Temporär. Bei der Cheat Engine wird so eine Addresse mit "iw4mp.exe+16A4854" beschrieben, so ist sie immer gültig. Jetzt ist meine Frage, wie bekomme ich die Addresse von iw4mp.exe heraus?
@Vitab: Stimmt, beim CoDMW2 funktioniert das ganze nur wenn man selber Host ist (zum ausprobieren hab ich ein spiel mit pw eröffnet, so dass es keinen stört^^)
danke, jetzt würde mich nur noch eins interessieren und zwar gibt es in dem Beispiel mehrere Module von denen die BaseAddress ausgegeben wird. Woher weis ich welches ich benötige?