Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Bestimmte Arbeitsspeicherabschnitte auslesen und beschreiben?
Neokil
myCSharp.de - Member

Avatar #avatar-2865.jpg


Dabei seit:
Beiträge: 211
Herkunft: Schmieheim (Kleines Kaff 50km nördlich von Freiburg)

Themenstarter:

Bestimmte Arbeitsspeicherabschnitte auslesen und beschreiben?

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
markus111
myCSharp.de - Member

Avatar #avatar-3108.png


Dabei seit:
Beiträge: 520
Herkunft: Henstedt-Ulzburg

beantworten | zitieren | melden

Hallo,

du hast die Wahl zwischen Marshals und Pointern.

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
private Nachricht | Beiträge des Benutzers
Neokil
myCSharp.de - Member

Avatar #avatar-2865.jpg


Dabei seit:
Beiträge: 211
Herkunft: Schmieheim (Kleines Kaff 50km nördlich von Freiburg)

Themenstarter:

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
Emiswelt
myCSharp.de - Member

Avatar #avatar-3086.png


Dabei seit:
Beiträge: 32
Herkunft: Österreich

beantworten | zitieren | melden

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
http://www.eex-dev.net
private Nachricht | Beiträge des Benutzers
Vitab
myCSharp.de - Member



Dabei seit:
Beiträge: 81

beantworten | zitieren | melden

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 .
private Nachricht | Beiträge des Benutzers
edsplash
myCSharp.de - Member

Avatar #avatar-3111.jpg


Dabei seit:
Beiträge: 411

beantworten | zitieren | melden

Zitat von Neokil
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 .
using Skill
private Nachricht | Beiträge des Benutzers
Neokil
myCSharp.de - Member

Avatar #avatar-2865.jpg


Dabei seit:
Beiträge: 211
Herkunft: Schmieheim (Kleines Kaff 50km nördlich von Freiburg)

Themenstarter:

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
Vitab
myCSharp.de - Member



Dabei seit:
Beiträge: 81

beantworten | zitieren | melden

[offtopic] Im Multiplayer wird sowas meistens sowieso nicht funktionieren, weil Informationen wie Lebenspunkte, Munition, ... auf dem Server gespeichert werden. [/offtopic]
private Nachricht | Beiträge des Benutzers
Neokil
myCSharp.de - Member

Avatar #avatar-2865.jpg


Dabei seit:
Beiträge: 211
Herkunft: Schmieheim (Kleines Kaff 50km nördlich von Freiburg)

Themenstarter:

beantworten | zitieren | melden

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^^)
private Nachricht | Beiträge des Benutzers
zommi
myCSharp.de - Member

Avatar #avatar-2617.png


Dabei seit:
Beiträge: 1380
Herkunft: Berlin

beantworten | zitieren | melden

Hi Neokil,

die msdn ist dein Freund: ProcessModule.BaseAddress

beste Grüße
zommi
private Nachricht | Beiträge des Benutzers
Neokil
myCSharp.de - Member

Avatar #avatar-2865.jpg


Dabei seit:
Beiträge: 211
Herkunft: Schmieheim (Kleines Kaff 50km nördlich von Freiburg)

Themenstarter:

beantworten | zitieren | melden

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?
private Nachricht | Beiträge des Benutzers
zommi
myCSharp.de - Member

Avatar #avatar-2617.png


Dabei seit:
Beiträge: 1380
Herkunft: Berlin

beantworten | zitieren | melden

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

beste Grüße
zommi
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von zommi am .
private Nachricht | Beiträge des Benutzers
Neokil
myCSharp.de - Member

Avatar #avatar-2865.jpg


Dabei seit:
Beiträge: 211
Herkunft: Schmieheim (Kleines Kaff 50km nördlich von Freiburg)

Themenstarter:

beantworten | zitieren | melden

danke
private Nachricht | Beiträge des Benutzers