1

具体的には、ESPレジスタが指すアドレス(スタックトップアドレスを含む)を別の時間に読み取った場合、2つのアドレスが同じページにあるかどうかを判断するにはどうすればよいですか?これらのアドレスは、仮想アドレスではなく物理アドレスだと思いますよね? 2 つの読み取り値は、異なるプロセスに由来する可能性があります。Windows はどのようにページを割り当てますか?

追加:多分私はそれを手に入れました。では、4KB のページを使用する場合、0x....XXXX0000 から 0x....XXXX1000 までのアドレスが同じページにあるということですか?

4

1 に答える 1

4

あなたはそれをほぼ正しく理解しました。アイデアは健全ですが、範囲はになり0x????0000ます0x????0FFF。使用する場合DWORD_PTR、またはULONG_PTR下位12ビットをマスクして、(ptr & 0xFFF)取得した2つのポインタ値を比較することもできます。ULONG_PTRx64とDWORD_PTRx86の両方で動作するはずです。

システムが巨大なページを使用している可能性があることに注意してください。したがって、必ずGetNativeSystemInfoおよび/またはGetSystemInfoそれぞれを使用してください。構造dwAllocationGranularity内のの値を探しています。SYSTEM_INFO

これはすべて、同じプロセスメモリスペース内でのみ当てはまります。

物理アドレスに関する質問に関して:いいえ、繰り返します、ユーザーモードプロセスは、一部のドライバーまたはカーネル自体が失敗しない限り、実際の物理アドレスを確認します。

DLLのアドレスについて話していると仮定すると、VistaとそのASLR機能で始まる共有ページについて適切な仮定をすることはできません。

于 2013-03-13T04:58:52.467 に答える