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
GameNizor.cs - einfaches auslesen des Arbeitsspeichers
trigger3
myCSharp.de - Member



Dabei seit:
Beiträge: 59

Themenstarter:

GameNizor.cs - einfaches auslesen des Arbeitsspeichers

beantworten | zitieren | melden

Hi,
ich möchte euch hiermit meine erste Klasse vorstellen an der ich und ein Partner (dmix) schon eine Weile dran sitzen

Was genau macht diese Klasse?
Sie liest die "Daten" aus Spielen aus, wie z.B. HP, Namen, Level. Dies kann zum erstellen von Bots oder Trainshows wichtig sein. Später folgen noch Funktionen zum umschreiben von Werten, welches in Offline Spielen für Trainer genutzt wird.

Was bringt mir diese Klasse?
Das einzige was ihr ab sofort noch machen müsst ist das herausfinden der Offsets. Der GameNizor nimmt euch die restliche Arbeit komplett ab.

Welche Arbeit nimmt er mir den ab?
Er erleichtert das eintragen der Speicheradressen, verwaltet diese, wirft sinnvolle Exeptions, nimmt die Denkarbeit fast komplett ab und kümmert sich darum das die Offsets stets aktuell bleiben.

Was muss ich dazu können?
Eine gewisse Erfahrung in c# wird zwar vorausgesetzt, aber meine beiden Tutorials: http://gamenizor.cp-g.net/Tutorials.html erklären eigentlich alles von der Pike auf.

Alles restliche findet ihr auf der Website. In den nächsten Tagen werde ich noch ein paar Erklärungsbereiche schreiben.

Kleine Beispiele:
Zitat
Auslese Methode #1 von 3 (anlegen von Offsets und auslesen - einfach aber viel Codearbeit)


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.GameNizor;

namespace GameNizor_AusleseverfahrenNr1
{
public partial class Form1 : Form
{
Game MyGame;
Offset HP, MP, Gold;
public Form1()
{
InitializeComponent();
}

private void Form1_Load(object sender, EventArgs e)
{
label1.Text = "Öffne Spiel...";//dient zur Info des benutzers
LoadOffsets();
}

public void LoadOffsets()
{
//Legt das Spiel fest welches den Prozessnamen game.exe trägt
MyGame = new Game(Game.GetProcessByName("game.exe"));
//Öffnet den Prozess um ihn später auslesen zu können
MyGame.OpenProcess(Game.SchreibRechte.ReadOnly);

//Legt die Offsets an
HP = new Offset("HP", (IntPtr)0x0082B6B4, 4, MyGame, 0x12c);
MP = new Offset("MP", (IntPtr)0x0082B6B4, 4, MyGame, 0x134);
Gold = new Offset("Gold", (IntPtr)0x0082E208, 4, MyGame);

//Startet den Timer
timerOffsetUpdater.Start();
}

private void timerOffsetUpdater_Tick(object sender, EventArgs e)
{
label1.Text = MyGame.ProcessToOpen.MainWindowTitle + " wird ausgelesen..."; //dient zur Info
//Der Timer dient dazu die Offsets immer frisch zu halten
label2.Text = "HP: " + Offset.ConvertToString(HP.Read());
//Die HP wird als Byte Array ausgelesen und zu einem String konvertiert,
//damit man sie in einem Label anzeigen kann
label3.Text = "MP: " + Offset.ConvertToString(MP.Read());
label4.Text = "Gold: " + Offset.ConvertToString(Gold.Read());
}
}
}

Auslese Methode #2 von 3 (Get By SuchTag )

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.GameNizor;

namespace GameNizor_AusleseverfahrenNr1
{
public partial class Form1 : Form
{
Game MyGame;
public Form1()
{
InitializeComponent();
}

private void Form1_Load(object sender, EventArgs e)
{
label1.Text = "Öffne Spiel...";//dient zur Info des benutzers
LoadOffsets();
}

public void LoadOffsets()
{
//Legt das Spiel fest welches den Prozessnamen game.exe trägt
MyGame = new Game(Game.GetProcessByName("game.exe"));
//Öffnet den Prozess um ihn später auslesen zu können
MyGame.OpenProcess(Game.SchreibRechte.ReadOnly);

//Legt die Offsets an
MyGame.AddOffset("HP", (IntPtr)0x0082B6B4, 4, 0x12c);
MyGame.AddOffset("MP", (IntPtr)0x0082B6B4, 4, 0x134);
MyGame.AddOffset("Gold", (IntPtr)0x0082E208, 4);

//Startet den Timer
timerOffsetUpdater.Start();
}

private void timerOffsetUpdater_Tick(object sender, EventArgs e)
{
//Der Timer dient dazu die Offsets immer frisch zu halten
label1.Text = MyGame.ProcessToOpen.MainWindowTitle + " wird ausgelesen..."; //dient zur Info

//Sucht das Offset heraus welches den angebenen Suchtag enthält
//Liest eine Byte array aus
//Konvertiert diese zu einem String
label2.Text = "HP: " + Offset.ConvertToString(Offset.GetByTag("HP").Read());
label3.Text = "MP: " + Offset.ConvertToString(Offset.GetByTag("MP").Read());
label4.Text = "Gold: " + Offset.ConvertToString(Offset.GetByTag("Gold").Read());
}
}
}

Auslese Methode #3 von 3 (OffsetFiles)

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.GameNizor;

namespace GameNizor_AusleseverfahrenNr1
{
public partial class Form1 : Form
{
Game MyGame;
public Form1()
{
InitializeComponent();
}

private void Form1_Load(object sender, EventArgs e)
{
label1.Text = "Öffne Spiel...";//dient zur Info des benutzers
LoadOffsets();
}

public void LoadOffsets()
{
//Legt das Spiel fest welches den Prozessnamen game.exe trägt
MyGame = new Game(Game.GetProcessByName("game.exe"));
//Öffnet den Prozess um ihn später auslesen zu können
MyGame.OpenProcess(Game.SchreibRechte.ReadOnly);

//Ladet die aktuelle OffsetFile Datei herunter und speichert sie unter Shaija.OffsetFile ab
OffsetFile.DownloadFile("http://trigger3.tr.funpic.de/Shaya.OffsetFile", "Shaija.OffsetFile");

//erstellt eine neue Offsetdatei und ladet die dort gespeichert Offsets in die Liste
OffsetFile MyOffsetFile = new OffsetFile("Shaija.OffsetFile", MyGame);

//Zeigt den Kommentar aus der zweiten Zeile der OffsetFile an
this.Text = MyOffsetFile.CoderComment;
//Startet den Timer
timerOffsetUpdater.Start();
}

private void timerOffsetUpdater_Tick(object sender, EventArgs e)
{
//Der Timer dient dazu die Offsets immer frisch zu halten
label1.Text = MyGame.ProcessToOpen.MainWindowTitle + " wird ausgelesen..."; //dient zur Info

//Sucht das Offset heraus welches den angebenen Suchtag enthält (welche in der Offset File angegeben waren)
//Liest eine Byte array aus
//Konvertiert diese zu einem String
label2.Text = "HP: " + Offset.ConvertToString(Offset.GetByTag("HP").Read());
label3.Text = "MP: " + Offset.ConvertToString(Offset.GetByTag("MP").Read());
label4.Text = "Gold: " + Offset.ConvertToString(Offset.GetByTag("Gold").Read());
}
}
}

MFG trigger3
Dieser Beitrag wurde 2 mal editiert, zum letzten Mal von trigger3 am .
private Nachricht | Beiträge des Benutzers
iced-t89
myCSharp.de - Member



Dabei seit:
Beiträge: 279

beantworten | zitieren | melden

und für welche spiele funzt das?
private Nachricht | Beiträge des Benutzers
MOnsDaR
myCSharp.de - Member



Dabei seit:
Beiträge: 25

beantworten | zitieren | melden

Zitat
und für welche spiele funzt das?

Gegenfrage: Für welche Spiele funzt das nicht :P
Meine Projekte:
ClipboardReader
MusicMasher (auf Eis gelegt)
PAMTracker 4.02
private Nachricht | Beiträge des Benutzers
Gelöschter Benutzer

beantworten | zitieren | melden

Zitat
Gegenfrage: Für welche Spiele funzt das nicht
für alle spiele die in .net oder mono betrieben werden und für alle spiele die eine speicherdefragmentierung implementiert haben.

edit: bzw gilt das für alle spiele, die kein festes offset für ihre werte vorweisen können und das sind (von den modernen) fast alle.
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal am .
trigger3
myCSharp.de - Member



Dabei seit:
Beiträge: 59

Themenstarter:

beantworten | zitieren | melden

Also mir ist noch kein Spiel unter die Nase gekommen bei dem das nicht funktioniert hat^^
private Nachricht | Beiträge des Benutzers
zommi
myCSharp.de - Member

Avatar #avatar-2617.png


Dabei seit:
Beiträge: 1.361
Herkunft: Berlin

beantworten | zitieren | melden

Hi,

bei GTA4 sollte das nicht mehr mit allen InGame-Variablen funktionieren.

Auch in Zukunft wird das bei Spielen, die auf der "Games for Windows - LIVE" - API aufbauen, nicht mehr sooo leicht funktionieren.
Denn eines der API-Features ist Buffer-Protection:1
Zitat von GameDev.net
Windows LIVE targets hackers by including debugger detection, as well as a protected buffer API. The API randomizes and replaces data withing the memory buffer to prevent scans from picking up anything useful. This means you have to use the API's special functions to read and write data that is then obfuscated and stored in the buffer.

Also variieren die Speicheradressen-Offsets der Variablen ständig.
Pech gehabt.
(Da hilft dann nur noch das Ersetzen der xlive.dll durch eine manipulierte)

Aber sicherlich haben auch manch andere Spiele dieses Konzept selbst aufgegriffen, sodass die Anzahl der Spiele, bei denen obiges Verfahren fehlschlägt, weiter steigt.

beste Grüße
zommi
private Nachricht | Beiträge des Benutzers