【问题标题】:Why does ReadProcessMemory always return zeros?为什么 ReadProcessMemory 总是返回零?
【发布时间】:2011-06-05 01:42:52
【问题描述】:

鉴于下面的代码,ReadProcessMemory 总是返回一个零数组。我试图在正在运行的进程中找到一个字符串(可能是数字)并识别该字符串存在的所有位置。但是 ReadProcessMemory 总是返回一个零数组。这是为什么呢?

  • 我已尝试以管理员身份运行 VS 并删除不安全块。
  • processPointer 具有正确的进程句柄值。
  • BaseAddress 确实正确地迭代了 1,并且 似乎 是我正在寻找的内存位置。
  • 尽管显然没有找到任何匹配项,但它确实运行得相当快。 72MB 进程需要几秒钟。

.

// (other stuff in method...)
IntPtr baseAddress = process.MainModule.BaseAddress;
IntPtr lastAddress = baseAddress + process.MainModule.ModuleMemorySize;
processPointer = OpenProcess((uint)(0x0020), 1, (uint)PID);
for (int addr = (int)baseAddress; addr + value.Length < (int)lastAddress; addr++)
{
    string ActualValue = ReadMemory((IntPtr)addr, (uint)value.Length, (IntPtr)addr);
    if (string.IsNullOrEmpty(ActualValue)) continue;
    if (ActualValue.Trim().ToLower() == value.Trim().ToLower())
        PossibleAddresses.Add((IntPtr)addr);
}
// (other stuff in method...)

CloseHandle(processPointer);

private string ReadMemory(IntPtr memAddress, uint size, IntPtr  BaseAddress)
{
    byte[] buffer = new byte[size];
    IntPtr bytesRead;
    unsafe
    {
        ReadProcessMemory(processPointer, BaseAddress, buffer, size, out bytesRead);
        return BitConverter.ToString(buffer); // always "00-00-00-00....."
    }
    return Encoding.Default.GetString(buffer); // Another way I tried to read the data
}


[DllImport("kernel32.dll")]
public static extern IntPtr OpenProcess(UInt32 dwDesiredAccess, Int32 bInheritHandle, UInt32 dwProcessId);
[DllImport("kernel32.dll")]
public static extern Int32 CloseHandle(IntPtr hObject);
[DllImport("kernel32.dll")]
public static extern Int32 ReadProcessMemory(IntPtr hProcess, IntPtr lpBaseAddress, [In, Out] byte[] buffer, UInt32 size, out IntPtr lpNumberOfBytesRead);

【问题讨论】:

  • 您没有检查ReadProcessMemory 的返回值。如果有错误,它将返回FALSE,您需要检查GetLastError

标签: c# winapi memory interop kernel32


【解决方案1】:

我打开手柄时使用了错误的访问类型。 0x0010 是读取; 0x0020 是写。我希望在一次打开的情况下进行读/写,但看起来我必须单独处理。

来源:http://www.codeproject.com/script/Articles/ViewDownloads.aspx?aid=15680

【讨论】:

  • 在打开的一个进程句柄上很容易读取和写入,我通常使用PROCESS_ALL_ACCESS 标志,但使用 0x30 应该可以解决问题(PROCESS_VM_READ|PROCESS_VM_WRITE),OFC 你需要足够的特权,但可以使用SeSetDebugPrivilages
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-06-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-17
  • 2010-09-26
  • 1970-01-01
相关资源
最近更新 更多