2009-08-26 7 views
1

Ich habe einige Probleme bei der Implementierung eines Algorithmus zum Lesen eines fremden Prozesses Speicher. Hier ist der Hauptcode:Problem mit OpenProcess und ReadProcessMemory

  System.Diagnostics.Process.EnterDebugMode(); 
      IntPtr retValue = WinApi.OpenProcess((int)WinApi.OpenProcess_Access.VMRead | (int)WinApi.OpenProcess_Access.QueryInformation, 0, (uint)_proc.Id); 
      _procHandle = retValue; 

      WinApi.MEMORY_BASIC_INFORMATION[] mbia = getMemoryBasicInformation().Where(p => p.State == 0x1000).ToArray(); 

      foreach (WinApi.MEMORY_BASIC_INFORMATION mbi in mbia) { 
       byte[] buffer = Read((IntPtr)mbi.BaseAddress, mbi.RegionSize); 

       foreach (IntPtr addr in ByteSearcher.FindInBuffer(buffer, toFind, (IntPtr)0, mbi.RegionSize, increment)) { 
        yield return addr; 
       } 
      } 

Read() ... method 

     if (!WinApi.ReadProcessMemory(_procHandle, address, buffer, size, out numberBytesRead)) { 
      throw new MemoryReaderException(
       string.Format(
       "There was an error with ReadProcessMemory()\nGetLastError() = {0}", 
       WinApi.GetLastError() 
       )); 
     } 

Obwohl im Allgemeinen scheint es richtig zu arbeiten, das Problem ist, dass für einige Speicherwerte falsch Readprocessmemory zurückkehrt, und GetLastError zurückkehrt 299. Von dem, was ich gegoogelt habe, scheint es geschehen auf Vista, da einige Params von OpenProcess aktualisiert wurden. Weiß jemand, worum es geht? Und welche Werte sollte ich versuchen? Beachten Sie, dass ich, wenn sie sich ändern, nicht wissen möchte, ob es VM_READ oder so ist. Ich möchte genau wissen, was die Werte sind.

BEARBEITEN: hat es vielleicht etwas damit zu tun, VirtualProtect()/VirtualProtectEx() nicht aufzurufen? wie auf dieser SO url gesehen: WriteProcessMemory/ReadProcessMemory fail

Edit2: Das war es! ^^ Das ist die Lösung, die zu VirtualProtectEx() zuerst und nach ReadProcessMemory() aufruft!

+0

Dieser Ansatz wird den Opferprozess verheerend beeinflussen, wenn Sie dies tun, * müssen * Sie den Prozess einfrieren. –

Antwort

1
C:\Debuggers>kd -z C:\Windows\notepad.exe 
0:000> !error 0n299 
Error code: (Win32) 0x12b (299) - Only part of a ReadProcessMemory 
    or WriteProcessMemory request was completed. 

Das heißt, Sie versuchen, einen Block zu lesen, die teilweise nicht zugeordneten Adressen waren (dh, wenn die App selbst das hat, es würde AV)

+0

Das wäre seltsam, wie Sie im Code sehen können, gehe ich nur nach Speicherblöcken durch MEMORY_BASIC_INFORMATION Strukturen. Oder mache ich etwas falsch? –

+1

Ist der Prozess ausgesetzt? Oder liest du von einem Live-Prozess? –

+0

Ich führe es auf einem laufenden Prozess. Kann das der Grund sein? –

1

Sie speichern den Griff in das neu eröffneten Verfahren in einem lokalen Variable (retValue), aber Sie übergeben es nicht an Ihre getMemoryBasicInformation Funktion, so kann ich nur davon ausgehen, dass es tatsächlich Informationen über die aktuelle Prozess holt. Ich vermute, dass Sie die Adressbereiche Ihres eigenen Prozesses wirklich so verwenden, als gehörten sie zu dem anderen Prozess. Viele der Adressbereiche werden zwischen den Prozessen wahrscheinlich gleich sein, so dass der Fehler nicht sofort ersichtlich ist.

+0

Nein. Ich greife korrekt auf Daten von einem anderen Prozess zu. –

+0

Denken Sie daran, dass ich nur diese Teile des Codes zusammengestellt habe, aber eigentlich ist es komplexer. Ich habe das getestet und es liest Daten aus einem anderen Prozess. –

+0

Ich verstehe. Meine Kristallkugel ist im Laden für Reparaturen. In der Zwischenzeit kann ich nur den Code kommentieren, der mir gezeigt wurde. –