WindowsプロセスはPEヘッダーをロードしてから次のセクション(.text .dataなど)をロードすることでRAMにマップされ、ReadProcessMemoryで読み取ることができることを知っていますが、VirtualQueryExのポイントは何ですか?一度に1ページ(ページングシステムで使用されるメモリページ)を読み取る必要があると思いますが、メモリページがPEセクションにどのように関連しているかわかりません。.textセクションだけをスキャンしたい場合はどうなりますか。 VirtualQueryExも使用する必要がありますか、それともページがコンテンツに関連していませんか?
2 に答える
VirtualQueryExは、ページの割り当て方法、ページに含まれる一般的な種類の情報などに関する情報を取得します。以前の回答でデモコードを投稿しました。これにより、プロセスがウォークスルーされ、ターゲットプロセス用にOSから割り当てられたメモリのすべてのブロックに関する情報がダンプされます。
ReadProcessMemoryを使用すると、指定したプロセスのメモリブロックの実際のコンテンツを読み取ることができます。これを使用するには、ターゲットプロセスでアドレスを指定する必要がありますが、それ自体では、そのプロセスのどこにあるのかはわかりません。
あるプロセスでマップされた実行可能ファイルの一部を読み取りたい場合は、通常、VirtualQueryExを使用して、関心のある部分がメモリ内のどこにロードされているかを見つけ、次にReadProcessMemoryを使用して関心のある部分を読み取ります。たとえば、別の以前の回答では、コミットされ、プライベートまたはマップされたプロセスのすべてのページで指定されたパターンを検索するコードを投稿しました。
探しているものによっては(特に、ターゲットプロセスのコードなどを調べたい場合)、シンボルハンドラーAPIのようなものを使用して、気になる部分を見つけることができます。VirtualQueryExは、かなり粗い粒度で物事を調べます。たとえば、実行可能ファイル全体がマップされたメモリブロック全体のベースアドレスとサイズはわかりますが、その中の場所についてはあまりわかりません。 (多くの場合大きい)ブロック。
シンボルハンドラAPIは、(たとえば)その実行可能ファイルから特定の関数のアドレスを通知できます(デバッグ情報を含む実行可能ファイル、またはexe / dllからのエクスポートに関心のある関数などの情報が利用可能な場合)。
どのメモリページがメモリにロードされたPEのどのセクションに属しているかを判断するには、そのPEヘッダーを読み取り、解析して、.text、.code、.bssなどのセクションを見つける必要があります。
VirtualQueryExは、読み取り、書き込み、実行フラグなど、メモリのそのページに関する情報を含むPMEMORY_BASIC_INFORMATIONを返します。