WiFiホワイトリスト解析

Lenovo G580のWiFiモジュールはBIOSのホワイトリストにある製品以外は下記メッセージが表示され、起動が止まってしまう。

104-Unsupported wireless network device detected.
System Halted. Remove device and restart.

この処理についてBIOS解析した。

解析対象

BIOSのバージョンによりホワイトリストの記載箇所が異なる。
ここでは下記2つのバージョンを対象に解析している。

  • 62CN34WW
    工場出荷時(購入時)のバージョン
  • 62CN97WW_64
    最新(2020年10月現在)のWindows8(64bit)向けバージョン

解析モジュール

下記はUEFITool にて確認した内容。
UEFI/BIOSのBIOSリージョン(1)の圧縮領域内(2)の DxeOemDriver.efi ファイル(3)がホワイトリストを判定しているモジュールとなっている。
このモジュールの PE2 image (4)を取り出し(UEFITool でExtract body)解析した。

[ image - Intel ]
+-[ Region - Descriptor ]
+-[ Region - ME ]
+-[ Region - BIOS ] (1)
   +-[Volume - FFSv2 ]
7A9354D9-0468-444A-81CE-0BF617D890DF +-[ File - Volume image ]
4A538818-5AE0-4EB2-B2EB-488B23657022 +-[ Section - Compressed ] (2) +-[ Section - Volume image ] +-[ Volume - FFSv2 ]
7A9354D9-0468-444A-81CE-0BF617D890DF +-[ File - DXE Driver ] DxeOemDriver.efi (3)
608FBD1D-15E1-40C4-9443-662ECC0C07AA +-[ Section - GUID defined ] +-[ Section - DXE dependency ] +-[ Section - PE2 image ] (4) +-[ Section - User interface ]

ホワイトリスト

下記がホワイトリスト。
No.6~8  は 62CN97WW_64 のみ。

No. PCI ID 名前 サブシステム名
1

14e4:4727
14e4:051b

BCM4313 802.11bgn Wireless Network Adapter Broadcom Inc. and subsidiaries / 802.11n Network Adapter
2 14e4:4727
14e4:0587
BCM4313 802.11bgn Wireless Network Adapter Broadcom Limited / 802.11n Network Adapter
3 168c:002b
17aa:30a1
AR9285 Wireless Network Adapter (PCI-Express) Lenovo RTL8192DE Wireless LAN 802.11N PCIe NIC MAC0
4 168c:002b
17aa:31a1
AR9285 Wireless Network Adapter (PCI-Express) Lenovo
5 8086:0886
8086:1315
Centrino Wireless-N + WiMAX 6150 Intel / Centrino Wireless-N + WiMAX 6150 BGN
6 168c:0032
17aa:3118
AR9485 Wireless Network Adapter Lenovo
7 14e4:4365
17aa:3218
CM43142 802.11b/g/n Lenovo
8 168c:0032
17aa:3218
AR9485 Wireless Network Adapter Lenovo AR9485WB-EG Wireless Network Adapter

実際のホワイトリストのダンプ
(下記は 62CN97WW_64 の場合、62CN34WW はアドレス 0003E0 から)

000400: E4 14 27 47 E4 14 1B 05 FF FF FF FF -> BCM4313
00040C: E4 14 27 47 E4 14 87 05 FF FF FF FF -> BCM4313
000418: 8C 16 2B 00 AA 17 A1 30 FF FF FF FF -> AR9285
000424: 8C 16 2B 00 AA 17 A1 31 FF FF FF FF -> AR9285 (Lenovo)
000430: 86 80 86 08 86 80 15 13 FF FF FF FF -> Wireless-N + WiMAX 6150
00043C: 8C 16 32 00 AA 17 18 31 FF FF FF FF -> AR9485 (Lenovo)
000448: E4 14 65 43 AA 17 11 06 5B 10 65 E0 -> CM43142
000454: 8C 16 32 00 AA 17 18 32 F3 0C 04 30 -> AR9485 (AR9485WB-EG)
000460: FF FF FF FF FF FF FF FF FF FF FF FF -> (データ終端)

ホワイトリストチェック処理

ホワイトリストのチェックは下記処理となっている。
[ ] は[]内のアドレスから1ワード取得。

  1. WiFiカードのPCI IDの4ワード(8バイト)をP1,P2,P3,P4に格納
  2. adr = ホワイトリストの先頭アドレス
  3. L1 = [ adr + 0 ]
  4. L2 = [ adr + 2 ]
  5. L3 = [ adr + 4 ]
  6. L4 = [ adr + 6 ]
  7. もし、L1~L4 が P1~P4 に一致したら処理終了
    (ホワイトリストと一致として終了)
  8. adr = adr + 12
    (次のデータに進める)
  9. L1  = [ adr + 0 ]
  10. もし、L1 が 0xffff の場合、エラーメッセージを表示して無限ループ
    (ホワイトリストの不一致として無限ループ)
  11. 4へ戻る

実際のマシンコードダンプ

  • 赤の箇所:無限ループのコード
  • 青の箇所:0xffffでない場合にループ先頭に戻るコード
  • 緑の箇所:ホワイトリストに一致した場合のジャンプ先
  • 灰色の箇所:ホワイトリスト不一致の場合のメッセージ出力処理

62CN97WW_64の場合

000EE0: -- -- -- -- -- -- -- -- -- -- -- -- 48 83 EC 28
000EF0: 45 33 C0 85 D2 0F 85 9C 00 00 00 0F B7 05 FE F4
000F00: FF FF 41 BA FF FF 00 00 66 41 3B C2 74 4C 41 8B
000F10: D0 4C 8D 0D E8 F4 FF FF 66 3B 01 75 24 0F B7 41
000F20: 02 66 42 39 44 0A 02 75 18 0F B7 41 04 66 42 39
000F30: 44 0A 04 75 0C 0F B7 41 06 66 42 39 44 0A 06 74
000F40: 44 49 FF C0 4B 8D 04 40 48 8B D0 48 C1 E2 02 42
000F50: 0F B7 04 0A 66 41 3B C2 75 BE 48 8B 05 A7 0D 00
000F60: 00 48 8B 50 40 48 8B CA FF 52 30 4C 8B 1D 96 0D
000F70: 00 00 48 8D 15 67 F8 FF FF 49 8B 43 40 48 8B C8
000F80: FF 50 08 EB FE 48 8B 05 9C 0D 00 00 80 88 40 06
000F90: 00 00 01 33 C0 EB 0A 48 B8 0E 00 00 00 00 00 00
000FA0: 80 48 83 C4 28 C3 -- -- -- -- -- -- -- -- -- --

62CN34WWの場合

000E20: -- -- -- -- 48 83 EC 28 45 33 C0 41 3B D0 0F 85
000E30: 9D 00 00 00 0F B7 05 A5 F5 FF FF 66 41 81 C9 FF
000E40: FF 66 41 3B C1 74 4D 49 8B D0 4C 8D 15 8F F5 FF
000E50: FF 66 3B 01 75 24 0F B7 41 02 66 42 39 44 12 02
000E60: 75 18 0F B7 41 04 66 42 39 44 12 04 75 0C 0F B7
000E70: 41 06 66 42 39 44 12 06 74 45 49 83 C0 01 4B 8D
000E80: 04 40 48 8B D0 48 C1 E2 02 66 42 8B 04 12 66 41
000E90: 3B C1 75 BD 48 8B 05 ED 0D 00 00 48 8B 50 40 48
000EA0: 8B CA FF 52 30 4C 8B 1D DC 0D 00 00 48 8D 15 2D
000EB0: F8 FF FF 49 8B 43 40 48 8B C8 FF 50 08 EB FE 48
000EC0: 8B 05 E2 0D 00 00 80 88 40 06 00 00 01 33 C0 EB
000ED0: 0A 48 B8 0E 00 00 00 00 00 00 80 48 83 C4 28 C3