1

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

我总是得到例外:

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

我该怎么做才能访问受保护的内存?

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

例子:

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

该地址不在已知进程中,因此我无法使用ReadProcessMemory()或类似的东西。

4

1 回答 1

5
  IntPtr bufPtr = new IntPtr(0x00000772);

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

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

您可以从 SysInternals 的VMMap 实用程序中了解如何使用进程的虚拟内存地址空间。需要一本关于操作系统设计的介绍性书籍和一本像 Windows Internals 这样的书才能理解这一切。

于 2013-01-01T15:58:25.830 回答