C#.NET读取所有过程中的麻烦

时间:2018-08-11 08:40:33

标签: c# .net memory

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

如果使用内存编辑器,则不会获得与之相同的结果。

        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);

2 个答案:

答案 0 :(得分:1)

正如我所看到的那样,这段代码只不过是读取为该进程创建的可执行模块(.exe文件)的内存布局。因此,难怪您总是会得到相同的大小。

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

答案 1 :(得分:1)

您的问题很可能是由于Processcaches values

  

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

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