【问题标题】:trying to read directly from memory (C#)尝试直接从内存中读取(C#)
【发布时间】:2013-01-01 15:04:24
【问题描述】:

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

我总是遇到异常:

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

如何访问受保护的内存?

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

例子:

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

地址不在已知进程中,所以我不能使用ReadProcessMemory() 或类似的东西。

【问题讨论】:

  • 如果该指针不在您的地址空间内,则无法在其位置读取。
  • 这是一件好事......
  • .NET 的设计不是为了阻止您这样做吗? .NET 旨在保护开发人员免于做潜在危险的事情,比如你正在尝试的事情。自动 CLR 内存管理是 .NET 的核心原则
  • 是时候阅读virtual memory...
  • @DavidStratton:C 和 C++ 也不允许您在虚拟内存系统中打孔...

标签: c# memory


【解决方案1】:
  IntPtr bufPtr = new IntPtr(0x00000772);

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

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

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

【讨论】:

    猜你喜欢
    • 2012-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-15
    • 2022-12-18
    • 2013-02-27
    • 1970-01-01
    相关资源
    最近更新 更多