C# .NET 读取所有进程问题



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

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

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

您的问题可能是由以下事实引起的,即Process类缓存值:

流程组件获取有关一组属性的信息 一下子。在流程组件获取信息后 关于任何组的一个成员,它将缓存另一个成员的值 该组中的属性,并且不获取有关 组的其他成员,直到您调用 Refresh 方法。 因此,不保证属性值比 上次调用刷新方法。组细分为 依赖于操作系统。

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

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

我假设您已经准备好阅读该过程的"操作"记忆。如果是这样,您应该看看这个讨论。

最新更新