UEFI/BIOSの復旧

BIOSを消してしまい、起動しなくなったパソコンの復旧の記録。

復旧したのは Lenovo G580(26897LJ)。

なお、下記手順を踏まず、ネット上に転がっている他人のBIOSに本ページ後半に記載される 00504624-8A59-4EEB-BD0F-6B36E96128E0 の箇所を自分のPCの情報に書き換えればそれでも復旧できる。

UEFI/BIOSの構成

G580 の UEFI/BIOS のサイズは8MBで、下記3つのリージョンで構成されている。

  1. Descriptor region(アドレス 0x000000~0x000fff)
    各リージョンの位置が設定されている。
  2. ME region(アドレス 0x001000~0x03ffff)
    Intel ME ファームウェア
  3. BIOS region(アドレス 0x040000~0x7ffff)
    BIOS

この中でPC固有の情報が格納されているのが BIOS region。
たまたま、OS上からIntel FPTでバックアップしていたため、固有情報が復元できた。

ちなみに、Intel FPTはIntel ME System Toolsに含まれ、下記手順でダウンロード/実行できる。

  1. Intel ME System Toolsダウンロードページを開く
  2. 中腹(といってもかなり下)の C2. Intel (CS)ME System Tools にあるIntel ME System Tools v8 r3 をクリックする。
    (他のバージョンがあるが、チップセットのシリーズに対応しているため利用不可。新しいバージョンというこではない。)
  3. 遷移したダウンロードページの[ダウンロード]ボタンをクリックし、ダウンロードする。
  4. ダウンロードしたファイルを任意の場所解凍(rar形式。7zで解凍できる)する。
  5. 下記ディレクトリの FPT64.exe を コマンドプロンプトから実行する。
    Intel ME System Tools v8 r3\Flash Programming Tool\Windows64
    下記コマンドで各リージョンのバックアップ。
    FPT64.exe -BIOS -D ファイル名
    FPT64.exe -DESC -D ファイル名
    (MEは読み込みが許可されていないため不可)

Descriptor リージョンの復元

OSからIntel FPTで取得したファイルがあれば、そのまま使用する。

が、無い場合、下記内容のファイルを作る。
G580のチップセットはHM76。Intel 7シリーズに当たる。
SPI Programmingに従った設定となっており、G580は下記の設定となっている。全体のサイズは4096バイトで、ここに出てこないアドレスには 0xFF が埋め込まれている。

Descriptor Signature and Map

0010: 5A A5 F0 0F 03 00 04 02 06 02 10 12 20 01 21 00
0020: 25 00 00 00 FF FF FF FF FF FF FF FF FF FF FF FF
0030: 24 00 30 09 00 00 00 00 00 00 00 00 FF FF FF FF
0040: 00 00 00 00 00 04 FF 07 01 00 FF 03 FF 1F 00 00
0050: FF 1F 00 00 FF FF FF FF FF FF FF FF FF FF FF FF
0060: 00 00 0B 0A 00 00 0D 0C 18 01 08 08 FF FF FF FF

Flash Descriptor PCH Soft Strap Section

0110: 82 D6 20 08 0F 01 00 00 00 00 56 00 00 00 00 00
0120: 00 E0 C8 00 00 00 00 00 00 00 00 00 00 00 00 00
0130: 00 00 00 00 80 45 00 30 44 00 41 00 97 00 00 95
0140: 00 00 00 00 00 00 00 00 00 00 00 00 3E 03 00 00
0150: 00 00 00 00 02 00 00 00 FF FF FF FF FF FF FF FF

Flash Processor Strap Base

0200: 00 00 00 00 FF FF FF FF FF FF FF FF FF FF FF FF

Intel® ME Vendor Specific Component Capabilities Table

0DF0: EF 40 17 00 05 20 05 20 C2 20 17 00 05 20 05 20
0E00: 1C 30 17 00 05 20 05 20 20 BA 17 00 05 20 05 20

Descriptor Upper Map Section

0EFC: DF 08 00 00

これをバイナリエディタで作成することで復旧される。

MEリージョン

このリージョンはIntel ME ファームウェアでここからダウンロードしたファイルを元に復旧できる。
ファームウェアバージョンは 8.0.4.1441。

  1. 開いたページの、「B. Intel (Converged Security) Management Engine Firmware Repository」にある、「Intel ME 8 Firmware Repository r20 – (2018-07-07)」をダウンロードする。
  2. ダウンロードした Intel ME 8 Firmware Repository r20.rar ファイルを解凍する。
  3. 「8.0.4.1441_1.5MB_PRD_RGN.bin」をバイナリエディタで開き、全コピーする。
  4. Descriptorリージョンの直後、つまり、0x001000 にバイナリエディタでペーストする。
  5. ペーストした次のアドレスから 0x03ffff まで 0xff を埋める。

BIOSリージョン

このリージョンがBIOSを消してしまった場合に問題となるリージョン。
1台1台異なる情報が入っている。

  1. Lenovo G580(2689) BIOSアップデートサイトから、BIOSアップデートファイル(2020年10月時点 62cn97ww_64.exe)をダウンロードする。
  2. UEFIToolで開き、BIOS部分を取り出す。
    下記のように 6C60EE00-C316-4C95-A684-CDC7E7033311 を右クリックし、”Extract body”を選択する。
  3. この 00504624-8A59-4EEB-BD0F-6B36E96128E0 が1台1台異なる情報が記録されている。
    取り出したBODYは全て FF となっていが、ここに、モデル名、製品名、シリアルナンバー(S/N)、M/O、UUIDを下記のアドレスに値を埋め込む。
    本体裏面の情報から復元できるが、UUIDだけはできない。
    また、各項目の最後の1バイトはチェックサム(下記赤字箇所)で、項目+チェックサムの合計の00となる。下記以外は FF で問題ない。
    02EFB8: 41 21 4B 41 00 00 00 00 00 00 00 00 00 00 00 12 
            → 識別子? "A!KA"
    
    02EFC0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
    
    02EFC9: 00 00 00 00 00 00 00 00 00 00 02 00 00 00 00 FE
            → (不明)
    
    02EFE8: 32 36 38 39 37 4C 4A 00 00 00 00 00 00 00 00 5A
            → モデル名 "26897LJ"
    
    02EFF8: 57 42 30 37 36 35 34 33 32 31 57 42 30 31 32 33
            34 35 36 51 00 00 00 00 00 00 00 00 00 00 00 7C
            → S/N + M/O "WB07654321WB0123456Q"
    
    02F018: 4C 65 6E 6F 76 6F 20 47 35 38 30 00 00 00 00 00
            00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 89
            → 製品名 "Lenovo G580"
    
    02F038: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
    
    02F048: 57 42 30 37 36 35 34 33 32 31 00 00 00 00 00 00
            00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
            00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
            00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 CB
            → S/N "WB07654321"
            
    02F088: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
    
    02F098: 11 22 33 44 55 66 11 E1 88 99 AA BB CC DD EE FF
            → UUID 11223344-5566-11E1-8899AABBCCDDEEFF
    
    02F0A8: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
    
  4. この編集した 00504624-8A59-4EEB-BD0F-6B36E96128E0 を Replace Body で置き換える。

UEFI/BIOS書き込み

SPI Programmerの使用方法を参照し、生成したファイルを書き込む。