ThinkPadのBIOS書き換え

ThinkPadBIOSで内蔵無線LANカードのベンダチェック(特定のカードのホワイトリストを持っていてそれ以外を拒否する)をしていて、純正品でないと1802というPOSTエラーが発生して起動しないようになっている。
ある世代(X31とか)はno-1802.comというプログラムでBIOSCMOSデータを書き換えることでこのエラーを回避できるのだが、そのあとの世代(T60とか)ではプログラムを書き換えれば可能という感じ。で、解析してる人とかツールを開発している人がいたので試してみた。

手順としては

  1. Phoenixのサイトからデモ版のPhoenix BIOS Editorをダウンロードしてインストールする(上記サイトにリンクあり)。
  2. Cygwinを入れる。
  3. 上のサイトからphcompなどのツールをダウンロードする。
  4. phcomp /D $01A3000.FL1 で圧縮を解除する。$01A3000.FLH ができる。
  5. phnxdeco $01A3000.FLH でモジュールに分解する。いっぱいファイルができる。
  6. 書き換えたい部分のファイルを見つける(T60の場合、phoenix_.B5)。
  7. Phoenix BIOS Editorを起動したままにして、プログラムフォルダにあるPREPARE.EXEを適当なフォルダにコピーする。
  8. テキストファイルROM.SCRを以下の内容で作成する。
    COMPRESS LZINT
    BIOSCODE phoenix_.B5
  9. PREPARE ROM.SCR で圧縮する。できたPHOENIX_.MODをold.MODとかにリネームする。
  10. phoenix_.B5を書き換える。
  11. PREPARE ROM.SCR で圧縮する。(念のため、どこを書き換えたのか元のファイルとdiffを取って確認すべき)
  12. 書き換え前とファイルサイズが違ったら書き換えに戻る(PhnxPatchを適用した場合ホワイトリストは使用しないので、そこを適当なデータで埋めて調整する)。
  13. phnxmod $01A3000.FLH old.MOD PHOENIX_.MOD でモジュールを差し替える(ファイルサイズが違うと失敗する)。
  14. phnxcksm $01A3000.FLH でチェックサムを再計算して埋め込む(重要)。
  15. phcomp $01A3000.FLH で再圧縮する。
  16. $01A3000.FL2 とかいうのができるので、元のFL1と差し替える。元のファイルとだいたい同じサイズなのを確認しておく。
  17. IBM/LenovoBIOS Updateユーティリティーで書き換える(同じバージョンだと書き換えられないので、いったん古いのにしてから更新する)。
  18. 運が良いと起動ロゴが出る。

久々に16bitのアセンブラ見てにやにやした(なんかeaxとか使ってて邪道だけど)。書き換え間違うと二度と起動しないので多少のスリリング感がある。ThinkPadには復旧手段はないので注意。