Mit dem Base-Pointer mit Offset-Lesen-Prozeß-Speicher
Ich habe gesucht alle über das Internet für Stunden, und kann nicht für das Leben von mir verstehen, warum der folgende code nicht funktioniert.
Die Basis-Adresse gezogen wird, dass für den Prozess scheint falsch zu sein. Wenn ich hard-code Ende- - Adresse direkt in die ReadMemory
bekomme ich den gewünschten Wert aus (also ich weiß, dass ich den richtigen Prozess und alle).
Ich habe nicht geschrieben das MemoryHandler
Klasse, wie das so funktioniert, wie es sollte
Könnte es etwas mit der Tatsache zu tun, dass ich auf einem 64-bit-windows? Das Spiel ist 32-bit (installiert im Ordner "Programme (x86)" - Ordner).
public partial class MainForm : Form
{
Process myProcess = Process.GetProcessesByName("ffxiv").FirstOrDefault();
public MainForm()
{
InitializeComponent();
}
private void startButton_Click(object sender, EventArgs e)
{
IntPtr baseAddress = myProcess.MainModule.BaseAddress;
Console.WriteLine("Base Address: " + baseAddress.ToString("X"));
IntPtr newAddr = IntPtr.Add(baseAddress, 0xF8BEFC);
IntPtr finalAddr = IntPtr.Add(newAddr, 0x1690);
int bytesRead;
byte[] memoryOutput = MemoryHandler.ReadMemory(myProcess, finalAddr, 4, out bytesRead);
int value = BitConverter.ToInt32(memoryOutput, 0);
Console.WriteLine("Read Value: " + value);
}
}
EDIT: Base-Adresse war richtig, mein code-Logik um Hinweise waren falsch, siehe vollständige Antwort unten.
- Welche Werte erhalten Sie für die base-Adresse und Woher wissen Sie, was die "richtigen" Werte sind?
- Scott, ich weiß, was die richtige Adresse ist (und somit das, was ich bekomme ist falsch) von der Verwendung von Cheat-Engine, auf der Seite. So fand ich den base pointer zu der HP von diesem Spiel, zum Beispiel. Es sagt mir, welche Adresse ffxiv.exe haben sollte, und es unterscheidet sich von dem, was mein C# - code gibt mir. Der stärkste Beweis jedoch, dass die endgültige Ausgabe aus Speicher Lesen, nicht meine hp (Wenn ich fest die Unterste Ebene-Adresse finden Sie in cheat engine direkt in die read-memory-Funktion oben, bekomme ich den richtigen Wert).
- Was Wert ist dein code zurück? Was ist der richtige Wert? Überprüfen Sie den korrekten Wert in den Prozess-Explorer.
- Nicht, dass es wichtig ist, weil die low-level-Adressen sind dynamisch, aber im Dez bin ich soll 9460301 (überprüft mit cheat engine), aber stattdessen bekomme ich 1220000. Diese zahlen sind natürlich nur für die aktuelle Instanz des Prozesses wie bereits erwähnt (am starten, diese wird sich ändern).
- Basisadresse eines Moduls ist nicht eine ungerade Zahl sein!
- Jungs, vielen Dank für Ihre Antwort. Ich habe herausgefunden, was der Fehler war. Wenn Sie einen Blick auf den code, was es tut, ist, nehmen Sie ein Basis-Adresse, und fügen Sie einen Versatz, und fügen dann ein offset zu wiederholen. Das ist nicht, wie Zeiger funktionieren. Was Sie tun sollten, ist nehmen Sie die Basis-Adresse, fügen Sie zuerst offset, dann Lesen Sie bitte, was ist an diesem Speicherort. Verwenden Sie dann das Ergebnis als die nächste Adresse zum hinzufügen der nächsten offset zu. Das ist, wie Zeiger funktionieren. Sollte poste ich meine neuen und festen code in einer Antwort auf dies?
Du musst angemeldet sein, um einen Kommentar abzugeben.
So, David ' s Kommentar, dass die Basis-Adressen können nicht ungerade zahlen, machte mich denken, dass vielleicht die Nummer hatte ich von Cheat Engine in der Tat war das nicht die base-Adresse. Das stellte sich als richtig heraus. Mein code war in der Tat ziehen die richtige base Adresse. Die Nummer, die ich weiter oben geschrieben (9460301) war in der Tat das, was gespeichert war, an der Basis-Adresse Speicherort im Speicher (nicht die Adresse selbst).
Na ja, der obige code nimmt die base-Adresse und fügt die erste offset -, und fügt dann den nächsten offset-und liest dann den Speicher auf die Adresse. Das ist falsch, das ist nicht, wie multi-level-Zeiger arbeiten. Für jede Ebene haben Sie, um das Speicher Lesen und sehen, was gespeichert ist unter der Adresse. Der Wert, den Sie finden, wird Ihre nächste Adresse, auf die Sie sich bewerben Ihre nächste offset, und so weiter..
Der richtige code wäre:
Frage ich mich allerdings, wie man diese nicht-spezifischen 32-bit-windows? Ich weiß nicht wirklich, wie Sie die Int32 () - Funktion und die anschließende IntPtr Gießen, so möchte, um herauszufinden, ob es irgendeinen Weg gibt, um direkt aus dem byte [], um IntPtr. Ich habe versucht, Marschall-Kopie etc., aber konnte es nicht zu funktionieren.
Vielen Dank noch einmal!