14


4

Windows Vistaでのポインタの安定性

私はしばらくの間、CおよびCプロジェクト用にWindows XP Pro 64ビット環境でVisual Studio 2005を使用してきました。 私がデバッガで時々使っていたよくあるトリックの1つは、プログラムの前回のデバッグ実行からの数値ポインタ値(例えば 0x00000000FFAB8938)を覚えておき、それを適切なタイプキャスト付きのウィンドウを見るために加えることです((MyObject *)0x00000000FFAB8938) - > data_field`)を選択してから、次回のデバッグ実行中にオブジェクトが占有しているメモリを監視します。 多くの場合、コードが変更されない限り、割り当てられたメモリレイアウトも変更されないことを期待するのが妥当であるため、これは非常に便利で便利なことです。 一言で言えば、それは動作します。

しかし、比較的最近、私はWindows Vista(Home Premium)64ビットを搭載したラップトップで同じバージョンのVisual Studioを使い始めました。 不思議なことに、この設定でこのトリックを使用することははるかに困難です。 実際のメモリアドレスは明らかな理由もなく実行ごとにかなり頻繁に変化するように思われる。 プログラムのコードがまったく変更されていない場合でも 実際のアドレスは完全にランダムに変化しているのではなく、多かれ少なかれ安定した値のセットから1つの値を選択するだけですが、いずれにせよこの種のメモリ監視を行うことははるかに困難です。

誰かがこの動作の理由をWindows Vistaで知っていますか? メモリレイアウトの変更の原因は何ですか? 他の[システム]プロセスからプロセスアドレス空間への外部からの侵入はありますか それともVistaでのHeap API実装のちょっと風変わりな機能でしょうか。 これを防ぐ方法はありますか?

1 Answer


30


Windows Vistaはhttp://msdn.microsoft.com/ja-jp/library/bb430720.aspx [アドレススペースのレイアウトのランダム化、ヒープのランダム化、およびスタックのランダム化]を実装しています。 これはセキュリティメカニズムで、コードとデータの各部分がメモリ内のどこにあるのかを知っていることによるバッファオーバーフロー攻撃を防ぎます。

MoveImagesレジストリ値を設定することで、ASLRを無効にすることが可能です。 私はヒープランダム化を無効にする方法を見つけることができませんでした、しかし、何人かのマイクロソフトの人はhttp://social.msdn.microsoft.com/Forums/en/vcgeneral/thread/9260e0d9-9968-485a-ab9a-0eb96ba38ca4に関連してアドレスを計算することを勧めます[_crtheap]。 ヒープが移動しても、相対アドレスは安定したままです。