Patch BIOS sur ThinkPad T540p

Pour forcer ses utilisateurs à racheter un PC portable, Lenovo a introduit en 2012 une fonction de whitelist wifi (liste blanche des cartes wifi). Lorsque l’ordinateur démarre, il fait une série de tests, dont celui de vérifier que la carte wifi est présente sur une liste pré-établie. Autrement, le BIOS se bloque sur une erreur :

1802: Unauthorized network card is plugged in – Power off and remove the card

À cause de coupures de wifi lorsqu’utilisé en même temps qu’un casque Bluetooth, j’ai voulu changer la carte réseau de mon ThinkPad T540p pour une Intel AX200NGW. Je me suis basé sur cet article de Wolgang. Comme lui, je n’offre aucune garantie de résultat, suivez ma procédure à vos risques et périls. La machine est un Lenovo ThinkPad T540p avec un BIOS à la version 2.39 (juin 2021).

Préparatifs

Ce qu’il nous faut :

Assembler le programmateur

Il suffit d’alignez le fil rouge de la pince avec le numéro « 1 » de l’adaptateur, lever le levier du programmateur, brancher l’adaptateur et baisser le levier.

Attention : lorsque l’on se sert du programmateur, toujours veiller à brancher la pince avant d’insérer dans le port USB, au risque d’endommager la puce.

Installer les logiciels

Sur le second ordinateur :

Faire un dump du BIOS

C’est la partie la plus casse-burnes longue. Lenovo a innové par rapport au T440 : la puce contenant le BIOS n’est plus aussi aisément accessible. Il faut démonter tout l’ordinateur, en veillant à débrancher la batterie. La puce se trouve en haut à gauche, sur la partie de la carte-mère en contact avec la plaque d’acier (qui se trouve sous le clavier). Elle est à côté du port pour carte SIM. Il y en a deux, notés sur la carte-mère SPI1 et SPI2. Celle qui nous intéresse est la SPI2, sur laquelle est noté : MXIC MX25L3273E.

Il y a une petite fossette ronde dans le coin bas gauche de cette puce. Il faut aligner le fil rouge du programmateur sur cette fossette, et cliper la pince sur la puce. Bien vérifier le positionnement de la pince. Insérer ensuite le programmateur dans un port USB du second ordinateur. Le dump se fait avec cette commande :

sudo flashrom -p ch341a_spi -c "MX25L3273E" -r bios1.img

En faire plusieurs copies (j’en ai fait 3), et les vérifier avec diff : diff bios1.img bios2.img. Si diff ne retourne rien, c’est bon, on peut supprimer les autres copies. Débrancher le programmateur du port USB pour éviter une erreur de manipulation.

Patcher le BIOS

Ici, c’est très simple : on applique tout le fichier xx40_xx50_patches_v7.txt (le T540p repose sur les patchs du W541 et du T440p, donc il nous faut tout).

./UEFIPatch bios1.img xx40_patches_v7.txt -o bios_patched.img

Si on flash le BIOS maintenant, le PC se mettra à biper 10 fois à chaque démarrage. Il faut le signer :

thinkpad-uefi-sign/sign.py bios_patched.img -o bios_signed.img

On vérifie la signature (« Signatures correct ») :

thinkpad-uefi-sign/verify.py bios_signed.img

Flasher le BIOS

Reconnecter le programmateur en USB. Bien vérifier que la pince est toujours en place avant. Il n’y a plus qu’à lancer la commande :

sudo flashrom -p ch341a_spi -c "MX25L3273E" -w bios_signed.img

Attendre que la commande se termine, débrancher le port USB, puis la pince. Remonter le PC, ajouter la nouvelle carte wifi. Et voilà, le ThinkPad est libre !

Le fichier xx40_xx50_patches_v7.txt :

# Patch string format
# FileGuid SectionType PatchType:FindPatternOrOffset:ReplacePattern 
# Please ensure that the latest symbol in patch string is space

# Possible section types:
#  PE32 image                    10
#  Position-independent code     11
#  TE Image                      12
#  DXE Dependency                13
#  Version information           14
#  User interface string         15
#  16-bit code                   16
#  Guided freeform               18
#  Raw data                      19
#  PEI Dependency                1B
#  SMM Dependency                1C
# Please do not try another section types, it can make the resulting image broken

# Possible patch types:
#  P - pattern-based, first parameter is a pattern to find, second - a pattern to replace
#  O - offset-based, first parameter is hexadecimal offset, second - a pattern to replace
# Patterns can have . as "any possible value" symbol


# for xx40 thinkpads. no warranties. do not use if dumb - \x
# paranoidbashthot's LNVBBSEC method might help with the beeps on U processors - 's/\x4C\x4E\x56\x42\x42\x53\x45\x43\xFB\xFF/\x4C\x4E\x56\x42\x42\x53\x45\x43\xFF\xFF/g'

# LenovoWmaPolicyDxe | Whitelist removal | T440p W540 T540
# https://github.com/thrimbor/thinkpad-uefi-patches/
79E0EDD7-9D1D-4F41-AE1A-F896169E5216 10 P:0bc841390b0f8468010000:0bc841390be96901000000      
# bypass the PCI vendor ID check
79E0EDD7-9D1D-4F41-AE1A-F896169E5216 10 P:41390b7517:41390b7500  
# bypass the PCI subsys ID check
79E0EDD7-9D1D-4F41-AE1A-F896169E5216 10 P:41394b04741b:41394b04eb1b  
# bypass the USB vendor ID check
79E0EDD7-9D1D-4F41-AE1A-F896169E5216 10 P:41390B0F8469010000:41390B48E969010000  


# LenovoWmaPolicyDxe | Whitelist removal | W541 | \x
79E0EDD7-9D1D-4F41-AE1A-F896169E5216 10 P:41390B0F8469010000:41390BE96A01000000      
#79E0EDD7-9D1D-4F41-AE1A-F896169E5216 10 P:41390b7517:41390b7500  
#79E0EDD7-9D1D-4F41-AE1A-F896169E5216 10 P:41394b04741b:41394b04eb1b  


# LenovoWmaPolicyDxe | Whitelist removal | L540 1.93 test1 | \x
79E0EDD7-9D1D-4F41-AE1A-F896169E5216 10 P:0BC841390B0F8438010000:0BC841390B90E938010000         
#79E0EDD7-9D1D-4F41-AE1A-F896169E5216 10 P:41390b7517:41390b7500        
79E0EDD7-9D1D-4F41-AE1A-F896169E5216 10 P:41394B04741C:41394B04EB1C          


# LenovoWmaPolicyDxe | Whitelist removal | T440 2.41 test1 | \x
79E0EDD7-9D1D-4F41-AE1A-F896169E5216 10 P:41390C240F8466010000:41390C2490E966010000    
79E0EDD7-9D1D-4F41-AE1A-F896169E5216 10 P:41390C247516:41390C247500    
79E0EDD7-9D1D-4F41-AE1A-F896169E5216 10 P:41394C2404741B:41394C2404EB1B   


# SystemFormBrowserCoreDxe | advanced menu enable | \x
32442D09-1D11-4E27-8AAB-90FE6ACB0489 10 P:04320B483CC2E14ABB16A73FADDA475F:778B1D826D24964E8E103467D56AB1BA      


# enable the bottom patches only for a mem overclocker

#PlatformHiiAdvancedDxe | show XMP and manual memory timings | \x
#CFEF94C4-4167-466A-8893-8779459DFA86 10 P:4084EC00450A0200000000000000:4084EC00450A0100000000000000   
#CFEF94C4-4167-466A-8893-8779459DFA86 10 P:4084EC00450A0300000000000000:4084EC00450A0100000000000000     
#CFEF94C4-4167-466A-8893-8779459DFA86 10 P:450A0300000000000000300240043C27450A0300000000000000:450A0100000000000000300240043C27450A0100000000000000   


#PlatformHiiAdvancedDxe | show XMP and manual memory timings (cleaned up)| \x
#CFEF94C4-4167-466A-8893-8779459DFA86 10 P:4084EC00450A0300000000000000:4084EC00450A0100000000000000     
#CFEF94C4-4167-466A-8893-8779459DFA86 10 P:450A0300000000000000300240043C27450A030000000000000030021502:450A0100000000000000300240043C27450A010000000000000030021602