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?

InformationsquelleAutor Magnus | 2013-11-07
Schreibe einen Kommentar