Laden...

Bestimmte Arbeitsspeicherabschnitte auslesen und beschreiben?

Erstellt von Neokil vor 14 Jahren Letzter Beitrag vor 14 Jahren 1.212 Views
Neokil Themenstarter:in
206 Beiträge seit 2008
vor 14 Jahren
Bestimmte Arbeitsspeicherabschnitte auslesen und beschreiben?

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?

MFG
Neokil

479 Beiträge seit 2008
vor 14 Jahren

Hallo,

du hast die Wahl zwischen Marshals und Pointern.

Für Pointer musst du dein Projekt allerdings mit der Option 'Unsicheren Code zulassen' kompilieren.

Für welches Spiel? Und welche Cheat Engine?

mfg.
markus111

[Follow me on Twitter](http://twitter.com/blendingsky)
Neokil Themenstarter:in
206 Beiträge seit 2008
vor 14 Jahren

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.

32 Beiträge seit 2010
vor 14 Jahren

Die Variablen eines anderen Programms?

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.

#define struct union[

V
78 Beiträge seit 2008
vor 14 Jahren

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);

390 Beiträge seit 2008
vor 14 Jahren

Also
>
... es is Call of Duty Modern Warfare 2 und Divinity 2.

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.

using Skill

Neokil Themenstarter:in
206 Beiträge seit 2008
vor 14 Jahren

also vielen dank,

@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.

V
78 Beiträge seit 2008
vor 14 Jahren

Im Multiplayer wird sowas meistens sowieso nicht funktionieren, weil Informationen wie Lebenspunkte, Munition, ... auf dem Server gespeichert werden.

Neokil Themenstarter:in
206 Beiträge seit 2008
vor 14 Jahren

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^^)

1.361 Beiträge seit 2007
vor 14 Jahren

Hi Neokil,

die msdn ist dein Freund: ProcessModule.BaseAddress

beste Grüße
zommi

Neokil Themenstarter:in
206 Beiträge seit 2008
vor 14 Jahren

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?

1.361 Beiträge seit 2007
vor 14 Jahren

Vielleicht Process.MainModule?
Ist zumindest auch im Beispiel verwendet worden.

beste Grüße
zommi

Neokil Themenstarter:in
206 Beiträge seit 2008
vor 14 Jahren

danke