UEFI BIOS改造の予備知識

最終更新日

2020/04/08
第1章に追記。
2020/07/05
第9章を修正(リストから「moduleサイズの変更」を削除)。第12章を追加。
2020/12/30
第6章を修正 (GbE regionの所から、PDR regionに関する記述を削除)
2022/08/21
BIOS chipの容量の間違いを訂正しました。
Intel CPU対応マザーボード + UEFI BIOS 向けの記事です。

BIOS改造の危険性について

BIOS更新に失敗したり、使ったBIOSファイルに誤りがあると、BIOSが正常に動作しません。

PCの電源を入れた時、最初に実行されるプログラムがBIOSです。BIOSが動作しなければ、PCが使えなくなります。

↓ 以前、UEFI BIOSを壊したときの話。
BIOS飛んだ。ブートブロックまで飛んだ。

結局、SPI Programmerを使って復旧させました。

メーカー以外の第三者によって修正・変更されたBIOSは、改造BIOS(Modified BIOS, Mod BIOS)と呼ばれます。メーカーの動作保証はありません。動作確認をするのは自分です。

PC環境が違う人のBIOS改造方法を、そのまま真似しないでください。自分のPC環境に合わせる必要があります。(マザーボードの型番・BIOSバージョン・CPUが同じ場合は、ほぼ同条件と考えていいでしょう)

2020/04/08 追記
Boot Guard・BIOS Guard、その他のBIOS保護機能が有効な機種では、BIOSを改造すると起動しなくなる恐れがあります。
[UEFITool Alpha版] 黄・赤・シアン部分は変更すると危険!

BIOS改造の目的

  • 制限の解除
  • BIOS初期設定の変更
  • BIOS設定画面の項目の表示/非表示を変更
  • Microcodeのupdate・追加
  • BIOS内蔵ドライバ・各種機能の変更
  • PC起動時のロゴの変更
  • マシン固有のデータの変更
    (BIOS・OS・特定のソフトウェアの動作に影響がある場合)

どうやってBIOSを改造するのか。

BIOSファイルを部分的に変更。 → そのファイルでBIOS update (BIOS Chipの内容を書き換え)

ごく一部のデータについては、直接BIOS Chip内の該当箇所だけを書き換えることもできます。それには、専用のBIOSツールを使う必要があります。(例: AMI DMI Editor … AMI BIOS用)

ただし、BIOS保護機能があるため、書き換えを拒否されることがあります。

BIOSが書き込まれている場所

BIOSのコードは、マザーボード上のBIOS Chipにflash(write)されています。BIOS Chipは不揮発性です。(通電を切っても記憶が消えません) マザーボード上に1コか2コ搭載されています。ベンダーのスペック表にはだいたい「BIOS ROM」と書かれています。

BIOS Chipとして使われるMemoryの種類・形状はいろいろ。現在多く使われている種類は、Serial Flash Memory。デスクトップ用マザーボードでよく見る形状は、SOIC8とDIP8です。(8は足の数)

  • SOIC8

    マザーボードに直にハンダ付け。

  • DIP8

    マザーボード上のソケットに差し込まれている。取り外し可能。

実は、BIOS updateでは、いったんBIOS chip全体または部分的にerase(消去)してからflashされます。これはSerial Flash Memory等の性質上、上書きできないからです。

BIOSのユーザー設定データ

内蔵時計の時刻(RTC = Real Time Clock)とともに、別の場所に保存されています。保存場所はチップセットの世代によって異なります。

揮発性(通電が切れると記憶が消えます)ですが、PCの電源を落としてもバックアップバッテリー(ボタン電池)があるため、データは消えません。

このデータを消す(=BIOS設定をデフォルトに戻すこと)には、バックアップバッテリーも含め、マザーボードへの通電を完全に絶ちます。(CMOSクリア)

BIOSの構成・内容・サイズに影響する条件

  • メーカー製PC / マザーボード単体購入・BTO
  • PCの機種 (メーカー製PCの場合)
    • Desktop / Laptop
  • マザーボードの型番・Revision

    • マザーボードベンダー (ASUS / ASRock / GYGABYTE / MSI / Intel / EVGA 等)
    • 対応CPUのメーカー (Intel / AMD 等)
    • チップセットの世代・種類
    • BIOS Chipのタイプ・容量
    • BIOSベンダー (AMI / AWARD / Phoenix / Insyde / Intel 等)
    • UEFI BIOS / Legacy BIOS
  • BIOSバージョン

BIOS Chipの最大容量とBIOSファイル sizeの例

2018年発売 ASUS ROG STRIX Z390-F GAMING (UEFI BIOS)
2015年発売 ASUS Z170 PRO GAMING (UEFI BIOS)
BIOS Chip: 128MB 128Mbit = 16MB
BIOSファイル: 16MB
2007年発売 ASUS P5B-Plus (legacy BIOS)
BIOS Chip: 8MB 8Mbit = 1MB
BIOSファイル: 1MB

BIOS Chipの内容

Intel Skylake CPU対応チップセット搭載マザーボードの場合は、次のように複数のregion(領域)に分けられています。

  • Descriptor (DSC)
  • Intel ME
  • GbE (Intel integrated LAN)
  • BIOS
  • PDR (Platform Descriptor Region)
Descriptor region
各regionのスペースの割り当て、読み書きの許可、ベンダー固有のデータ等の情報
このregionは必ず先頭に配置される。
Intel ME region
Intel MEアプリケーションのコードと設定データ (Intel ME Firmware)
GbE region
Intel integrated LANのコードと設定データ
BIOS region
コンピュータ全体にかかわるコードと設定データ
PDR region
製造元によるカスタム機能の説明
(PDR regionが無い場合もある)

参照: System Tools for SkyLake - Intel(R) Management Engine Firmware 11.0 User Guid

※ ハードウェアベンダー(製造元)によって、製品(型番)固有のデータが組み込まれることがあります。

BIOS updateで更新される領域

PC・マザーボード付属のBIOS update機能の場合
主にBIOS region部分、時にはME region部分も。
Full BIOSファイルを使用する場合も、同上。
他のBIOS Flashing Toolの場合
BIOS Chip全体の更新や、部分的な更新が可能なものがあります。
ただしWrite Protectがかかっているregionは更新できません。
注意

後者のBIOS Flashing Toolを使用する場合は、本当にそのregionやblockを更新する必要があるのかよく考えてください。

マザーボードやメーカー製PCによっては、製品やOEM固有のデータが書き込まれていないとBIOSが動作しないことがあります。(経験上、ASUS製マザーボードのUEFI BIOSは要注意)

改造するBIOSファイルの選定

  • ベンダー(メーカー)が配布しているBIOSファイル

    PCの機種ごとに異なる。他機種のBIOSファイルは使用不可。
  • 自分のマシンからバックアップ(output)したBIOSファイル

バックアップの場合は、正常に動作している時のもの、できれば最近バックアップしたもの。ベリファイをして破損やバックアップのミスがないことを確認してください。

基本的に最新バージョンを使います。ただし、特殊な目的には、古いバージョンを使う必要があるかもしれません。

BIOSファイルとして配布されてるものには次の2種類があります。

  • BIOS Chipの全regionが含まれている。
  • BIOS region(とIntel ME region 等)だけ。

BIOSファイルを扱う際には、「Full BIOS(全region)」のファイルと「BIOS regionのみ」のファイルを区別する必要があります。

自分でPCからバックアップしたBIOSファイルは、工場出荷時のBIOSとは同一ではありません。

UEFI BIOSの場合、PCを使用していくうちに、BIOS Chipの内容が部分的に書き換えられていきます。割と頻繁に。(Intel Skylake cpu + Intel 100-series chipset + AMI UEFI BIOS)

Intel MEの動作も関係しています。
参照: Intel ME・CSMEとは何か?

バックアップBIOSファイルでME regionも更新した場合、BIOS設定画面でIntel (CS)MEのバージョンが0.0.0.0と表示されることがあります。

(バックアップではない、cleanな)Intel ME FWファイルでME regionを更新すれば直ります。→ 参照: Intel (CS)ME Firmware

たとえ改造には使わなくても、BIOSのバックアップは取っておきましょう。

BIOSファイル改造時にやってはいけないこと

  • 他機種のBIOSファイルの使用
  • BIOSファイルサイズの変更
  • Regionサイズの変更 [Intel (CS)ME対応BIOSの場合]

なお、BIOS chip内の各regionの開始位置(offset)は、Descriptor regionに書かれています。[Intel (CS)ME対応BIOS]

Descriptor regionに書かれている各regionのoffset

バイナリエディター画面 BIOS regionの開始位置

改造BIOSファイルでupdateするための手段

  • PC・マザーボード付属のBIOS update機能

    ASUS製マザーボード & UEFI BIOSの場合
    改造BIOSファイルは使用不可。(公式配布のBIOSファイルには署名があるが、改造したBIOSファイルは署名無しとなり、弾かれてしまう)

    ASUS以外のマザーボードの場合
    改造BIOSでも使用可能なことが多い。

  • Intel FPT (Flash Programming Tool)

    ソフトウェア

    Intel ME対応BIOS搭載PCで使用可能。

    参照: Intel FPTによるUEFI BIOS backup / update

    Write Protectがかかっているregionは、flash不可。

    ASUS製マザーボード & AMI UEFI BIOS の場合
    BIOS regionはflash不可 (→ BIOS regionのWrite Protectを解除する方法 SPI Programmerを使わずに、改造BIOSファイルを適用する方法)
  • SPI Programmer

    小型のハードウェア

    これを用いて、BIOS Chipに直接接続し、Erase→Flashする。(ROM焼き)

    Flash作業用に別のマシンが必要。

    容易に外せないタイプのBIOS Chip(例 SOIC8)の場合は、Test ClipのようにBIOS ChipとSPI Programmerをつなげるものが必要。

    (ROM焼き業者に依頼することもできる)

【重要】ASUS製マザーボードのUEFI BIOSについての注意

必ずSystem UUID等の製品固有のデータを保存しておきましょう。そして、標準以外の方法でUEFI BIOSを更新する際は、UUID等を追加したBIOSファイルを使わなければなりません。

System UUID等のデータの保存方法

  1. Full BIOSをバックアップ

  2. FD44Editorを起動
  3. FD44Editorの画面に、1のバックアップBIOSファイルをドラッグアンドドロップ
  4. [OK]
  5. [Copy to clipboard]
  6. テキストエディターに貼り付ける
  7. テキストファイルとして保存

BIOSファイルにSystem UUID等を追加する方法

  1. FD44Editorを起動
  2. FD44Editorの画面に、BIOSファイルをドラッグアンドドロップ
  3. [OK]
  4. Primary card MAC、DTS key、Sysem UUID、Motherboard S/Nを入力
    (DTS keyは、DTSがマザーボードに搭載されていなければ不要)
  5. MAC address storage:
    (Full BIOSファイルの場合) GbE region and system UUID
    (BIOS regionだけのファイルの場合) System UUID only
  6. [Save to BIOS image file...]
  7. 2のBIOSファイルを指定して保存 (上書き)

    注意: FD44Editorは新規ファイルとして保存できないため、既存のファイルに上書きする。
  8. 7で保存したBIOSファイルをFD44Editorで開き、間違いがないことを確認する。
Motherboard S/Nはバックアップのままでokな時もありますが、ダメな時があります。私がASUS Z170 PRO GAMINGを(ROM焼きで)BIOS復旧させた時は、まったく別の英数字を入れました。(参照: Motherboard S/N)

System UUID等をBIOSファイルに追加する理由

BIOS ChipのGbE region、BIOS regionに製品固有のデータ(Primary card MAC、System UUID、Motherboard S/N、DTS key等)が書き込まれています。ASUSが配布されているBIOSファイルには、これらのデータは含まれていません。(マザーポード付属DVDのBIOSファイルも同様)

マザーボード搭載のBIOS update機能
ASUSが配布しているBIOSファイルをそのまま使用できます。
その他のBIOS updateツール、ROM焼き(SPI Programmerを使用)
BIOSファイルにSystem UUID等を追加しておく必要があります。

System UUID等のデータが含まれないBIOSファイル使用した場合

  • ROM焼き(Full BIOS)
    → BIOSが起動しない。
  • Intel FPTでBIOS regionだけ更新
    → BIOSは起動できるが、Primary card MAC以外の製品固有データが消失

    ※ Primary card MAC (= Primary LANカードの物理アドレス)が残ったのは、GbE regionに書き込まれているため)

固有データが消え、バックアップもなくてわからなくなった時
Primary card MAC

UEFI BIOS内の各種アイテムのサイズ変更と移動について

BIOS内の各種アイテムは(region、module、その他)、自身のheader内にサイズが記載されています。また、一部のアイテムは、そのheaderの開始位置が別の場所に書かれています。BIOS起動時、マシンはそれらを参照しながらコードを読み込み、実行していきます。そのため、改造に伴って修正が必要なことがあります。

下記の修正・調整は、BIOS改造時にMMToolUEFI BIOS Update (UBU)UEFIToolのようなBIOS編集ツールを使っていれば、ツールが自動的に行ってくれます。

例外 [Intel CPUとIntel FITに対応するUEFI BIOSのみ]
UBU以外のツールは、Intel FIT tableを自動修正しません。各Intel microcodeのアドレスが変わった場合は、自分で修正する必要があります。

参照:【UEFI BIOS 改造】 Intel Microcodeを変更した時は、FITも確認する。

アイテムのサイズを変更した場合

  • アイテムのheaderの修正
    (Full size・Header checksum・Data checksum部分)
  • アイテムの後ろの余白の調整

アイテムを移動した場合

  • アイテムの後ろの余白の調整
  • アイテムのアドレスの修正 (アドレスがどこかに記載されている場合のみ)

なお、一部のアイテムはalignmentを考慮して配置する必要があります。

修正・調整をしなかったらどうなるのか。

例として、一つのアイテムのサイズが大きくなった場合で説明します。

  • アイテムのサイズの記述を変更していない。
    → 元のサイズの終了位置までしかコードが読み込まれない。
  • 余白調整をしていない。
    → 後ろのアイテムの開始位置がずれる。
    → 後ろの全アイテムのコードの読み込みに失敗する可能性がある。

このようなエラーが発生すれば、BIOSの動作に問題が生じます。重要な箇所であったら、BIOSが起動しません。

BIOSファイルサイズまで変わってしまった時は、BIOS更新に使えないはずです。

UEFI BIOSのalignment

各アイテム(module等)のdata(headerの次)の開始位置(Data address)は、UEFIのalignmentのルールに従って揃えられています。この場合の開始位置は、BIOSの先頭からのoffsetです。(BIOSファイルの先頭からではありません)

各種BIOS編集ツールで編集する場合は、ツールがalignmentを計算してくれるため、alignmentのルールから外れる心配はありません。

そのようなBIOS編集ツールを使わずに、Hex Editorだけで編集する場合はalignmentにも注意を払いましょう。

確認方法
UEFIToolのAlpha版でBIOSファイルを開きます。Parserタブに"unaligned file"が表示された場合は、alignmentからずれているアイテムがあります。

Alignmentの計算方法

詳細
https://uefi.org/specifications
「UEFI Platform Initialization Specification」の所のPDFファイル

Attributesの数値からAlignmentを割り出しますが、FV・FFS・その他で、Attributesの桁数とalignmentの計算方法が異なります。

  • FV(Firmware Volume)
    Attributes 8桁(4 bytes)
  • FFS(Firmware File System)
    Attributes 2桁(1 byte)
FV、FSSについて

UEFI BIOSには複数のFVが入っています。FVの中には1つ以上のFFSがあり、FFSには様々なFirmware Fileが入っています。

Firmware Volume (FV) > Firmware System File (FFS) > Firmware Files (Firmwear File Section、その他いろいろ)

Intel CPU対応のUEFI BIOSはIntel (CS)MEに対応しているため、Firmware Volue(FV)の上層にRegionがあります。

FFSだけ少し説明を書いておきます。(その他はまだよくわかりません)

FFS(Attributesが2桁)の場合の例

  • Attributes 0x00: alignment = 0x1 byteの倍数 *
  • Attributes 0x01: alignment = 0x1 byteの倍数 *
  • Attributes 0x08: alignment = 0x10 bytesの倍数
  • Attributes 0x28: alignment = 0x1000 bytesの倍数

* Alignmentが0x1 byteの倍数のものでも、移動させる時は0x10 bytes単位にしておくのが無難だと思います。実際のところ、Data addressはたいていは0x10(10進数の16)か0x08(10進数の8)の倍数になっています。

https://uefi.org/specifications
『UEFI Platform Initialization Specificaiton Version 1.7 (Errata A)』PDFファイル内の2つの図表、「Figure 3-9:Bit Allocation of FFS Attributes」と「Table 3-7: Supported FFS Alignments」を元に算出します。

  1. UEFITool Alpha版等で、FFSのAttributesの数値を調べておく。
  2. Attributesの数値をHex (2桁) → Binary (8 bits)に変換

    bit [7:0]の内、
    bit [1]がFFS_ATTRIB_DATA_ALIGNMENT2、bit [5:3]がFFS_ATTRIB_DATA_ALIGNMENTとなる。

    Figure 3-9:Bit Allocation of FFS Attributes

    UEFI Platform Initialization Specificaiton Version 1.7 (Errata A)
    Figure 3-9:Bit Allocation of FFS Attributes

    ※ 『UEFI Platform Initialization Specificaiton』の古いバージョンの頃には、FFS_ATTRIB_DATA_ALIGNMENT2が存在しません。

  3. FFS_ATTRIB_DATA_ALIGNMENT2 (範囲: 0~1)

    bit [1] (右端から2つ目)を確認。

  4. FFS_ATTRIB_DATA_ALIGNMENT (範囲: 0~7)

    bit [5:3] (右端から6つ目から4つ目まで)を確認。それをBCD(2進化10進数)に変換する。

  5. 「Table 3-7: Supported FFS Alignments」で当てはまる行を探す。

    Table 3-7: Supported FFS Alignments

    UEFI Platform Initialization Specificaiton Version 1.7 (Errata A)
    Table 3-7: Supported FFS Alignments

  6. Required Alignment (bytes)の数値を調べる。
  7. Required Alignment (bytes)の数値を、Decimal(10進数)からHexadecimal(16進数)に変換する。

    Required Alignment (bytes)
    Decimal
    Required Alignment (bytes)
    Hex
    1 0x1
    16 0x10
    128 0x80
    512 0x200
    1 KiB 0x400
    4 KiB 0x1000
    32 KiB 0x8000
    64 KiB 0x10000
    128 KiB 0x20000
    256 KiB 0x40000
    512 KiB 0x80000
    1 MiB 0x100000
    2 MiB 0x200000
    4 MiB 0x400000
    8 MiB 0x800000
    16 MiB 0x1000000

例 Attributes 0x28

0x28
↓
Binary 0010 1000
↓
bit [1] = 0
bit [5:3] = 101 → BCD 5
↓
FFS_ATTRIB_DATA_ALIGNMENT2 = 0
FFS_ATTRIB_DATA_ALIGNMENT = 5
↓
Refer to "Table 3-7: Supported FFS Alignments"
↓
Required Alignment 4KiB = 4*1024 bytes = 0x1000 bytes
関連記事