2011-12-31 11 views
-2

私はC#でメモリスキャナを作ろうとしています。 API関数WriteProcessMemoryReadProcessMemoryが必要だと聞きました。C#でメモリスキャナを書く

私はそれらを呼ばれる:

[DllImport("kernel32.dll")] 
    public static extern bool ReadProcessMemory(
     IntPtr hProcess, 
     IntPtr lpBaseAddress, 
     byte[] lpBuffer, 
     UInt32 nSize, 
     ref UInt32 lpNumberOfBytesRead 
    ); 

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

私はGoogleで見つかったメモリスキャナのすべての例を理解することは非常に困難でした。私は値addrを見つけるためにあなたはどんなメモリバイトでも検索する必要があると言っている多くの記事を読んだ。今私は、メモリから読み書きするためのプロセスを開くプログラムを取得する必要があります。

GetProcessByNameでこれを行うことはできますか?

+0

短い答え:はい。長い答え:はい。 –

+0

[このプロジェクトのソースを読んで理解してください](http://www.codeproject.com/KB/cs/sojaner_memory_scanner.aspx) –

答えて

2

はい、そうのように:

Process[] process = Process.GetProcessesByName("cmd"); 
byte[] memory = new byte[255]; 
uint bytesRead =0; 
bool succes = ReadProcessMemory(
      process[0].Handle, 
      process[0].MainModule.BaseAddress , 
      memory , 
      (uint) memory.Length , 
      ref bytesRead); 

あなたは成功が真であるかどうかを確認する必要があります。そうでなければ何も読まない。

+0

もう1つの質問ですが、プロセスが機能しているかどうかを確認する必要はありません。後で読み書きするためにプログラムにプロセスを開きたい – user1124295

+0

@ user1124295 cmdという名前の実行中のプロセスは、このコードサンプルによって「開かれ」、後で読み書きできる状態になっています。あなたはここから行くことができます。私はReadProcesMemoryを呼び出すと、メモリを読み込むプロセスの有効な範囲にないメモリアドレスを与えた場合にfalseを返すかもしれないと説明しようとしました。あなたの努力で幸運。 – rene

関連する問題