首页 > 解决方案 > C# ReadProcessMemory 错误 299

问题描述

我正在尝试读取所有进程的内存。我一直在用这个

        ProcessModule pm = process.MainModule;
        temp = new byte[pm.ModuleMemorySize];
        byte[] d = new byte[temp.Length];
        int read;
        int size = temp.Length;
        MessageBox.Show("Size: " + size);

        if (ReadProcessMemory(process.Handle, pm.BaseAddress, temp, size, out read)) {
            //d = temp;
            fileData = encoder.GetString(temp);
        } else MessageBox.Show("Error: " + Marshal.GetLastWin32Error());

有时这完全可以正常工作,但在其他应用程序中它根本不起作用并返回“错误 299”。

我以 x64 和管理员身份运行我的应用程序。我尝试阅读的过程类型似乎没有什么区别。即使是大的(26MB)也读得很好。然后我尝试阅读我的其他 C# 程序之一,但它不起作用。

编辑:这是否可能仅在尝试读取 C# .exe 进程时发生?为什么会这样?

标签: c#.netmemoryreadprocessmemory

解决方案


如果您的目标是 x64,请为 x64 显式编译。如果您的目标是 x86,请为 x86 显式编译。您可以在项目属性中找到设置。

您必须这样做,因为每个体系结构的许多 Windows API 结构都不同,这是因为如果结构包含指针,它们在 x86 上是 4 字节,在 x64 上是 8 字节。

对所有地址/偏移量使用 IntPtr,这将使它为您构建它的目标使用正确的指针大小。这样,您在尝试将 8 字节值放入 4 字节变量时不会有任何问题。

如果您遵循此技术,您将不会遇到这些问题。


推荐阅读