我正在使用一个正在使用的扫描引擎,并且正在尝试读取进程的内存。我的代码在下面(有点混乱),但是由于某种原因,如果我以不同的状态读取应用程序的内存,或者在将很多东西加载到内存后,无论如何我都会得到相同的内存大小。我的入口点地址和长度不正确吗?
如果使用内存编辑器,则不会获得与之相同的结果。
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);
答案 0 :(得分:1)
正如我所看到的那样,这段代码只不过是读取为该进程创建的可执行模块(.exe文件)的内存布局。因此,难怪您总是会得到相同的大小。
我假设您准备阅读该过程的“操作”内存。如果是这样,您应该看看this discussion。
答案 1 :(得分:1)
您的问题很可能是由于Process
类caches values:
流程组件获取有关一组属性的信息 一次全部。在“流程”组件获得信息之后 大约任何组的一个成员,它将为另一组缓存值 该组中的属性,而不会获取有关 该组的其他成员,直到您调用Refresh方法。 因此,不能保证属性值比 最后一次调用Refresh方法。组细分是 取决于操作系统。
因此,在目标进程加载了一些其他模块之后,process
实例仍将返回旧值。调用process.Refresh()
应该会更新所有缓存的值并解决该问题。