我正在尝试访问32位地址,但是当我创建IntPtr时,它会抛出一个OverflowException。这是代码:
uint memAddr = 0xF5920824;
IntPtr bufPtr = new IntPtr(memAddr);
byte[] data = new byte[4];
Marshal.Copy(bufPtr, data, 0, 4);
我如何访问该地址?
答案 0 :(得分:3)
如此大的数量> 2 ^ 31-1你需要编译为64位。
转到Configuration Manager ...并将平台从x86更改为任何CPU或x64。
答案 1 :(得分:2)
通过将uint
传递给IntPtr
,您将其转换为long
,因为IntPtr
不支持无符号整数。然后,如果您在32位进程中运行,则uint
会溢出int
。
您需要使用64位来读取该地址。
答案 2 :(得分:2)
您的程序无法访问其他程序的内存地址(无论您要阅读的地址是否适合Int32
,请参阅this post了解它只是使用IntPtr
因为它们在私人地址空间内运行。
它必须由第一个程序(共享内存或其他东西)以某种方式共享。此外,即使在同一程序的另一个实例中,一个程序中的地址XYZ可能完全不同(因为该地址是VIRTUAL)。
如果您确定内存地址(如何?甚至可能需要扫描进程内存),您必须进行P / Invoke ReadProcessMemory()
,这是一个专为调试而设计的函数,如果您的可执行文件足够你可以阅读另一个过程的记忆特权
有关示例,请参阅this post here on SO。