3

しばらく前に、プロセスのメモリを読み取り、特定の値 (たとえば、整数 42 が出現するすべての場所) を探すメモリ スキャナを C# で作成しました。それ以来、私はこのプロジェクトを再検討し、64 ビット システムで動作するように設計しようとしています。私が直面している問題は、64 ビット プロセスが最大 8 TB の仮想メモリを許可されていることです (32 ビット システムでは 2 ~ 4 GB の控えめなメモリと比較して)。少なくとも私のコードでは、妥当な時間内に 0 から 8 TB の範囲のすべてのアドレスをスキャンすることは不可能です。

Process.MainModule.BaseAddress でスキャンを開始しようとしましたが、読み取りを停止する場所がわからず、重要な値が確実に欠落しています。プロセスが実際に使用しているものの範囲をスキャンできるように、フィールドを絞り込むにはどうすればよいですか?

4

1 に答える 1

2

最終的に、VirtualQueryEx ライブラリ メソッドを使用して、メモリのどのセクションまたは仮想ページが使用されているかを突き止めました。この機能を使用して、独自の「メモリ マップ」を作成し、使用済みページとアクセス可能なページを特定しました。Pinvoke には、これを行う方法の良い例があります: PInvoke 記事

MEM_COMMIT としてフラグが付けられた仮想メモリのセクションを調べ、アクセス許可に PAGE_GUARD が含まれていないことを確認することで、関連性があり読み取り可能な必要なメモリのチャンクを見つけることができました。

于 2013-01-07T08:59:46.720 に答える