気が付いたら10月。4日も日記をサボってしまった。仕事が忙しいとどうしても疲れて日記を書く間もなく寝てしまう。
ネタがないときは仕事ネタで。
一般にWindows MobileやPocketPCを触ったことがある人なら知っているかもしれないが、Windows CEマシン上では基本的にROMに入っている実行ファイルを外部ストレージなどに取り出すことができない。
これはセキュリティの意味があるのかどうかは知らないが、Windows CEのROMイメージファイルの構造に由来する仕様だ。
Windows CEのROMイメージは、ROM容量を小さくするために、実行ファイル(DLL,EXE)はそのままの形ではROM化されない。
DLL,EXEのPEフォーマットはバラバラにされて、必要最小限の部分のみがROMイメージに組み込まれる。
- COFFヘッダは必要最小限のフィールドのみが抽出され、ROM内の独立した位置に格納される。
- 各セクション(テーブル)は、必要なもののみ(エクスポート、インポート、例外テーブル等)ROM内の独立した位置に格納され、他のセクションは捨てられる。
- コード部において、再配置可能なアドレス情報はすべてROM内の絶対アドレスに置換される。そのため再配置テーブルは意味を持たず、カーネルはROM内の実行ファイルに対してはロード時の再配置を行わない。
- リソースなどのデータセクションは圧縮される(これは一般のPEフォーマットにないWindowsCE独自のもの)。このとき、セクションヘッダのフラグフィールドに通常のPEフォーマットでは使用されないビットがセットされる(圧縮ビット)
ファイルの内容がバラバラに、しかも非可逆な方法(一部の情報の破棄)でイメージ化が行われるために、ROM上にある実行ファイルは元のファイル形式に戻すことができない。
ただし、これはセキュリティを目的としたものではないので、どうにかすれば元のファイルと『同等な』ファイルは復元することができる。
ROM内から上記のバラバラにされた情報をかき集め、再度通常のPEフォーマットファイルに再構築することは不可能ではない。ネックになるのは
- 再配置テーブルの復元(ROM内絶対アドレスから再配置可能アドレスへの変換、テーブル構築)
- 圧縮セクションの解凍(圧縮アルゴリズムは公開されていないが、makeimg.exeが呼び出す圧縮/解凍DLLを呼び出すことで解凍可能)
あたりだが、ここさえ乗り切ってしまえば復元は可能だ。
(実際にカシオのPDAから取り出すことができている)