2


0

ご挨拶、

このようなロジックを使ってプロセスのメモリマップを調べることができます。

MEMORY_BASIC_INFORMATION mbi; void * lpAddress =(void *)0; while(VirtualQuery(lpAddress、

特定のセグメントが静的割り当て、スタック、ヒープなどに使用されているかどうかを知りたいのですが。

それを判断する方法はありますか?

1 Answer


0


私は興味があります、あなたはこの情報をどうするつもりですか?

あなたがそれをするコードを必要としないなら、あなたにこの情報を得ることができるwindbg拡張子、!addressがあります。 この情報を取得するには、おそらくデバッガのスクリプトを作成するほうがはるかに信頼性が高くなります。

ユーザーモードのコードがメモリを要求した理由がわからないため、VirtualQueryはこの情報を自分自身に返すことはできません。 あなたはこの情報を得るために他の情報源と共にそれを使う必要があります、そしてそれでもまだいくつかのエラーケースがあるかもしれません。

まず、MEM_PRIVATEメモリだけでフィルタリングする必要があります。 。 。 ヒープ、スタック、および静的割り当て(変更されている場合)は、その範囲内に収まるはずです。

静的割り当て(グローバルなど)は、ロードされたモジュールのあるアドレスにあるべきです。 PSAPIを使用して、アドレスがロードされたモジュール内にあるかどうかを判断できます。たとえば、EnumProcessModulesを呼び出してからGetModuleInformationを呼び出すことができます。

スタック値は、toolhelp APIを使用して、メモリ位置がスタック内にあるかどうかを判断できます。 ターゲットプロセス内のスレッドを取得するためにTH32CS_SNAPSHOTを使用してCreateToolhelp32Snapshotを取得し、次にGetThreadContextを実行して、結果のスタックポインタがセグメント内にあるかどうかを確認します。

プロセスの外側からヒープを歩くための良い方法がわかりません。 Toolhelpはヒープリストをスナップしますが、ヒープメモリのための良い範囲の境界をあなたに与えません。 プロセス内から、GetProcessHeapsを使用してヒープのリストを調べてから、メモリーの場所がヒープ内にある場合は、HeapValidateを呼び出してdtermieを呼び出すことができます。