【问题标题】:Memory address from string来自字符串的内存地址
【发布时间】:2015-06-25 11:07:21
【问题描述】:

我有写内存的功能,但我想从字符串中导入地址,怎么做? 代码:

[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,但这不起作用。

【问题讨论】:

  • 请多解释,“我想从字符串中导入地址”?
  • 您正在尝试将数字从字符串(十六进制格式)解析为 int。内存地址与它无关。
  • 问题不清楚。你有字符串还是想格式化它?

标签: c# memory


【解决方案1】:

使用类似的东西:

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 始终可以包含它。

【讨论】:

  • 最后我会避免使用IntPtr。当然,这并没有错,但这显然不是 OP 所要寻找的(他试图传递 int)。
  • @TheodorosChatzigiannakis 他传递的0xffffffffWriteProcessMemory的第二个参数,也就是要写入的基地址LPVOID。所以IntPtr。他的 PInvoke 是错误的……我会写正确的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-25
  • 1970-01-01
  • 2023-03-21
  • 1970-01-01
  • 2017-05-03
  • 2015-01-26
相关资源
最近更新 更多