【问题标题】:C# .NET reading all of of a process troublesC# .NET 读取所有进程的问题
【发布时间】:2019-01-18 17:55:42
【问题描述】:

我正在使用我正在开发的扫描引擎,我正在尝试读取进程的内存。我的代码在下面(有点乱),但由于某种原因,如果我读取处于不同状态的应用程序的内存,或者在它有很多东西加载到内存之后,无论如何我都会得到相同的内存大小。我的入口点地址和长度是否不正确?

如果我使用内存编辑器,我不会得到与此相同的结果。

        Process process = Process.GetProcessesByName(processName)[0];
        List<Byte[]> moduleMemory = new List<byte[]>();

        byte[] temp;

            //MessageBox.Show(pm.FileName);
            temp = new byte[pm.ModuleMemorySize];
            int read;

            if (ReadProcessMemory(process.Handle, pm.BaseAddress, temp, temp.Length, out read)) {
                moduleMemory.Add(temp);
            }
        }
        //string d = Encoding.Default.GetString(moduleMemory[0]);
        MessageBox.Show("Size: " + moduleMemory[0].Length);

【问题讨论】:

    标签: c# .net memory


    【解决方案1】:

    您的问题可能是由Process class caches values 引起的:

    流程组件获取有关一组属性的信息 一次全部。 Process组件获取信息后 关于任何组的一个成员,它将缓存另一个成员的值 该组中的属性,而不是获得有关该组的新信息 该组的其他成员,直到您调用 Refresh 方法。 因此,不能保证属性值比 最后一次调用 Refresh 方法。分组分解为 取决于操作系统。

    因此,在目标进程加载一些附加模块后,process 实例仍将返回旧值。调用 process.Refresh() 应该会更新所有缓存值并修复问题。

    【讨论】:

      【解决方案2】:

      正如我所见,这段代码只不过是读取为其创建进程的可执行模块(.exe 文件)的内存布局。所以难怪你总是得到相同的尺寸。

      我假设您已准备好阅读进程的“操作”内存。如果是这样,你应该看看this discussion

      【讨论】:

        猜你喜欢
        • 2017-06-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-11-23
        • 2011-10-20
        • 1970-01-01
        • 1970-01-01
        • 2011-07-28
        相关资源
        最近更新 更多