11

最近、API呼び出しなどを使用して、別のプロセスメモリでバイトを読み書きできるC#クラスをまとめました。これまでに見たことがあると思いますが、

しかし、私の質問は、別のプロセスのメモリを効率的にスキャンする方法に関するものですか?Int32.MaxValueに到達するまで4バイトの各グループをテストする基本的な方法は知っていますが、(ご想像のとおり)非常に時間とリソースを消費することがわかりました。

私が読んだことから、「HeapWalk」を実行することによってプロセスの割り当てられたアドレスを決定する方法があります。誰かが私にこれに関するいくつかのコード例および/または情報を提供できますか、そしてそれについて行くための最良の方法は何でしょうか?

4

2 に答える 2

8

探しているのはメモリ領域のリストです。これは基本的にメモリアドレス/領域サイズのペアのリストです。

あなたがしなければならないことは:

  • PIDプロセスID( )を使用してターゲットプロセスへのハンドルを取得するOpenProcess
  • VirtualQueryExメモリスペースの最後に到達するまで(つまり、メソッドの結果が0より大きい間)関数を呼び出します。
  • 開いたプロセスハンドルを閉じます

asから始めVirtualQueryExます。これにより、プロパティとプロパティの両方を含む構造が返されます(これは、読み取ることができるメモリスペースを表します)。次に、パラメータを値でインクリメントします。これにより、の次の呼び出しで次のリージョンが返されます...など。lpAddress0x0MEMORY_BASIC_INFORMATIONBaseAddressRegionSizelpAdressRegionSizeVirtualQueryEx

Google、、OpenProcessなど、CloseHandle使用するさまざまなP / Invoke宣言を見つけることができるため、C#からこれらのWin32関数を呼び出すことができます。VirtualQueryExMEMORY_BASIC_INFORMATION

于 2012-12-14T15:49:49.527 に答える
0

スキャンパフォーマンスを向上させるためのアドバイスをお願いします。最も費用のかかるアクションはI\Oです。したがって、たとえばメモリ内のサブ文字列を検索する場合は、メモリの小さなチャンクを読み取るのではなく、内部を調べる前にメモリブロック全体を読み取ります。

于 2013-10-17T13:07:12.860 に答える