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