【发布时间】:2009-08-26 02:25:28
【问题描述】:
我在实现读取外部进程内存的算法时遇到了一些问题。以下是主要代码:
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()
));
}
虽然通常它似乎工作正常,但问题是对于某些内存值,ReadProcessMemory 返回 false,而 GetLastError 返回 299。根据我的谷歌搜索,这似乎发生在 vista 上,因为 OpenProcess 的某些参数已更新.有谁知道这是怎么回事?我应该尝试什么价值观?请注意,当它们发生变化时,我不想知道它是否是 VM_READ 左右,我想确切地知道值是什么。
编辑:也许它与不调用 VirtualProtect()/VirtualProtectEx() 有关?正如在这个 SO url 上看到的那样:WriteProcessMemory/ReadProcessMemory fail
Edit2:就是这样! ^^ 那就是解决方案,先调用 VirtualProtectEx(),再调用 ReadProcessMemory()!
【问题讨论】:
-
这种方法会对受害者进程造成严重破坏,如果你要这样做,你必须冻结进程。
标签: c# .net c++ vb.net process