gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 20:20:08 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com