Windows CE (.NET) とか IoTとか

組込みWindows と IoTの話を扱います

AMD64のNo Execute機能

さて、AMD Athlon64を導入すると困ることがひとつあります。それはWindows XP SP2でNo Execute機能がOnにされた時に発生します。

No Execute機能とは簡単に言うと、これまで区別されていなかった、データページと実行可能ページをl区別することにより、データページやスタックページに格納されているx86のバイナリ実行コードを実行できなくしてしまうという機能です。これでバッファーオーバーフロー攻撃によりスタック上に作成されたx86コードが実行されなくなります。

この機能はほかにもデータ実行防止 (DEP)」機能とか「拡張ウィルス防止(EVP)機能」など、いろいろな呼び方をされています。

MS TechNet Windows XP SP2の情報

http://www.microsoft.com/japan/technet/prodtechnol/winxppro/maintain/sp2mempr.mspx

Windows XP SP2で採用されたDEPの仕組み

http://www.atmarkit.co.jp/fsys/kaisetsu/045dep/dep.html

拡張ウィルス防止機能(Enhanced Virus Protection)

http://www.amd.com/jp-ja/Weblets/0,,7832_11104_11105,00.html

エグゼキュート・ディスエーブル・ビット機能

http://www.intel.com/jp/business/bss/infrastructure/security/xdbit.htm

ただ、ご想像のとおり、この機能は"普通のデータセグメント上でx86コードを実行していると思われる"エミュレータや、Just In Time Compileを行っているJava VM.NET Frameworkなどに影響を与えるものと思います。

そして、eMbedded Visual C++ 4.0やPlatform Builder 4.xでは、CE.NETのエミュレータが実行できなくなってしまうのです。

NoExecute1

エミュレータドライバ vpcappsv.sys が動かないときの通知

さて、この通知をクリックすると以下のページに誘導されます。

Windows CE 4.x Emulator does not work correctly if you have PAE mode enabled

http://support.microsoft.com/default.aspx?scid=kb;en-us;883989

実際には/PAEスイッチではなく/NOEXECUTEスイッチなのですが、いずれにしてもエミュレータは動かなくなります。

さて、その回避方法ですが、以下の

Windows XP SP2 のデータ実行防止機能の詳細

http://support.microsoft.com/default.aspx?scid=kb;ja;875352

に書いてあるように、Windows XPの起動オプションに/EXECUTEフラグを付けると、(No Execute機能は無効になりますが)CE.NETエミュレータは実行できるようになります。フラグをつけないと中間モードともいえる、"次のプログラムを除くすべてのプログラムでハードウェアおよびソフトウェアによる DEP を有効にする"モードになるのですが、問題なのが.SYSドライバであるからか、このモードでエミュレータを動かすことはできませんでした。

一方、プログラム的に問題ないようにする方法ももちろん紹介されていて、簡単に言えばVirtualAllocやVirtualProtectで新設されたフラグPAGE_EXECUTE、PAGE_EXECUTE_READ、PAGE_EXECUTE_READWRITE、または PAGE_EXECUTE_WRITECOPYを使用するという話です。

ちなみに、Windows CE 5.0のエミュレータ(マイクロソフト製とクレジットされている)はちゃんと対策されているようで、/EXECUTEなどのOS起動オプションをつけなくても問題なく使用できました。

EMULATOR

Windows CE 5.0のエミュレータ