c# - 尝试直接从内存中读取 (C#)

标签 c# memory

我尝试用 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/

相关文章:

c# - 无法重现 : C++ Vector performance advantages over C# List performance

c# - LINQ 表达式抛出 VerificationException

hadoop - 如何获取 hadoop yarn 应用程序的内存和 CPU 使用率?

与 calloc 与 malloc 相关的 C 教程问题

c++ - 通过数组漏洞覆盖数据

python - 为类型化内存 View 分配内存的推荐方法是什么?

c# - "Global"事件处理器

C# WinForm WebBrowser CSS 按钮 :hover and button:active

c# - Monotouch 全局异常处理

memory - 为什么结构在创建时共享相同的地址,而在删除时与创建的地址不同