Out of Memory

本ブログは更新を停止しました。Aerieをよろしくお願いいたします。

目次

Blog 利用状況

ニュース

2009年3月31日
更新を停止しました。引き続きAerieを御愛顧くださいませ。
2009年2月3日
原則としてコメント受付を停止しました。コメントはAerieまでお願いいたします。
詳細は2月3日のエントリをご覧ください。
2008年7月1日
Microsoft MVP for Developer Tools - Visual C++ を再受賞しました。
2008年2月某日
MVPアワードがVisual C++に変更になりました。
2007年10月23日
blogタイトルを変更しました。
2007年7月1日
Microsoft MVP for Windows - SDKを受賞しました!
2007年6月20日
スキル「ニュース欄ハック」を覚えた!
2006年12月14日
記念すべき初エントリ
2006年12月3日
わんくま同盟に加盟しました。

カレンダー

中の人

αετο? / aetos / あえとす

シャノン? 誰それ。

顔写真

埼玉を馬鹿にする奴は俺が許さん。

基本的に知ったかぶり。興味を持った技術に手を出して、ちょっと齧りはするものの、それを応用して何か形にするまでは及ばずに飽きて放り出す人。

書庫

日記カテゴリ

Address Space Load Randomization

詳細はTechNet Magazineを参照。

Address Space Load Randomizationとは、要するに、DLLのロードアドレスをある程度ランダムにすることで、悪意のあるソフトウェアを抑えるという、Vistaから導入された新技術である。
この機能は、PEヘッダ(IMAGE_OPTIONAL_HEADER::DllCharacteristics)に、ビット0x0040(winnt.hではIMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE)が立っているイメージについて有効になるものと思われる。

さて、前述のTechNet Magazineには、こうある。
動的再配置フラグは Windows Vista のすべての DLL と実行可能ファイルに含まれていますが、このフラグを含むイメージのみが再配置されます。これは、レガシ イメージを移動すると、開発者がイメージの読み込み場所に関して行っている内部的な想定に反する可能性があるためです。

ところで、皆さんは「DLLのバインド」という機能をご存知だろうか。
ここで紹介したASLRとは対極をなす、「DLLのロードアドレスを事前に決定する」というものだ(正しくは、ロードアドレスの事前決定は「リベース」という作業。バインドは、DLLが特定のアドレスにロードされていると仮定して、DLL内の関数のアドレスを事前決定するもの)。ASLRが行われると、リベースもバインドも意味がなくなってしまう。

リベースは、ロードされるDLLに対して行う作業だが、バインドは、そのDLLをロードする側に対して行う。ロードしたDLLが、期待したアドレスに配置されていなかったり、ロードアドレスは期待した通りでも、DLLのバージョンが違って、関数のオフセットが違ったりすると、バインドはできない。
そこで、ロードしたDLLがバインドしたものかどうかを判断するために、そのDLLのビルド時刻が使われる。
このビルド時刻は、PEファイルのIMAGE_FILE_HEADER::TimeDateStampに、32bitで格納される。故に、ここには2038年問題が存在する。
Microsoftは、64bit Windows用にPEファイル形式を拡張する際に、このフィールドを64bitにすることもできたが、そうしなかった。
それは少なくとも、Microsoftが、2038年までにはDLLのバインドを使わなくなることを意味していた。結果としてそれは、2007年の時点で現実となり、バインドを使っているファイルは「レガシ イメージ」と呼ばれるようになってしまった。

話は唐突に変わるが、.NET Framework上で動く実行ファイルも、EXEやDLLといった形をとる。
.NETにある程度詳しい方であれば、.NET Frameworkにとって重要なのはILとメタデータであるということをご存知だろう。
.NET用ではない、Win32用のネイティブな実行ファイルには、ネイティブコードと、それに関するメタデータが豊富に含まれている(バインドもビルド時刻もその一種だ)。しかし、.NET Frameworkはそれらを使わない。
要するに、.NET用の実行ファイルがEXEやDLLという形態をとる必然性はなく、また、ILによるマルチプラットフォームを謳う上では、Win32用のPEという形式は有害でしかないと言っていい。Unix用の.NETコンパイラであるMonoまでがPEを出力し、実行することに、一体何の意味があるというのか。
また、.NET用のPEファイルは、PEファイルという視点で見る限り、外部のモジュールに、たった1つの関数しかリンクしていない。この点において、.NET PEは、リベースとバインドの恩恵をまったくと言っていいほど受けることができない。
きっと、バインドが決定的に死ぬ2038年ごろには、ネイティブなPEファイルなど存在していないのだろう。Microsoftはそこまで見据えて、タイムスタンプフィールドの拡張をしなかったのかもしれない。

ASLRは、PEファイルに新しい機能をもたらす半面、別の機能の死を加速させた。
.NETにおいては完全に形骸化し切っているPEというフォーマットに、Microsoftがいつまでしがみつくのか、ずいぶん前からひそかに注目している。

投稿日時 : 2007年4月23日 0:28

Feedback

# re: Address Space Load Randomization 2007/04/23 17:37 渋木宏明(ひどり)

>Unix用の.NETコンパイラであるMonoまでがPEを出力し、実行することに、一体何の意味があるというのか。

実際どうだったのかは知りませんが、この辺をどうするか決めた時って、結構もめたんじゃないかな。

結局「うまくいけば .exe/.dll ファイルをもう一方のプラットフォームに持って行ってそのまま使える」というのをとった、ってことなんですかね?

てーことは、GAC に登録されている標準ライブラリのアセンブリのストロングネームも .NET 互換てこと?>mono

# re: Address Space Load Randomization 2007/04/23 17:43 シャノン

てゆーか、Mono にも GAC ってあんの? SxS ってあんの?

# re: Address Space Load Randomization 2007/04/24 8:24 渋木宏明(ひどり)

あるみたいですよ>GAC

# 2k7-09-16 - ASLR with PE 2007/09/16 15:41 barlog

★ JkDefrag GUI 0.93 ( gpl en,ja )   よろしくどうぞ。 ◇ Process Explorer 11.02 JP R-01 ( ...

# re: Address Space Load Randomization 2008/09/23 14:04 yosque

はじめまして。
yosque と申します。

Address Space Load Randomization についてまとめてみました。
よかったらご覧ください。

Windows Vista の DLL Injection 対策
http://sites.google.com/site/sysfest/Home/ntkernel/dllinjection1

タイトル  
名前  
Url
コメント