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!
Dieser Ansatz wird den Opferprozess verheerend beeinflussen, wenn Sie dies tun, * müssen * Sie den Prozess einfrieren. –