2012-03-03 21 views
1

私はプロセスを作成し、彼のメモリのいくつかのビットを読み取るプログラムを書いています。アドレスを取得するために、私はデバッガOllyDbgを使用しました。ReadProcessMemory with C#

using System; 
using System.Runtime.InteropServices; 
using System.Diagnostics; 

namespace winapi 
{ 
    class Program 
    { 
     [DllImport("kernel32.dll", SetLastError = true)] 
     static extern bool ReadProcessMemory(
      IntPtr hProcess, 
      IntPtr lpBaseAddress, 
      [Out] byte[] lpBuffer, 
      int dwSize, 
      out UInt32 lpNumberOfBytesRead 
     ); 


     static void Main() 
     { 
      Console.WriteLine("WinAPI test"); 
      Console.WriteLine("---"); 
      Console.WriteLine(); 

      var startInfo = new ProcessStartInfo { FileName = "Program.exe" }; 
      Process p = Process.Start(startInfo); 
      var bytes = new byte[4]; 
      uint read = 0; 
      p.WaitForInputIdle(); 
      // 

      while (read == 0) 
      { 
       ReadProcessMemory(p.MainWindowHandle, (IntPtr)0x052f820, bytes, bytes.Length, out read);  
       System.Threading.Thread.Sleep(10); 
      } 

      Console.WriteLine(read.ToString()); 
      Console.ReadLine(); 
     } 
    } 
} 

プロセスの開始後、ループは終了しません。デバッガからの データ:

0052F820 | 75 2F 3F 72 61 67 65 5F 69 64 3D 31 33 

私のミスですか?

+0

ドキュメントによると、関数が失敗した場合は0を返します。戻り値をチェックしていない場合は、それは成功していますか?そうでなければ、あなたが間違っていることを教えてくれるはずです。 –

+0

また、メモリアドレスは毎回完全に異なる場合があります。 – Deanna

答えて

2

回答はすでに@zmbqによって提供されています。 ReadProcessMemoryはStreamのようには動作しません。すべての読み取り操作でストリームの位置に合計読み取りカウントが追加されます。

私はまだあなたが代わりにプロセスがを扱うのウィンドウハンドルを渡している、コードで別の問題を見ることができます。したがって、結果が得られたとしても、ターゲットプロセスのメモリを実際に読み取るわけではありません。

+1

ありがとう!私は 'p.MainWindowHandle'を' p.Handle'に変更しました。 – Anton

2

なぜ終了するのですか?同じ4バイトを何度も何度も読んでいます。 ReadProcessMemoryはストリームのように動作しません。

+0

lpNumberOfBytesReadは、読み込まれたバイト数を返します。 count = 0なら、私はそれを再び読むでしょう。 – Anton