【问题标题】:C# ReadProcessMemory error 299C# ReadProcessMemory 错误 299
【发布时间】:2018-08-12 03:29:56
【问题描述】:

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

        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# .net memory readprocessmemory


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-20
    • 1970-01-01
    • 1970-01-01
    • 2021-11-23
    • 2011-10-21
    • 1970-01-01
    相关资源
    最近更新 更多