ROMイメージの構造

気が付いたら10月。4日も日記をサボってしまった。仕事が忙しいとどうしても疲れて日記を書く間もなく寝てしまう。


ネタがないときは仕事ネタで。
一般にWindows MobilePocketPCを触ったことがある人なら知っているかもしれないが、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から取り出すことができている)