Asus Zenbook 14 - zapomenuté admin heslo do BIOSu
Kontext
Pokud byste si někdy nastavili heslo do BIOSu a z nějakého důvodu ho zapomněli, nezoufejte. Máte-li nainstalovaný Windows, či případně aspoň vypnutý secureboot a odemklý boot order, mělo by jít heslo získat bez zásahu ze strany servisu (pokud Vás nezajímá omáčka, postup je dole.
Ze začátku své IT kariéry jsem si sice už vytvořil celkem slušné bezpečnostní návyky, ale z hlediska záloh, ukládání hesel do password manageru atd. to byla ještě bída. Takže jsem si zodpovědně (a upřímně na domácí použití spíš zbytečně) zahesloval BIOS na jednom noťasu, který jsem pak schoval do šuplíku a objevil až po delší době. Noťas jsem strčil do nabíječky, zapnul a bum - nedostal jsem se dál, než k loginu do BIOSu. Co teď?
Nejdřív jsem si nebyl jistý, zda je v noťasu vůbec disk, což jsem vzápětí zkontroloval - SSDčko bylo na místě, pohoda. Co už nebyla taková pohoda, byl fakt, že se mi nedařilo bootnout do systému. Matně jsem tušil, že jsem na noťasu zkoušel různé linuxové distribuce, ale nevěděl jsem, jaký je momentální stav. Skrz live distro jsem zjistil, že na noťasu je nejspíš windows, zapojil jsem tedy windows recovery flashku a jal se zjišťovat situaci.
S nepotěšením jsem zjistil, že při instalaci vůbec není detekovaný disk, první jsem tedy musel vyhledat příslušný diskový driver (lze obvykle stáhnout na stránkách výrobce, v mém případě zde - https://www.asus.com/cz/supportonly/ux3402za/helpdesk_download/ - IRST Driver), pak načíst ovladače a disk se objevil. Pokračoval jsem tedy v (re)instalaci (staré soubory skončily ve složce Windows.old) a notebook se bootnul do Windowsu, hurá! Kdyby byl zapnutý secureboot/boot order lock, tak se nikam nedostanu a mohu do servisu.
Hledání řešení
Mimo skutečnost, že shánění driverů na můj ux3402za model je za trest (windows update je všechny nenajde a např. doteď jsem nezprovoznil numpad na touchpadu), tak po zprovoznění zvuku a touchpadu jsem šel na to hlavní - zjistění administrátorského hesla do BIOSu. To se ukázalo jako poměrně oříšek, ale nic neřešitelného.
Naštěstí jsem narazil na řešení od jiných, kteří narazili na podobný problém přede mnou, což bylo dosti nápomocné. Primárně na https://rog-forum.asus.com/t5/tuf-asus-gaming-notebooks/guide-to-decrypt-admin-level-bios-uefi-password-on-newer-model/td-p/994023 a https://www.reddit.com/r/ASUS/comments/1dadfmm/comment/l8gax8q/, na Redditu se komentující vlastně jen odkazuje na Forum ASUSu.
No, ani jedno nepomohlo. :D Ale nasměrovalo mě to správným směrem, primárně šlo o získání backupu BIOSu přímo z Windowsu, k čemuž slouží Aptio V AMI Firmware Update Utility a následné rozšifrování hesla. K tomu mi pomohl ve finále následující návod: https://superuser.com/questions/1907203/how-to-recover-reset-lost-uefi-password-on-asus-computer-w-ami-bios
Postup
Anglicky polopaticky zde: https://superuser.com/questions/1907203/how-to-recover-reset-lost-uefi-password-on-asus-computer-w-ami-bios
Získání nástroje na backup BIOSu - typicky Aptio IV/V, ke stáhnutí např. zde: https://download.openfogos.com/test/BIOS/windows/AfuWin64/
vytvoření backupu: Otevřete AFUWINGUIx64.EXE a uložte BIOS ROM soubor (tlačítko save), viz screen:

dumpněte ROM: mě fungovala právě až utilitka UEFIExtract zde: https://github.com/LongSoft/UEFITool/releases
.\uefiextract afuwin.rom dump # produces afuwin.rom.dump folder
- dekódování hashe hesla z dumpu: pak už stačí použít Python script níže a heslo se uloží do texťáku:
"""Decode AMI ROM dump to recover BIOS UEFI password
Usage: python decode_ami_rom_dump.py afuwin.rom.dump
"""
import itertools as it
import math
import sys
from pathlib import Path
AMI_KEY = 0x5B93B62611BA6C4DC7E022747D07D89A332E8EC1E95444E89F7BFA0E55A2B0350BC9665CC1EF1C83
bytelen = math.ceil(AMI_KEY.bit_length() / 8)
def pw_hashes(body: bytes):
blocks = it.pairwise(range(0, len(body), bytelen))
pw_hashes = (int.from_bytes(body[s:e]) for s, e in blocks)
yield from filter(None, pw_hashes)
def decode(pw_hash: int):
return (pw_hash ^ AMI_KEY).to_bytes(bytelen).decode('utf-16')
rom_dump_dir = Path(sys.argv[1])
bodies = [p / 'body.bin' for p in rom_dump_dir.rglob("*AMITSESetup")]
all_pw_hashes = {h for b in bodies for h in pw_hashes(b.read_bytes())}
for pwh in all_pw_hashes:
print(decode(pwh))
Hotovo
Voilá, heslo máme, stačí restartovat do BIOSu. :-) Při nejistotě doporučuji použít AIčko a doptat se na jednotlivé kroky, případně mi pošlete maila (pokud na to narazí někdo jiný, než snad nedejbože zoufalý já za pár let, jakmile se bude situace opakovat :D).