0

以下のコードを考えると、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);
4

1 に答える 1

0

間違ったアクセスタイプでハンドルを開いていました。0x0010は読み取りです。0x0020は書き込みです。1つ開いた状態で読み取り/書き込みを取得したいと思っていましたが、個別に処理する必要があるようです。

ソース:http ://www.codeproject.com/script/Articles/ViewDownloads.aspx?aid = 15680

于 2011-06-05T01:46:21.977 に答える