Laden...

GameNizor.cs - einfaches auslesen des Arbeitsspeichers

Erstellt von trigger3 vor 15 Jahren Letzter Beitrag vor 15 Jahren 3.342 Views
T
trigger3 Themenstarter:in
59 Beiträge seit 2008
vor 15 Jahren
GameNizor.cs - einfaches auslesen des Arbeitsspeichers

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:

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

I
279 Beiträge seit 2008
vor 15 Jahren

und für welche spiele funzt das?

M
25 Beiträge seit 2008
vor 15 Jahren

und für welche spiele funzt das?

Gegenfrage: Für welche Spiele funzt das nicht 😛

Meine Projekte:
ClipboardReader
MusicMasher (auf Eis gelegt)
PAMTracker 4.02

Gelöschter Account
vor 15 Jahren

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.

T
trigger3 Themenstarter:in
59 Beiträge seit 2008
vor 15 Jahren

Also mir ist noch kein Spiel unter die Nase gekommen bei dem das nicht funktioniert hat^^

1.361 Beiträge seit 2007
vor 15 Jahren

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

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