我尝试用 C# 直接从内存中读取一个字节值。我尝试使用 Marshal.Copy
Marshal.ReadByte
和所有范围内的许多不同地址。
我总是得到异常:
System.AccessViolationException: Attempted to read or write protected memory. This is often an indication that other memory is corrupt.
如何访问 protected 内存?
我使用了一些内存查看工具,这些工具可以毫无问题地访问整个内存。
例子:
IntPtr bufPtr = new IntPtr(0x00000772);
byte data = Marshal.ReadByte(bufPtr);
地址不在已知进程中,所以我不能使用 ReadProcessMemory()
或类似的东西。
最佳答案
IntPtr bufPtr = new IntPtr(0x00000772);
那将永远 不起作用,虚拟内存地址空间的底部 64KB 是保留的,永远不能被引用。这是针对空指针错误的一种对策,不小心使用一个可以确保抛出 AccessViolationException,通常会终止程序。
您不能选择任意地址,您选择的数字必须是映射的虚拟内存区域的地址。查找有效地址至少需要对 VirtualQuery() 进行 pinvoke 调用。有用性仍然非常有限,在数百万个可能的有效地址中,您将不知道您实际阅读的是什么。添加垃圾收集器,当它压缩堆时随机移动东西,你找到任何有用的东西的几率微乎其微。
您可以从 SysInternals 的 VMMap utility 中了解进程的虚拟内存地址空间是如何使用的。 .需要一本关于操作系统设计的介绍性书籍和一本像 Windows Internals 这样的书籍才能理解这一切。
关于c# - 尝试直接从内存中读取 (C#),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14111497/