2026-04-19 — Initial Release v1.0.0.1
UEFIExtract is a Windows x64 utility for parsing and extracting UEFI firmware images. It builds a full tree of Firmware Volumes, FFS files, and sections — with transparent decompression of Tiano and LZMA-compressed sections. Supports IFR/HII package extraction, BIOS setting offset search (
biosfind), Intel FIT parsing, and live BIOS flash read via FPTW64 (readbios). Runs in both GUI and CLI mode from the same binary.

UEFIExtract parses UEFI firmware images into a structured tree of nodes and provides multiple extraction and analysis operations on that tree.
| Capability | Description |
|---|---|
| Firmware tree parsing | Full Volume → File → Section hierarchy from raw .rom, .bin, or vendor update packages |
| Transparent decompression | EFI Standard (Tiano) and LZMA sections decoded automatically during parsing |
| IFR / HII extraction | Detects EFI and UEFI IFR protocol variants; dumps human-readable form text |
| BIOS setting finder | Text-query search over decoded IFR output to locate setup_var variable offsets |
| Intel FIT parsing | Reads microcode revisions, Startup ACM, TPM policy, and BootGuard KM/BP entries |
| Live flash read | readbios: detects Intel PCH via SetupAPI, extracts matching FPTW64 from bundled archive, dumps BIOS region. Parsing of .rom files works on any UEFI FFS image regardless of CPU vendor. |
| Targeted GUID extraction | Extract a specific FFS file by GUID, with optional section type filter and dump mode selection |
| Surgical patching | Replace a node's body in-place; recomputes FFS integrity checksum when FFS_ATTRIB_CHECKSUM is set |
| GUI + CLI | Single binary: no arguments → GUI (Win32, DWM/Mica); any other argument → CLI |
PatchNode() replaces body bytes in-place at original size; compressing and rebuilding a section is not supportedreadbios requires Intel PCH + MEI; parsing a .rom file from any platform (Intel, AMD, ARM) works normally via FfsParserbiosfind only locates offsets; writing is left to external tools (e.g. setup_var, UnderVolter)The binary uses WinMain as its entry point. When launched with arguments it calls AttachConsole(ATTACH_PARENT_PROCESS) or AllocConsole() as needed, then routes through RunCli(). Version string is 2.0.0.
UEFIExtract {-h|--help|-v|--version}
UEFIExtract <image>
UEFIExtract <image> all
UEFIExtract <image> dump
UEFIExtract <image> report
UEFIExtract <image> guids
UEFIExtract <image> ifrscan [-o <dir>]
UEFIExtract <image> biosfind <query> [-o <txt>]
UEFIExtract <image> <GUID> [-o <outfile>] [-m <mode>] [-t <type>]
UEFIExtract readbios [-o <output.rom>]
| Command | Output |
|---|---|
<image> |
Report (.report.txt) + GUID CSV (.guids.csv) + leaf dump (.dump\) |
<image> all |
Report + GUID CSV + full dump with subdirectories |
<image> dump |
Extraction only — no report, no GUID CSV |
<image> report |
Text report only |
<image> guids |
GUID CSV only |
<image> ifrscan [-o <dir>] |
Scans all tree nodes for IFR; prints matches; optionally dumps .ifr.txt files to <dir> |
<image> biosfind <query> |
Finds BIOS setup variable candidates from IFR; see BIOS Setting Finder |
<image> <GUID> ... |
Targeted extraction — accepts multiple GUIDs, each with its own -o, -m, -t |
readbios |
Detect PCH, run FPTW64, dump BIOS region, then parse and report |
| Flag | Values | Description |
|---|---|---|
-o <path> |
file or directory path | Output path for this GUID target |
-m <mode> |
all body header unc_data info file |
Data to extract; see Dump Modes |
-t <type> |
hex byte, e.g. 0x10 |
Filter by EFI section type; 0xFF = no filter (default) |
Multiple GUIDs can be listed on one command line; each reads its own -o/-m/-t after it.
The binary is compiled as a GUI subsystem application (WinMain). When invoked from a shell with arguments, it calls AttachConsole(ATTACH_PARENT_PROCESS). If that fails (e.g. an elevated process that lost its parent), it falls back to AllocConsole(). Stdout, stderr, and stdin are reopened to CONOUT$ / CONIN$ accordingly.
After CLI work completes, if the console was attached (not allocated), the function InjectEnterToConsole() writes a synthetic VK_RETURN key-down + key-up pair into the console input buffer via WriteConsoleInputW. This causes the parent shell (CMD, PowerShell) to redraw its prompt — without it, the cursor blinks indefinitely because the shell already printed the prompt before the GUI-subsystem process returned. If the console was allocated (new window), FreeConsole() is called instead so the window closes cleanly.
0 on success. Non-zero ErrorCode value on failure (see Error Codes).
Launched when no arguments are passed (or with --gui / -g). Built on ModernWindow — a Win32 window class with DWM Mica styling. Defaults to dark mode; toggleable at runtime via Dark Mode button.
| Control | Description |
|---|---|
| Open | File open dialog (BrowseForFile) — loads a firmware image |
| Dump | Dumps the currently selected node using the Current dump mode |
| Report | Generates text report for the loaded image |
| Read BIOS | Runs the readbios pipeline; requires the data archive next to the EXE |
| Dark Mode | Toggles SetDarkMode(bool) — updates DWM attributes and repaints all controls |
| Search box + Search | Runs SearchEngine::SearchAll() over the tree; results are highlighted and cycled |
| Tree | Hierarchical view of all parsed nodes (Volume / File / Section / FreeSpace) |
| Details pane | Shows node type, subtype, offset, size, GUID, name, info strings, and IFR text if applicable |
| Hex pane | Raw hex dump of the selected node's data |
| Progress bar | Used during readbios FPTW64 execution; updated via WM_APP+1 message |
| Status bar | Running status messages |
| Action | Description |
|---|---|
| Extract IFR | Calls ExtractIFR() on the node's best available data view; shows result in details pane |
| Dump Node | Dumps the selected node to disk using a folder browser |
| Replace Body | Opens a file dialog, loads the file as new body data, calls FirmwareImage::PatchNode() |
Nodes that contain detectable IFR packages are indicated in the tree using a lazy-evaluated cache (m_ifrCache). Detection uses IsIfrCandidate() which scans the first 2 MB of a node's data for EFI/UEFI IFR protocol markers. The cache is keyed by TreeNode* and is cleared on each image reload in PopulateTree().
A separate m_ifrTextCache stores the full ExtractIFR() text output per node. On the first access (e.g. via Extract IFR or a biosfind search), the text is parsed once and stored. All subsequent accesses for the same node return the cached string immediately — avoiding repeated IFR decode passes during interactive search.
Two draggable splitters: vertical (m_splitX, default 300 px) separating the tree from the right panes; horizontal (m_splitY, default 220 px) separating details from hex. Minimum pane width/height: 80 px / 40 px.
FirmwareImage::FromFile() reads the entire file into a ByteBuffer, runs vendor detection, and strips the wrapper if found (see Vendor Wrapper Detection). The buffer is then handed to FfsParser::Parse(). Decompressed section data is stored in m_ownedBuffers; TreeNode objects hold non-owning ByteView spans into these buffers.
Scans the image for Firmware Volume headers (_FVH signature 0x4856465F). For each valid volume, enumerates FFS files and recurses into sections. Decompression is triggered inline when a Compression or GUID-Defined section is encountered.
Each node carries:
| Field | Type | Description |
|---|---|---|
type() |
NodeType |
Root, Volume, File, Section, FreeSpace — free space between FFS files within a volume is represented as a distinct node type, not silently discarded |
subtype() |
uint8_t |
Cast to VolumeSubtype, FileSubtype, or SectionSubtype |
offset() |
uint64_t |
Byte offset within the firmware image |
size() |
uint64_t |
Total node size in bytes (includes header) |
guid() |
Guid |
EFI GUID (16 bytes, little-endian layout); valid if hasGuid() is true |
name() |
std::wstring |
GUID string or human-readable name |
text() |
std::wstring |
User Interface section string (module name) |
info() |
std::wstring |
Supplemental info (version string, dependency expression, etc.) |
header() |
ByteView |
Non-owning view of the raw header bytes |
body() |
ByteView |
Non-owning view of the payload bytes |
tail() |
ByteView |
Non-owning view of any trailing bytes |
uncompressedData() |
ByteView |
Non-owning view of decompressed data (empty if section is not compressed) |
| Subtype | String |
|---|---|
Ffs1 |
FFSv1 |
Ffs2 |
FFSv2 |
Ffs3 |
FFSv3 |
| Subtype | Notes |
|---|---|
| Raw | |
| FreeForm | |
| SecurityCore | SEC phase |
| PEICore | Pre-EFI Init core |
| DXECore | Driver Execution Environment core |
| PEIM | PEI module |
| Driver | DXE driver |
| Combined PEIM/Driver | |
| Application | UEFI application |
| SMM | System Management Mode driver |
| VolumeImage | Embedded FV |
| Combined SMM | |
| MM Core | |
| MM Standalone | |
| MM Combined | |
| Pad | Padding file |
| Subtype | Notes |
|---|---|
| Compression | Contains Tiano or LZMA compressed payload |
| GUID Defined | GUID-tagged section; triggers decompression if LZMA GUID matches |
| Disposable | |
| PE32 | x64 PE image |
| PIC | Position-independent code |
| TE | Truncated PE (terse executable) |
| DXE Dependency | Dependency expression for DXE phase |
| Version | Version string (read into node.info()) |
| User Interface | Module name string (read into node.text()) |
| Firmware Volume Image | Nested FV |
| Freeform GUID | |
| Raw | |
| PEI Dependency | |
| SMM Dependency | |
| MM Dependency |
| Algorithm | Trigger |
|---|---|
| EFI Standard (Tiano) | Compression section with EFI standard compression type |
| LZMA | GuidDefined section whose GUID matches the known LZMA GUID; uses LZMA SDK (7-Zip) v24.x |
Both decompressors are called from FfsParser and the result is stored as an owned ByteBuffer in FirmwareImage::m_ownedBuffers. The node's uncompressedData() view points into that buffer.
The LZMA implementation bundles the LZMA SDK C files (LzmaDec.c, Bra.h, 7zTypes.h) directly in the source tree under src/Compression/SDK/C/.
VendorLoader.hpp detects known firmware packaging formats before the FFS parser runs:
| Wrapper | Detection Criterion | Unwrap Strategy |
|---|---|---|
| Dell/HP/Lenovo EXE | First two bytes are MZ |
Scan 512-byte-aligned offsets for Intel FD magic (5A A5 F0 0F at offset+16) or _FVH signature |
| UEFI Capsule | First 16 bytes match GUID {3B6686BD-0D76-4030-B70E-B5519E2FC5A0} |
Skip capsule header (HeaderLength at offset 20) |
| HP HPQOEM | First 6 bytes are ASCII HPQOEM |
Same scan as EXE wrapper |
If unwrapping succeeds, only the inner payload is parsed; FirmwareImage::wrapperInfo() holds the wrapper name string.
Internal Forms Representation (IFR) is the binary encoding of UEFI HII setup forms stored inside firmware.
IFRBridge::DetectProtocol() distinguishes two variants:
| Protocol | Identifier |
|---|---|
EFI |
Legacy EFI IFR encoding |
UEFI |
PI/UEFI IFR encoding (UEFI 2.1+) |
IsIfrCandidate() limits scanning to the first 2 MB of any node's data as a fast pre-filter before committing to full extraction.
ifrscan Output Format[N] IFR <Protocol> <NodeType> / <SectionSubtype> @ 0x<offset> size=0x<size> data=<body|uncompressed> <displayName>
With -o <dir>, each match is saved as <displayName>.ifr.txt. A ifrscan_summary.txt index is always written to the output directory.
PeAnalyzer runs automatically in the GUI details pane (UpdateDetailsPane) whenever a PE32 or TE section node is selected. It parses the image header and displays:
| Field | PE32 | TE |
|---|---|---|
| Image type | Image: PE32 (x86) or PE32+ (x64) |
Image: TE (x64) etc. |
| Entry RVA | Entry RVA: 0x<addr> from AddressOfEntryPoint |
Entry RVA: 0x<addr> adjusted for TE stripped header offset |
TE (Terse Executable) is a stripped PE format used by PEI and some DXE modules to minimise image size. The analyzer handles both formats via separate AnalyzePe() and AnalyzeTe() functions. This is independent of IFR detection — it activates on section type alone.
biosfind automates the lookup of BIOS setup variable offsets from IFR text. This is the equivalent of manually grepping IFR dumps for CFG Lock, overclocking settings, or any other NVRAM variable.
The query string is split on ,, ;, \n, and \r. Each phrase is independently normalized (lowercased, non-alphanumeric replaced with spaces) and tokenized. Generic tokens (lock, setting, option, feature, mode, state, enable, disable, support, control) carry a scoring penalty.
| Match Type | Base Score |
|---|---|
| Exact normalized match | 1400 |
| Prefix match | 1200 |
| Substring match | 1050 |
| All query tokens matched | base + 420 |
| Per matched token | +110 |
| Per word-boundary (prefix) token | +35 |
| Per generic token matched | −90 |
Minimum score threshold for a candidate to be included: 260.
Candidates are extracted from IFR text using two regular expressions:
(Setting|Checkbox|Numeric|Password):\s+(.+?),\s+Variable:\s+0x([0-9A-Fa-f]+)
Numeric:\s+(.+?)\s+\([^)]*\),\s+Variable:\s+0x([0-9A-Fa-f]+)
Variable: 0x0 entries are always discarded. Deduplication key: kind:offset:name.
#Rank Score setup_var_3 0x<offset> 0x00 <matchedPhrase> <name> [<nodeName> | <protocol>]
Up to 24 candidates are printed; additional results are indicated by a count message. The command format shown (setup_var_3) is a heuristic for AMI/Dell-style BIOSes.
SearchEngine supports four pattern kinds, all auto-detected from the query string:
| Kind | Detection | Matching |
|---|---|---|
| GUID | String length ≥ 36, dashes at positions 8/13/18/23 | 16-byte EFI little-endian layout (Data1 LE, Data2 LE, Data3 LE, Data4 BE) |
| Hex | All space-separated tokens are exactly 2 hex digits or ?? |
Exact bytes with optional ?? wildcard positions |
| ASCII | Fallback for non-GUID, non-hex input | Case-insensitive byte scan |
| Unicode | Paired with ASCII for plain-text queries | Case-insensitive UTF-16LE scan |
Plain text queries (AutoDetectAll) generate both an ASCII and a Unicode pattern and search with both simultaneously.
std::boyer_moore_horspool_searcher for fast bulk scan.??) — linear scan with per-byte mask check.std::tolower per byte against lowercased pattern bytes.std::towlower.Each node is searched across three data views:
body() — raw payloadheader() — only when searchHeaders = trueuncompressedData() — if non-empty (decompressed content)Node metadata (name(), text()) is also checked for text and Unicode patterns; metadata matches report matchOffset = 0.
FitParser.hpp locates and decodes the Intel Firmware Interface Table present in SPI flash images.
The FIT pointer is a 64-bit physical address stored at image_base + image_size - 0x40. The image is assumed to map to the physical range [0x100000000 - image_size, 0x100000000).
| Type Code | Name | Notes |
|---|---|---|
0x00 |
Header | Entry count in Size[23:0] |
0x01 |
Microcode | Reads CPUID (offset +12), revision (offset +4), date (offset +8). Date is BCD-encoded: bits [31:24] = month, [23:16] = day, [15:0] = year — displayed as Date=MM/DD/YYYY |
0x02 |
Startup ACM | Size in 64-byte granules from Size[23:0] |
0x07 / 0x08 |
BIOS Startup Module | Physical address only |
0x0C |
TPM Policy | Presence flag |
0x10 |
BootGuard KM | Key Manifest physical address |
0x11 |
BootGuard BP | Boot Policy physical address |
| Condition | Output |
|---|---|
| Both KM and BP entries present | BootGuard: ENABLED (KM + BP present) |
| Only one of KM / BP | BootGuard: PARTIAL |
| Neither present | BootGuard: not detected |
FIT output is appended to the GUI details pane when an image is loaded.
readbios reads the BIOS SPI flash region from a running Intel platform using Intel's Flash Programming Tool (FPTW64).
| Requirement | Details |
|---|---|
| Administrator rights | Required for Intel MEI driver access via SetupAPI |
| Intel platform | PCH detection queries PCI devices via SetupAPI |
data archive |
Must be present next to UEFIExtract.exe; download from https://kvc.pl/data |
DetectPch() — scans PCI devices, returns PchInfo with fptwName (e.g. FPTW64_CSME_v12r38.exe) and meVersion string.RunFptw() — extracts the matching FPTW64 executable from the bundled in-memory 7z archive, runs it, monitors stdout for percentage lines (progress callback 0–100).bios_dump.rom next to the EXE, or -o <path>).FfsParser and a report + dump are generated automatically.The prefix Reading BIOS: is printed once. A 7-character dynamic suffix (NNN% <spinner>) is updated at 100 ms intervals by backspacing over the previous value. The spinner characters are -\|/.
FirmwareDumper supports six extraction modes controlled by DumpOptions::mode:
| Mode | Enum | Files Written |
|---|---|---|
Current |
Default (no second arg) | Header + body for leaf nodes; .info.txt for all |
All |
all |
Header + body + uncompressed + .info.txt; creates subdirectories per node |
Header |
header |
Raw header bytes only |
Body |
body |
Raw body bytes only |
Uncompressed |
unc_data |
Decompressed data (falls back to body if not compressed) |
Info |
info |
.info.txt text summary only |
File |
file |
Complete FFS file (header + body + tail) |
FileNamingStrategy generates names from the node's text, name, or GUID string. Illegal filesystem characters are stripped. Collisions are resolved by appending a counter suffix. Extended names are enabled by default.
DumpOptions::guidFilter — if non-empty, only nodes whose GUID string matches are dumped.
DumpOptions::sectionTypeFilter — if not 0xFF, only sections whose raw type byte matches are dumped.
ReportGenerator produces two output formats from the parsed tree:
| Output | File | Format |
|---|---|---|
| Text report | <image>.report.txt |
Indented tree with node type, subtype, offset, size, GUID, name, text, info; UTF-8 |
| GUID CSV | <image>.guids.csv |
One row per node that has a GUID: GUID, NodeType, Name; UTF-8 |
Both are generated by the default <image> command and by <image> all. Each can be requested independently with the report or guids sub-commands.
FirmwareImage::PatchNode() replaces a node's body bytes in the original buffer.
newBody.size() must be ≤ node.body().size(). Expansion is not supported.newBody.size() to node.body().size() are filled with 0xFF (erased flash state).When the FFS file header has FFS_ATTRIB_CHECKSUM (bit 0x40) set in the Attributes byte (offset 19 of the 24-byte FFS header), the IntegrityCheck.File byte (offset 17) is recomputed:
IC1 = (uint8_t)(0 - sum_of_all_body_bytes)
This maintains the invariant sum(body) + IC1 = 0 mod 256. The IntegrityCheck.Header byte (offset 16) is computed over the header with IC1 = 0 and is therefore unaffected by body changes.
The GUI exposes this via the Replace Body context menu item.
| Property | Value |
|---|---|
| Project file | UEFIExtract.vcxproj |
| Toolset | MSVC v145 (Visual Studio 2026) |
| Standard | C++23 (std::expected, std::format, std::span) |
| Platform | x64 |
| Configuration | Release |
| Output | bin\x64\Release\UEFIExtract.exe |
| Subsystem | Windows GUI (WinMain) — CLI attaches/allocates console at runtime |
| Build script | build.ps1 (PowerShell) — locates Visual Studio via vswhere.exe, calls MSBuild with /t:Rebuild /m /v:minimal. The /t:Rebuild target always performs a clean build (delete + compile), never an incremental build. Cleans obj\ on success. |
.\build.ps1
Requires Visual Studio 2026 with the C++ Desktop workload and vswhere.exe present in %ProgramFiles(x86)%\Microsoft Visual Studio\Installer\.
All dependencies are bundled in the source tree; no package manager or external download is required at build time.
| Dependency | Location | Purpose |
|---|---|---|
| LZMA SDK (7-Zip) | src/Compression/SDK/C/ |
LZMA decompression |
| EFI Tiano decompress | src/Compression/EfiTianoDecompress.c |
Tiano/EFI standard decompression |
| Win32 / DWM | System | Window management, console, PCH detection |
src/
├── main.cpp Entry point: mode dispatch, console attach/inject-Enter
├── CliRunner.cpp / .hpp CLI command parsing and dispatch
├── Analysis/
│ ├── BiosSettingFinder.hpp biosfind: query parser, scorer, candidate extractor
│ ├── FitParser.hpp Intel FIT parser (header-only)
│ ├── PeAnalyzer.cpp / .hpp PE/TE image analysis helpers
│ └── SearchEngine.hpp Multi-pattern search engine (header-only)
├── Common/
│ ├── ErrorHandling.hpp ErrorCode enum, Result<T> = std::expected<T, ErrorCode>
│ ├── GuidUtils.hpp GUID ↔ string conversion
│ ├── StringUtils.cpp / .hpp UTF-8 / wide string conversion
│ ├── Types.hpp ByteBuffer, ByteView, Guid, String type aliases
│ └── WinApiUtils.cpp / .hpp File I/O, directory creation, full path resolution
├── Compression/
│ ├── EfiTianoDecompress.c / .h EFI standard (Tiano) decompressor
│ ├── LzmaDecompress.c / .h LZMA wrapper
│ ├── UefiDecompressor.cpp / .hpp High-level decompress API
│ └── SDK/C/ LZMA SDK (7-Zip) C sources
├── Dumper/
│ ├── FileNamingStrategy.cpp / .hpp Node → filename generation with collision avoidance
│ └── FirmwareDumper.cpp / .hpp Tree walk → file extraction
├── Firmware/
│ ├── FfsParser.cpp / .hpp FV + FFS + Section recursive parser
│ ├── FirmwareImage.cpp / .hpp Image load, buffer ownership, PatchNode()
│ ├── NodeType.cpp / .hpp NodeType / VolumeSubtype / FileSubtype / SectionSubtype enums
│ ├── TreeNode.hpp Node data model (type, GUID, views, children)
│ └── VendorLoader.hpp Vendor wrapper detection and stripping (header-only)
├── IFR/
│ ├── EFI.cpp / .h EFI IFR protocol decoder
│ ├── IFRBridge.cpp / .hpp Protocol detection, ExtractIFR() entry point
│ ├── UEFI.cpp / .h UEFI IFR protocol decoder
│ └── util.h IFR utility types
├── Report/
│ └── ReportGenerator.cpp / .hpp Text report and GUID CSV generation
├── UI/
│ ├── MainWindow.cpp / .hpp Application main window: controls, tree, hex, search, IFR
│ └── ModernWindow.cpp / .hpp Win32 base window with DWM/Mica styling
└── Utils/
├── FptwRunner.cpp / .hpp FPTW64 extraction from 7z archive + execution + progress
└── PchDetect.cpp / .hpp Intel PCH detection via SetupAPI
RunCli() and most internal operations return or propagate these codes as process exit values:
| Code | Numeric | Meaning |
|---|---|---|
Success |
0 | Operation completed successfully |
FileNotFound |
1 | Input file does not exist |
FileOpenFailed |
2 | File could not be opened |
FileReadFailed |
3 | Read error during file load |
FileWriteFailed |
4 | Could not write output file |
DirCreateFailed |
5 | Output directory creation failed |
InvalidParameter |
8 | Null pointer or out-of-bounds argument |
ItemNotFound |
9 | GUID target not found in tree |
ParseError |
10 | No FFS volumes found, or tree root unavailable |
UnsupportedFormat |
11 | Unrecognised firmware format |
BufferTooSmall |
12 | PatchNode: new body larger than original |
Symptom: CLI prints the error and exits with ParseError.
Solutions:
.exe or .cab extension._FVH or Intel FD magic. A non-standard update format may not be detected — in that case extract the raw ROM manually with 7-Zip or binwalk.Symptom: ifrscan reports No IFR matches found.
Solutions:
Compression or GUID Defined sections — these are decompressed automatically and should contain IFR.biosfind Returns No CandidatesSymptom: Command exits with No BIOS setting candidates found.
Solutions:
ifrscan first to confirm IFR is present at all.lock, enable, mode).UEFIExtract image.rom biosfind "CFG Lock, overclocking lock".readbios Fails: PCH Not DetectedSymptom: Error: Intel PCH not detected via SetupAPI.
Solutions:
readbios Fails: FPTW64 ErrorSymptom: Error: FPTW64 failed to dump BIOS.
Solutions:
UEFIExtract.exe as Administrator. FPTW64 requires direct hardware access.data archive is present next to the EXE. If missing, download from https://kvc.pl/data.Symptom: [+] Target {GUID} dumped 0 items to: ...
Solutions:
XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX. Curly braces are accepted but not required.guids sub-command first to obtain the exact GUID strings present in the image: UEFIExtract image.rom guids.-t <type> filter — if set, only matching section types within the file are extracted. Omit -t to extract everything.Symptom: After Replace Body, the firmware does not boot.
Considerations:
IntegrityCheck.File field are updated. Secure Boot signatures and other integrity measurements (BootGuard BP hash) are not recomputed — a modified image will fail measured boot on BootGuard-protected platforms.Apache License 2.0
Full text available in project repository (LICENSE file).
WARNING: This tool accesses raw firmware data and can interact with system hardware (FPTW64 flash read). It is provided for research, analysis, and educational purposes. Incorrect use — especially with
readbioson locked or production systems — may result in system instability. Use at your own risk.
All trademarks, logos, and brand names are the property of their respective owners. Intel, Management Engine, and related marks are trademarks of Intel Corporation.
Last updated: 2026-04-19