0

ReadProcessMemoryWindows .NET (C#/VB.net) アプリケーションで/ WriteProcessMemoryoverを使用Marshal.Copyしてアプリケーションのプロセスのメモリ (他のプロセスのメモリではなく) から読み書きすることの主な違い、長所と短所を誰かが概説できるかどうか疑問に思っています。プロセス)。特に、プロセスのメモリ内の任意のアドレスを含む操作と、メモリ ブロックをバイト配列として扱う操作 (つまり、生データの読み取り/書き込み) の場合。

/が機能Marshal.Copyするすべての場合に機能しますか、それともより制限されていますか?ReadProcessMemoryWriteProcessMemory

Marshal.Copyの実装はReadProcessMemory/ WriteProcessMemoryAPI を内部的に使用していますか?

明確にするために:私は、他のプロセスのメモリではなく、呼び出し(所有)プロセスのメモリからの読み取り/書き込みについてのみ話しています!

ありがとう。

4

2 に答える 2

4

ReadProcessMemoryおよび異なるプロセスWriteProcessMemoryのメモリに対して読み書きできるようにするネイティブの Win32 API です。これらの API を使用する必要があるのは、別のプロセスでメモリを読み書きしようとするときだけです。ご想像のとおり、ルーチン開発ではあまり使用されません。

Marshal.Copyマネージド メモリとアンマネージド メモリの間で、同じプロセス内でコピーするために使用されます。

ReadProcessMemory/WriteProcessMemory が機能するすべてのケースで Marshal.Copy が機能しますか?

いいえ、Marshal.Copy単一のプロセス内での操作に限定されます。

Marshal.Copy の実装は内部で ReadProcessMemory/WriteProcessMemory API を使用しますか?

いいえ。

明確にするために:私は、他のプロセスのメモリではなく、呼び出し(所有)プロセスのメモリからの読み取り/書き込みについてのみ話しています!

その場合、ReadProcessMemoryそしてWriteProcessMemory単にあなたのニーズには関係ありません.

于 2012-05-24T11:56:30.327 に答える
3

Marshal.Copy()は、Read / WriteProcessMemory()の代わりにはなりません。プロセスのアドレス空間に到達して、そのプロセスが所有するメモリにアクセスすることはできません。これがそうであるという最も強いヒントは、プロセスハンドルをとる過負荷がないということです。

Windowsのすべてのプロセスには、独自の仮想メモリアドレス空間があることに注意してください。あるプロセスのポインタは、別のプロセスでは使用できません。これは、Windowsが提供するプロセス分離の大きな部分であり、プロセスが相互に不安定になるのを防ぎます。また、セキュリティ保証を提供するには、プロセスが同じユーザーによって所有されていない場合、ReadProcessMemory()を使用するには管理者権限が必要です。プロセスハンドルは、OpenProcess()呼び出しでPROCESS_VM_READ / WRITEを指定することによって取得する必要があります。これは、高い特権です。

独自のプロセスでポインタにアクセスしている場合、これは問題ではありません。その場合は、pinvokeマーシャラーに組み込まれているMarshal.Copy()に依存しているだけです。ビューからはうまく隠されていますが、pinvoke呼び出しを行い、Windowsが関数を実行するオーバーヘッドを追加しているため、Copy()よりも高速ではありません。Marshal.Copy()はシンプルで高速で、memcpy()と同等です。

于 2012-05-24T11:51:23.200 に答える