我在实现读取外部进程内存的算法时遇到了一些问题。这是主要代码:
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.从我用Google搜索,它似乎发生在vista上,因为OpenProcess的一些参数更新了。谁知道这是关于什么的?我应该尝试什么价值?请注意,当他们改变时,我不想知道它是否是VM_READ左右,我想知道这些值是什么。
编辑:也许它与不调用VirtualProtect()/ VirtualProtectEx()有关?正如此SO url所见:WriteProcessMemory/ReadProcessMemory fail
Edit2:就是这样! ^^这是解决方案,首先在ReadProcessMemory()之后调用VirtualProtectEx()!
答案 0 :(得分: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.
这意味着您尝试读取部分未映射地址的块(即,如果应用程序本身执行此操作,则为AV)
答案 1 :(得分:1)
您将句柄存储在本地变量(retValue
)中新打开的进程中,但是您没有将其传递给getMemoryBasicInformation
函数,所以我只能假设它实际上是获取信息关于当前进程。我怀疑你真的使用自己的进程的地址范围,好像它们属于另一个进程。许多地址范围在进程之间可能是相同的,因此错误不会立即显现出来。