字符串中的内存地址

本文关键字:地址 内存 字符串 | 更新日期: 2023-09-27 17:59:44

我有写内存的功能,但我想从字符串中导入地址,如何做到这一点?代码:

[DllImport("kernel32.dll", SetLastError = true)]
static extern bool WriteProcessMemory(int hProcess, int lpBaseAddress,
byte[] lpBuffer, int dwSize, ref int lpNumberOfBytesWritten);

这个:

WriteProcessMemory((int)processHandle, 0xffffffff, buffer, buffer.Length, ref bytesWritten);

我想把这个"0xffffffff"换成string,但我不知道怎么做。我尝试将带地址的字符串转换为int,但这不起作用。

字符串中的内存地址

使用类似于的东西

string str = "0xffffffffffffffff";
if (str.StartsWith("0x", StringComparison.OrdinalIgnoreCase))
{
    str = str.Substring(2);
}
IntPtr ptr = (IntPtr)long.Parse(str, NumberStyles.HexNumber);

注意,long.Parse不支持0x,所以如果存在,我会将其删除。

我使用long.Parse来支持64位系统和32位系统。

请注意,您使用的PInvoke签名是错误的。。。它适用于32位,但与32位和64位兼容的通用版本是:

[DllImport("kernel32.dll", SetLastError = true)]
static extern bool WriteProcessMemory(
    IntPtr hProcess, 
    IntPtr lpBaseAddress, 
    byte[] lpBuffer, 
    IntPtr dwSize, 
    out IntPtr lpNumberOfBytesWritten);

如果您需要操作IntPtr,您应该始终将它们转换为long,因为IntPtr可以是32或64位,所以long可以始终包含它。