使用OpenProcess和ReadProcessMemory的问题

时间:2009-08-26 02:25:28

标签: c# .net c++ vb.net process

我在实现读取外部进程内存的算法时遇到了一些问题。这是主要代码:

            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()!

2 个答案:

答案 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函数,所以我只能假设它实际上是获取信息关于当前进程。我怀疑你真的使用自己的进程的地址范围,好像它们属于另一个进程。许多地址范围在进程之间可能是相同的,因此错误不会立即显现出来。