none
mapファイルに出力されるアドレスの固定方法 RRS feed

  • 質問

  • Visual C++2005(2008,2010でも同様かと思います)にてソリューションをビルドしdllを生成すると、dll内の変数のアドレス情報がmapファイルに出力されます。このアドレスが、変数の追加・削除を行わなくても、ビルドを実行すると変わってしまうことがあります。

    変数の追加・削除を行わない場合は、ビルドをしてもアドレスが変わらないようにしたいのですが、その方法はありますか?ご教授願います。

    理由:

    ある別アプリケーションからアドレスを指定してdll内の変数の値をモニタしているため、アドレスが変わってしまうと別アプリケーションのアドレス設定をし直す手間が発生してしまいます。

    2011年7月1日 3:46

回答

  • >ビルドをしてもアドレスが変わらないようにしたい
    参照したい変数や別アプリケーションの性質がよく分からないのですが、基本的に現実的ではありません。

    例えば、最初のうちはある特定のAddressでaccess出来ていたとしても、その後exeが肥大化したらAddressが変わる可能性があります。
    また、OSによりMemory managementの仕組みが変わる可能性も考えられますね。
    API等でそういった枠組みが用意されているのならよいのですが、残念ながら見当たりません。

    ASLR(Address Space Layout Randomization)が導入された経緯や背景から分かると思いますが、
    addressの固定というのはsecurity上望ましいことではありません。

    対応するなら別の手段を検討された方が良いです。

    例えば、named mapping objectなど共有メモリを利用する方法があります。
    ただしこの場合、名前が被らないように配慮する必要があります。

    2011年7月2日 1:48
  • accessしたいaddressをDLLがtemporary fileに書き出して、
    別アプリケーションがそれを参照し、addressを確定する方法もダメですか?

    質問の要点は、
      >アドレスが変わってしまうと別アプリケーションのアドレス設定をし直す手間が発生してしまいます。
    この手間をなくしたい、ということですよね?

    >変数の追加・削除を行わない場合は、ビルドをしてもアドレスが変わらないようにしたい
    変数の追加・削除を行わなくても、結局、Applicationによって読み込まれる他のDLLが確定できないため(OSや常駐Applicationの存在有無によっても異なる)、
    直値によるaccessは無理でしょうね。

    確実ではない方法ですが、VirtualAllocでaddress指定をする方法があります。
    でもこの方法を取るぐらいなら、named mapping objectの方がまだ安全です。

    ある特定の限られた状況であれば、以下の方法も取れそうですが、
    その点が不確実なため私からは何とも言えません。

    [/FIXED (Fixed Base Address)]
      http://msdn.microsoft.com/en-us/library/w368ysh2(v=VS.80).aspx

    [Need for Rebasing a DLL]
      http://www.codeproject.com/KB/DLL/RebaseDll.aspx

    • 回答としてマーク 山本春海 2011年9月2日 5:05
    2011年7月13日 14:09

すべての返信

  • とりあえず、プロジェクトのオプションで、以下の2点について試してみてはどうでしょう。
     1.「リンカ」の「全般」の「インクリメンタルリンク」 -> 「行わない」に設定。
     2.「リンカ」の「詳細」の「ランダム化されたベースアドレス」 -> 「無効にする」に設定。

    2011年7月1日 7:47
  • 一応、変数であってもDLLとしてエクスポート可能なので、固定アドレスにアクセスするよりは、きちんとリンクした方がいいと思います。
    2011年7月1日 12:57
  • ご教授ありがとうございます。

    すぐに試したいところですが、環境が今はありませんので、日曜日以降に試させていただきます。

    2011年7月1日 16:02
  • 一応、変数であってもDLLとしてエクスポート可能なので、固定アドレスにアクセスするよりは、きちんとリンクした方がいいと思います。

    ご教授ありがとう御座います。
    申し訳ありませんが、今私が使用しているアプリケーションの関係上、固定アドレスにアクセスしないといけません。

     

    2011年7月1日 16:03
  • >ビルドをしてもアドレスが変わらないようにしたい
    参照したい変数や別アプリケーションの性質がよく分からないのですが、基本的に現実的ではありません。

    例えば、最初のうちはある特定のAddressでaccess出来ていたとしても、その後exeが肥大化したらAddressが変わる可能性があります。
    また、OSによりMemory managementの仕組みが変わる可能性も考えられますね。
    API等でそういった枠組みが用意されているのならよいのですが、残念ながら見当たりません。

    ASLR(Address Space Layout Randomization)が導入された経緯や背景から分かると思いますが、
    addressの固定というのはsecurity上望ましいことではありません。

    対応するなら別の手段を検討された方が良いです。

    例えば、named mapping objectなど共有メモリを利用する方法があります。
    ただしこの場合、名前が被らないように配慮する必要があります。

    2011年7月2日 1:48
  • ご教授ありがとうございます。 

    申し訳ありませんが、今私が使用しているアプリケーションの関係上、固定アドレスにアクセスしないといけません。

    (他の手法を検討し、それに乗り換えるという手段は取れないのです。) 

    2011年7月6日 15:22
  • accessしたいaddressをDLLがtemporary fileに書き出して、
    別アプリケーションがそれを参照し、addressを確定する方法もダメですか?

    質問の要点は、
      >アドレスが変わってしまうと別アプリケーションのアドレス設定をし直す手間が発生してしまいます。
    この手間をなくしたい、ということですよね?

    >変数の追加・削除を行わない場合は、ビルドをしてもアドレスが変わらないようにしたい
    変数の追加・削除を行わなくても、結局、Applicationによって読み込まれる他のDLLが確定できないため(OSや常駐Applicationの存在有無によっても異なる)、
    直値によるaccessは無理でしょうね。

    確実ではない方法ですが、VirtualAllocでaddress指定をする方法があります。
    でもこの方法を取るぐらいなら、named mapping objectの方がまだ安全です。

    ある特定の限られた状況であれば、以下の方法も取れそうですが、
    その点が不確実なため私からは何とも言えません。

    [/FIXED (Fixed Base Address)]
      http://msdn.microsoft.com/en-us/library/w368ysh2(v=VS.80).aspx

    [Need for Rebasing a DLL]
      http://www.codeproject.com/KB/DLL/RebaseDll.aspx

    • 回答としてマーク 山本春海 2011年9月2日 5:05
    2011年7月13日 14:09