我试图用C#直接从内存中读取一个字节值。我尝试使用Marshal.Copy
Marshal.ReadByte
和所有范围内的许多不同地址。
我总是得到例外:
System.AccessViolationException:尝试读取或写入受保护的内存。这通常表明其他内存已损坏。
如何访问受保护的内存?
我使用了一些内存查看工具,这些工具可以毫无问题地访问整个内存。
示例:
IntPtr bufPtr = new IntPtr(0x00000772);
byte data = Marshal.ReadByte(bufPtr);
地址不在已知流程中,因此我无法使用ReadProcessMemory()
或类似内容。
答案 0 :(得分:5)
IntPtr bufPtr = new IntPtr(0x00000772);
永远不会工作,虚拟内存地址空间的底部64KB是保留的,永远不能被引用。这是针对空指针错误的一种对策,使用一个意外确保抛出AccessViolationException,通常会终止程序。
您无法选择任意地址,您选择的数字必须是已映射的虚拟内存区域的地址。查找有效地址至少需要对VirtualQuery()进行pinvoke调用。实用性仍然非常有限,在数以百万计的可能有效地址中,您不知道自己实际阅读的是什么。添加垃圾收集器,当它压缩堆时随机移动东西,找到任何有用的东西的可能性很小甚至没有。
您可以从SysInternals'中了解如何使用进程的虚拟内存地址空间。 VMMap utility。有关操作系统设计的入门书籍和像Windows Internals这样的书籍需要理解这一切。