2012-04-01 8 views
0

Ich habe den Code, um einen Wert aus dem Speicher zu lesen, der funktioniert, wenn die Speicheradresse auf einen statischen 4-Byte-Wert zeigt, aber ich versuche, auf einen 4-Byte-Wert zuzugreifen, der in einer dynamischen ist Ort und müssen daher zuerst nach dem Zeiger suchen und dann erneut suchen, um den 4-Byte-Wert zu erhalten.C# ReadProcessMemory - Zugriff/Lesen von Zeigern

Unten finden Sie den Code ich habe, die die Adresse des Pointer zurückgeben sollte, aber es gibt nur 0 ...

bAddr = (IntPtr)0x0017C370; // Base address to find the Pointer (Currently: 0x00267A50) 
ReadProcessMemory(hProc, bAddr, buffer, 4, out bytesRW); 
output = BitConverter.ToInt32(buffer, 0); 
txtOutput.Text = output.ToString(); 

Pseudo Code, den ich als siehe Arbeiten:

bAddr = (IntPtr)0x0017C370; // Base address to find the Pointer (Currently: 0x00267A50) 
ReadProcessMemory(hProc, bAddr, buffer, 4, out bytesRW); 
output = BitConverter.ToInt32(buffer, 0); 
bAddr = (IntPtr)output; // Should now contain the address 0x00267A50 
ReadProcessMemory(hProc, bAddr, buffer, 4, out bytesRW); 
output = BitConverter.ToInt32(buffer, 0); 
txtOutput.Text = output.ToString(); 

Kann jemand Schuppen Irgendein Licht auf, was ich tun muss, um eine Adresse zu finden und dann nach dieser Adresse zu suchen, um einen Wert zu finden?

+0

Was gibt 'ReadProcessMemory' zurück? Es könnte nur scheitern, in welchem ​​Fall 'GetLastError' etwas Licht werfen könnte. –

Antwort

4

Dies ist ein ziemlich klassischer Fehler bei der Verwendung von Pinvoke zum Ausführen von Win32-Funktionen, Sie tun keine Fehlerprüfung. Daher ist jeder Fehler nicht zu diagnostizieren. Zunächst stellen Sie sicher, es erklärt richtig:

[DllImport("user32.dll", SetLastError = true)] 
static extern bool ReadProcessMemory(IntPtr hProcess, IntPtr lpBaseAddress, 
    [In, Out] byte[] buffer, IntPtr size, out IntPtr lpNumberOfBytesRead); 

Dann führen Sie es wie folgt aus:

bool ok = ReadProcessMemory(...); 
if (!ok) throw new System.ComponentModel.Win32Exception(); 

Jetzt werden Sie wissen, warum es nicht funktioniert. Wir können Ihnen sonst nicht helfen, herauszufinden, was schief läuft, bis Sie es zumindest auf diese Weise getestet haben. Das grundlegendste Problem ist das Erraten der Adresse natürlich falsch. Und weil ReadProcessMemory nicht über ausreichende Berechtigungen verfügt, ist sie aus naheliegenden Gründen eine äußerst privilegierte Funktion.

+0

Dies. Überprüfen Sie immer Ihre Ergebnisse aus p/invoke-Aufrufen - wenn Sie nicht * * * bei einem Fehler fälschen möchten, erstellen Sie einfach eine neue Win32Exception() und alle Fehlerdetails werden für Sie ausgefüllt. – JerKimball