
UEFI 固件這東西很多人第一次接觸時的感覺就兩個字發(fā)怵。一個動輒幾兆到幾十兆的.bin或.cap文件用十六進制編輯器打開全是密密麻麻的字節(jié)既沒有文件頭提示也沒有目錄結(jié)構(gòu)想找某個模塊、想確認某個 GUID 到底對應什么全靠猜。UEFITool 就是專門解決這個痛點的工具——它能把一坨二進制固件解析成層次分明的樹狀結(jié)構(gòu)讓你像逛文件管理器一樣一層層展開看到 Firmware Volume、FFS File、Section、Freeform GUID 這些原本藏在字節(jié)里的對象。這篇內(nèi)容面向的是剛接觸固件分析的新手也適合已經(jīng)會用但沒系統(tǒng)梳理過流程的同行我會從固件的基本組織方式講起把 UEFITool 的界面邏輯、解析原理、實操步驟、常見坑點全部拆開講一遍目標是你看完之后能獨立完成一次完整的固件解包、模塊定位和內(nèi)容提取。1. 先搞清楚 UEFI 固件到底長什么樣1.1 固件不是一整塊而是層層嵌套的容器很多人拿到固件文件后第一反應是直接搜字符串這招有時候管用但效率極低而且容易漏。要理解 UEFITool 為什么這么設(shè)計界面得先明白 UEFI 固件的組織方式。它本質(zhì)上是一套嵌套容器最外層是固件設(shè)備Firmware Device里面劃分成一個或多個固件卷Firmware Volume簡稱 FV每個 FV 里裝著若干 FFS 文件Firmware File System File每個 FFS 文件內(nèi)部又由若干 Section 組成Section 里可能再嵌套壓縮包、GUID 定義的 Freeform 數(shù)據(jù)甚至再套一層 FV。這個結(jié)構(gòu)和壓縮包很像外層是 zip里面是文件夾文件夾里還有子文件夾和文件。區(qū)別在于固件沒有文件名每個對象靠 GUID 標識而且每個層級都有嚴格的頭部結(jié)構(gòu)頭部里記錄了類型、大小、校驗和等元信息。UEFITool 做的事情就是按照這套規(guī)范逐層解析頭部把二進制流翻譯成樹。你看到的每一個節(jié)點背后都是一段有明確格式定義的數(shù)據(jù)結(jié)構(gòu)。理解這一點非常關(guān)鍵因為它決定了你后續(xù)所有操作的思路想找某個東西先判斷它最可能位于哪一層然后順著樹往下鉆而不是盲目搜索。比如你想找一個 Setup 配置相關(guān)的模塊它通常是一個 FFS 文件位于某個 FV 內(nèi)文件類型可能是EFI_FFS_FILE_TYPE_PEIM或EFI_FFS_FILE_TYPE_DRIVER內(nèi)部包含 PE32 鏡像 Section。有了這個預判定位速度會快一個數(shù)量級。1.2 為什么必須用專用工具而不是十六進制編輯器有人會問既然固件就是二進制我直接用十六進制編輯器看不就行了。理論上可以實際上不可行原因有三個。第一固件的頭部結(jié)構(gòu)不是固定偏移FV 的起始位置需要靠簽名_FVH反推FFS 文件在 FV 內(nèi)的偏移是變長的手工計算極易出錯。第二很多 Section 是壓縮的比如 LZMA、EFI 標準壓縮你看到的字節(jié)是壓縮后的數(shù)據(jù)不解壓根本讀不懂。第三GUID 是 16 字節(jié)的二進制人眼無法直接對應到具體協(xié)議或模塊名必須靠工具內(nèi)置的 GUID 數(shù)據(jù)庫翻譯。UEFITool 把這三件事全包了自動掃描簽名定位 FV、自動解壓嵌套 Section、自動把 GUID 翻譯成可讀名稱。這也是它成為固件分析入門標配工具的原因。我試過用純腳本手工解析一個 8MB 的固件光是把 FV 和 FFS 的邊界算對就花了大半天而 UEFITool 打開只要一秒。工具的價值不在于它做了什么高深的事而在于它把規(guī)范里那些繁瑣的偏移計算和校驗邏輯全部自動化了讓你能把精力放在真正需要判斷的地方。1.3 UEFITool 的幾個版本該選哪個UEFITool 目前主要有三個分支原版 UEFITool、UEFITool A 系列A57 等和 UEFIExtract 命令行工具。新手最容易糾結(jié)的就是選哪個。我的建議很直接日常瀏覽和提取用原版 UEFITool 的圖形界面批量處理和腳本化用 UEFIExtract需要做修改比如替換模塊、調(diào)整卷結(jié)構(gòu)才考慮 A 系列因為 A 系列對寫入操作的支持更完整但也更容易因為操作不當把固件改壞。原版 UEFITool 的界面最樸素但解析邏輯最穩(wěn)搜索和提取功能齊全適合絕大多數(shù)只讀分析場景。UEFIExtract 是命令行版本適合你有一堆固件要批量拆開、或者想把解析結(jié)果喂給其他腳本處理的場景。A 系列在解析基礎(chǔ)上增加了重建能力但重建涉及校驗和重算、卷空間重排風險明顯更高新手不建議一上來就用。選工具的原則是先明確你是只讀還是要寫只讀就用原版寫才考慮 A 系列這個判斷能幫你避開大部分誤操作。2. UEFITool 界面與解析邏輯拆解2.1 樹狀視圖里每個節(jié)點代表什么打開 UEFITool 載入固件后左側(cè)是一棵樹這是整個工具的核心。樹的根節(jié)點是固件文件本身往下第一層通常是Firmware Volume節(jié)點節(jié)點文字里會帶上卷的起始偏移和大小。再往下是FFS File節(jié)點每個文件節(jié)點會顯示文件類型、GUID 和大小。文件節(jié)點展開后是Section節(jié)點Section 類型包括PE32、UI、COMPRESSION、GUID_DEFINED等。壓縮 Section 展開后里面又是新的 FFS 文件形成遞歸。這里有個容易混淆的點GUID_DEFINEDSection 和FFS File都可能帶 GUID但含義不同。FFS 文件的 GUID 標識的是這個文件本身比如某個驅(qū)動模塊的唯一標識而GUID_DEFINEDSection 的 GUID 標識的是這個 Section 的數(shù)據(jù)格式或壓縮算法??礃涞臅r候要養(yǎng)成習慣先看節(jié)點類型再看 GUID最后看大小。類型決定這個節(jié)點能裝什么GUID 決定它具體是什么大小幫你判斷數(shù)據(jù)是否完整。三者結(jié)合基本能對固件結(jié)構(gòu)形成準確判斷。2.2 右側(cè)信息面板的正確讀法選中任意節(jié)點右側(cè)面板會顯示該節(jié)點的詳細信息包括頭部字段、偏移、大小、校驗和狀態(tài)等。新手往往只看樹不看右側(cè)其實右側(cè)信息才是判斷解析是否正常的關(guān)鍵。比如選中一個 FV 節(jié)點右側(cè)會顯示Signature、FileSystemGuid、FvLength、HeaderLength等字段如果FvLength和實際解析出的大小對不上說明這個卷的解析可能有問題后續(xù)提取的內(nèi)容就不可信。再比如選中一個 FFS 文件右側(cè)會顯示FileType、FileAttributes、State、Checksum等。State字段尤其值得關(guān)注它標記這個文件當前是有效、刪除還是標記為無效狀態(tài)。有些固件里存在被標記刪除但數(shù)據(jù)仍在的文件這類文件在樹里可能顯示為灰色或帶特殊標記如果你要找的是歷史遺留模塊這里往往有意外收獲。我個人的習慣是每次載入固件后先隨便點幾個節(jié)點看右側(cè)的校驗和狀態(tài)確認解析器沒有報錯再開始正式分析這個前置檢查能省掉后面很多為什么提取出來是亂碼的困惑。2.3 解析失敗的常見表現(xiàn)與初步判斷不是所有固件都能被完美解析。常見的解析異常有三種表現(xiàn)樹只展開到 FV 層就停了、某個 Section 顯示為Unknown、或者整個文件打開后樹是空的。第一種情況通常是 FV 頭部校驗和不對或者卷被截斷工具出于安全考慮不再往下解析。第二種情況多半是遇到了工具不認識的 Section 類型或壓縮算法數(shù)據(jù)本身可能沒問題只是解析器沒有對應處理邏輯。第三種情況最嚴重可能是文件根本不是 UEFI 固件或者是被加密/混淆過的鏡像。遇到解析異常第一步不是急著換工具而是先確認固件來源和完整性。用文件大小和已知的固件布局做對比看看是否被截斷。如果確認文件完整但解析仍失敗可以嘗試用 UEFIExtract 命令行跑一遍它的報錯信息比圖形界面更詳細能告訴你具體卡在哪一層。我踩過的一個坑是拿了一個帶額外頭部封裝的固件直接丟進 UEFITool結(jié)果樹是空的后來把前面的封裝頭去掉才正常解析。所以載入前先確認文件是不是裸的固件鏡像這一步很關(guān)鍵。3. 完整實操從載入固件到提取目標模塊3.1 準備工作與固件載入實操開始前先把環(huán)境準備好。你需要一份固件鏡像文件常見后綴.bin、.rom、.cap、.fd以及 UEFITool 的可執(zhí)行版本。建議把固件復制一份到工作目錄原始文件保持不動所有操作都在副本上進行這是鐵律。雖然只讀分析理論上不會改動文件但養(yǎng)成副本操作的習慣能避免手滑。載入方式很簡單菜單里選打開文件選中固件即可。載入后先別急著展開看一眼窗口底部的狀態(tài)欄和右側(cè)根節(jié)點信息確認文件大小和解析出的結(jié)構(gòu)規(guī)模是否合理。一個正常的 8MB 固件解析出的 FV 數(shù)量通常在個位數(shù)FFS 文件數(shù)量在幾百到上千不等。如果解析出的節(jié)點數(shù)量明顯偏少比如只有幾個 FV 沒有任何文件那就要懷疑解析是否完整。這一步花不了十秒但能幫你及早發(fā)現(xiàn)文件問題。3.2 定位目標模塊的三種思路定位模塊是固件分析里最耗時的環(huán)節(jié)方法選對了能省大量時間。我總結(jié)下來有三種思路按效率從高到低排列。第一種是按 GUID 定位。如果你已經(jīng)知道目標模塊的 GUID比如從文檔、社區(qū)討論或者相關(guān)配置文件里拿到的直接用搜索功能搜 GUID 字符串工具會跳到對應節(jié)點。這是最快的方式前提是你手里有 GUID。搜索時注意 GUID 的格式工具一般支持帶連字符的標準格式也支持去掉連字符的連續(xù)十六進制兩種都試一下。第二種是按字符串定位。如果你不知道 GUID但知道模塊里包含的某個特征字符串比如某個菜單項文字、某個錯誤提示可以搜字符串。工具會列出所有包含該字符串的節(jié)點你從中篩選出最可能的那個。這種方式的局限是字符串可能被壓縮存儲搜不到或者字符串太常見命中太多。搜的時候盡量用長一點、獨特一點的字符串命中率會高很多。第三種是按結(jié)構(gòu)遍歷。前兩種都行不通時只能順著樹一層層看結(jié)合節(jié)點類型和大小做判斷。比如找 PEI 階段模塊就看 FV 里類型為 PEIM 的文件找 DXE 驅(qū)動就看類型為 DRIVER 的文件。這種方式最慢但也是最可靠的兜底手段而且遍歷過程本身能幫你建立對固件整體布局的直覺做多了之后你對什么東西大概在什么位置會有感覺。3.3 提取模塊內(nèi)容與后續(xù)處理找到目標節(jié)點后右鍵菜單里有提取選項。提取 FFS 文件得到的是完整的文件數(shù)據(jù)含頭部提取 Section 得到的是 Section 數(shù)據(jù)不含 FFS 頭部提取 PE32 Section 得到的是 PE 鏡像可以直接用反匯編工具打開。這里的選擇取決于你后續(xù)要做什么要做靜態(tài)分析看代碼邏輯提取 PE32要看文件整體結(jié)構(gòu)提取 FFS要對比兩個固件里同一模塊的差異提取 FFS 更合適因為頭部信息也參與對比。提取出來的 PE32 鏡像有個細節(jié)要注意它可能是TE格式Terse Executable而不是標準PE格式。TE 格式是 UEFI 里為了節(jié)省空間做的精簡 PE頭部更短用普通 PE 工具打開可能報錯。遇到這種情況可以用工具自帶的轉(zhuǎn)換功能或者專門的 TE 轉(zhuǎn) PE 腳本處理一下。我第一次提取 PEIM 模塊時就遇到過這個問題反匯編器直接拒絕加載折騰了一陣才反應過來是 TE 格式。所以提取后先看一眼文件頭的前兩個字節(jié)MZ是標準 PEVZ是 TE心里有數(shù)再往下走。3.4 一次完整的定位實操記錄拿一個模擬的固件分析場景走一遍完整流程。假設(shè)我要找一個負責啟動菜單顯示的模塊已知它內(nèi)部包含字符串Boot Menu。載入固件后先用字符串搜索Boot Menu結(jié)果命中三個節(jié)點。逐個點開看右側(cè)信息第一個是 UI Section里面是菜單文本資源第二個是 PE32 Section是實際處理邏輯第三個是某個配置文件。我要的是邏輯代碼所以選第二個 PE32 Section。選中后看它所屬的 FFS 文件節(jié)點記下這個文件的 GUID 和類型假設(shè)是 DRIVER。然后右鍵提取這個 PE32 Section保存為.efi文件。用反匯編工具打開確認入口點和字符串引用能對上說明提取正確。整個過程從載入到提取完成大約五分鐘其中搜索和篩選占了大半時間。這個流程的關(guān)鍵在于先用字符串縮小范圍再用節(jié)點類型和右側(cè)信息做二次篩選最后確認提取內(nèi)容的格式。三步走下來基本不會提取錯對象。4. 常見問題排查與避坑經(jīng)驗4.1 解析結(jié)果不完整怎么排查解析不完整是最常見的問題表現(xiàn)是樹展開到某一層后子節(jié)點缺失或者某些 Section 顯示為未知類型。排查順序建議這樣先確認固件文件是否完整對比文件大小和預期大小再確認文件是否帶額外封裝頭有些廠商固件前面會加一段描述信息最后確認工具版本是否支持該固件的壓縮算法。前兩步是文件層面的問題第三步是工具層面的問題。如果是壓縮算法不支持表現(xiàn)通常是某個COMPRESSION或GUID_DEFINEDSection 展開后為空或顯示未知。這時候可以換用更新版本的 UEFITool或者用 UEFIExtract 看看報錯信息里提到的算法名稱。有些廠商會用自定義壓縮這種情況工具確實無能為力只能靠專門的解壓腳本先處理再分析。我遇到過一次 LZMA 壓縮的 Section 在舊版本里解析失敗換新版本后正常所以工具版本別用太老的。4.2 提取出來的文件打不開或內(nèi)容異常提取的文件打不開原因通常有三類格式不對TE 而非 PE、數(shù)據(jù)被截斷、或者提取層級選錯。格式問題前面說過看文件頭前兩字節(jié)就能判斷。數(shù)據(jù)截斷的表現(xiàn)是文件大小和節(jié)點顯示的大小對不上這種情況多半是固件本身有問題或者解析時邊界算錯了。提取層級選錯則是操作問題比如你想提取 PE32 卻提取了包含它的 FFS 文件得到的數(shù)據(jù)前面多了一段頭部反匯編工具自然不認。排查時先看文件大小和樹節(jié)點顯示的大小對比一致說明提取完整。再看文件頭確認格式。最后用十六進制編輯器看前幾十個字節(jié)確認是不是你預期的數(shù)據(jù)結(jié)構(gòu)。這三步能定位絕大多數(shù)提取異常。我個人的經(jīng)驗是提取后永遠先做一次大小核對這個習慣幫我發(fā)現(xiàn)過好幾次因為選錯節(jié)點導致的提取錯誤。4.3 搜索命中太多或搜不到怎么辦搜索命中太多說明關(guān)鍵詞太泛。解決辦法是換更長的字符串或者結(jié)合節(jié)點類型過濾。比如搜Setup可能命中幾十個節(jié)點但如果你知道目標在 PE32 Section 里就可以只看 PE32 類型的命中結(jié)果。搜索搜不到最常見原因是字符串被壓縮存儲工具默認不搜索壓縮數(shù)據(jù)內(nèi)部。這時候可以先把壓縮 Section 提取出來單獨解壓再對解壓后的數(shù)據(jù)搜索。還有一種情況是字符串編碼問題有些固件里的字符串是 UTF-16 編碼搜 ASCII 字符串自然搜不到。工具一般支持切換編碼搜不到時換個編碼試試。另外搜索范圍也要注意有些工具默認只搜當前選中的子樹要確認搜索范圍是全局還是局部。這幾個點看起來瑣碎但實際排查時按順序過一遍大部分搜索問題都能解決。4.4 常見問題速查表問題表現(xiàn)可能原因排查動作樹只展開到 FV 層卷校驗和錯誤或文件截斷核對文件大小確認固件完整性Section 顯示 Unknown壓縮算法不支持或類型未知換新版工具用命令行看報錯提取文件反匯編報錯TE 格式或提取層級錯誤看文件頭前兩字節(jié)核對提取節(jié)點類型搜索無結(jié)果字符串被壓縮或編碼不符先解壓再搜切換 UTF-16 編碼提取文件大小不符解析邊界錯誤或固件損壞對比節(jié)點大小檢查固件來源這張表建議存下來遇到問題時按行對照能快速縮小排查范圍。表格里的每一項都是我在實際分析中反復遇到的尤其是 TE 格式和壓縮字符串這兩個坑新手幾乎必踩。5. 工具選型與效率提升的幾點體會5.1 圖形界面與命令行的分工圖形界面適合探索性分析你一邊看樹一邊判斷交互反饋快。命令行適合確定性任務比如你已經(jīng)知道要提取哪些 GUID 對應的模塊寫個腳本批量跑比手工點幾十次快得多。我的習慣是第一次分析某個固件用圖形界面摸清結(jié)構(gòu)把關(guān)鍵 GUID 和偏移記下來后續(xù)批量處理同類固件時改用命令行把之前記下的 GUID 作為輸入。這樣既有探索的靈活性又有批量的效率。UEFIExtract 的輸出是結(jié)構(gòu)化的目錄樹每個節(jié)點對應一個文件或文件夾文件名里帶 GUID 和類型信息。這個輸出格式對后續(xù)腳本處理很友好你可以直接用文件系統(tǒng)操作去篩選、對比、統(tǒng)計。相比圖形界面里一個個點命令行輸出的可編程性是它最大的優(yōu)勢。如果你經(jīng)常分析同一廠商的固件值得花半小時把命令行流程跑通長期收益很明顯。5.2 建立自己的 GUID 對照筆記GUID 是固件分析里的高頻信息但工具內(nèi)置的數(shù)據(jù)庫不可能覆蓋所有廠商的自定義 GUID。我的做法是維護一份自己的對照筆記每次分析新固件時把遇到的未知 GUID 和它對應的模塊功能記下來積累多了就形成一份私有字典。下次再遇到同一個 GUID直接查筆記就知道是什么不用重新分析。這份筆記不需要多復雜一個表格就夠GUID、所屬固件型號、模塊功能描述、發(fā)現(xiàn)時間。關(guān)鍵是堅持記錄并且記錄時寫清楚判斷依據(jù)比如是通過字符串推斷的還是通過調(diào)用關(guān)系推斷的這樣以后回看時能判斷這條記錄的可靠程度。我積累了一年多現(xiàn)在分析新固件時命中率明顯提高很多模塊看一眼 GUID 就有大致判斷省下的時間相當可觀。5.3 只讀分析與修改操作的邊界最后強調(diào)一個原則UEFITool 原版定位是只讀分析工具所有提取、搜索、查看操作都不會改動固件。如果你需要修改固件替換模塊、調(diào)整配置那是另一個層面的操作涉及校驗和重算、卷空間重排、簽名驗證等一系列問題風險遠高于只讀分析。新手階段建議嚴格停留在只讀分析把固件結(jié)構(gòu)摸透、把模塊定位練熟再考慮是否進入修改領(lǐng)域。只讀分析本身的價值已經(jīng)很大理解固件布局、定位特定功能模塊、對比不同版本差異、學習廠商的模塊組織方式這些都不需要改動任何字節(jié)。而且只讀操作沒有把設(shè)備變磚的風險可以放心大膽地試。我見過不少人一上來就想改固件結(jié)果因為不熟悉結(jié)構(gòu)把鏡像改壞反而連分析都做不下去了。先把樹看明白再談其他這個順序不能顛倒。固件分析這件事工具只是入口真正的功夫在于對固件組織方式的理解和長期積累的模塊直覺。UEFITool 把繁瑣的解析工作自動化了但判斷哪個節(jié)點是目標、提取出來的數(shù)據(jù)是否正常、解析異常的原因是什么這些仍然要靠人。我個人的體會是前幾個固件分析起來會比較慢因為每一步都要查規(guī)范、對結(jié)構(gòu)但分析過五六個之后你對樹的形態(tài)會有直覺看到某個布局就能大致猜出這是什么階段、什么類型的模塊。這種直覺沒有捷徑只能靠一次次實操積累而 UEFITool 恰好是一個門檻足夠低、反饋足夠快的練習工具。