我正在尝试访问一个 32 位地址,但是当我创建 IntPtr 时,它会抛出一个 OverflowException。这是代码:
uint memAddr = 0xF5920824;
IntPtr bufPtr = new IntPtr(memAddr);
byte[] data = new byte[4];
Marshal.Copy(bufPtr, data, 0, 4);
我怎样才能访问该地址?
我正在尝试访问一个 32 位地址,但是当我创建 IntPtr 时,它会抛出一个 OverflowException。这是代码:
uint memAddr = 0xF5920824;
IntPtr bufPtr = new IntPtr(memAddr);
byte[] data = new byte[4];
Marshal.Copy(bufPtr, data, 0, 4);
我怎样才能访问该地址?
对于如此大的数字 > 2^31-1,您需要编译为 64 位。
转到配置管理器...并将平台从 x86 更改为 Any CPU 或 x64。
通过将 a 传递uint
给IntPtr
,您将其转换为 a long
,因为IntPtr
不支持无符号整数。然后,如果您在 32 位进程中运行,则会uint
溢出int
.
您需要使用 64 位来读取该地址。
您的程序不能访问另一个程序的内存地址(不管您要读取的地址不适合Int32
,请参阅这篇文章以了解它是什么),IntPtr
因为它们在其私有地址空间内运行。
它必须以某种方式由第一个程序(共享内存或其他东西)共享。此外,即使在同一程序的另一个实例中,一个程序中的地址 XYZ也可能完全不同(因为地址是虚拟的)。
如果您确定内存地址(如何?甚至可能需要扫描进程内存),您必须 P/Invoke ReadProcessMemory()
,这是一个为调试目的而设计的函数,如果您的可执行文件有足够的权限,您可以读取另一个内存过程。
例如,请参阅SO 上的这篇文章。