试图直接从内存中读取(C#)

时间:2013-01-01 15:04:25

标签: c# memory

我试图用C#直接从内存中读取一个字节值。我尝试使用Marshal.Copy Marshal.ReadByte和所有范围内的许多不同地址。

我总是得到例外:

  

System.AccessViolationException:尝试读取或写入受保护的内存。这通常表明其他内存已损坏。

如何访问受保护的内存?

我使用了一些内存查看工具,这些工具可以毫无问题地访问整个内存。

示例:

IntPtr bufPtr = new IntPtr(0x00000772);
byte data = Marshal.ReadByte(bufPtr);

地址不在已知流程中,因此我无法使用ReadProcessMemory()或类似内容。

1 个答案:

答案 0 :(得分:5)

  IntPtr bufPtr = new IntPtr(0x00000772);

永远不会工作,虚拟内存地址空间的底部64KB是保留的,永远不能被引用。这是针对空指针错误的一种对策,使用一个意外确保抛出AccessViolationException,通常会终止程序。

您无法选择任意地址,您选择的数字必须是已映射的虚拟内存区域的地址。查找有效地址至少需要对VirtualQuery()进行pinvoke调用。实用性仍然非常有限,在数以百万计的可能有效地址中,您不知道自己实际阅读的是什么。添加垃圾收集器,当它压缩堆时随机移动东西,找到任何有用的东西的可能性很小甚至没有。

您可以从SysInternals'中了解如何使用进程的虚拟内存地址空间。 VMMap utility。有关操作系统设计的入门书籍和像Windows Internals这样的书籍需要理解这一切。