c# - 使用 OpenProcess 和 ReadProcessMemory 的问题

标签 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。从我用谷歌搜索的内容来看,它似乎发生在 vista 上,因为 OpenProcess 的一些参数已更新.有人知道这是怎么回事吗?我应该尝试什么样的值(value)观?请注意,当它们发生变化时,我不想知道它是否为 VM_READ 左右,我想知道确切的值是什么。

编辑: 可能与不调用 VirtualProtect()/VirtualProtectEx() 有关?如此 SO 网址所示:WriteProcessMemory/ReadProcessMemory fail

Edit2:就是这样! ^^ 这就是解决方案,先调用 VirtualProtectEx(),再调用 ReadProcessMemory()!

最佳答案

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.

这意味着你试图读取一个部分未映射地址的 block (即如果应用程序本身这样做,它就是 AV)

关于c# - 使用 OpenProcess 和 ReadProcessMemory 的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1332067/

相关文章:

c# - 创建通用类,它将映射到任何类,而不知道类在 C# 中有多少成员

c# - 在屏幕上画线?

c# - SqlCommand 超时,即使在 SQL Studio 中相同的查询很快

.NET、SQL Server、NHibernate 和高精度小数

c++ - 原始指针隐式转换为常量指针,需要与用户类型相同

c# - 如何修复 TreeView 中的 foreach

c# - 当我们创建其继承类的新对象时,是否创建了基类的对象?

c# - 将流转换为 IRandomAccessStream

c++ - 问题在内联汇编中定义函数并从 C++ 调用

c++ - 使用 opencv 以 ycbcr 格式拍摄并保存图像