ESP firmware image inspector
Open an ESP32-family .bin — app image, bootloader, partition table, NVS partition, or a full-flash dump — and see its header, segments, app description, checksum and SHA-256 verification, partitions, OTA state, and every NVS key and value.
Added
Works with
- ESP flasher IoT and embeddedhands its flash read-backs here
How to use it
How to use it
Open or drop a file. A sample full-flash dump (bootloader, partition table, NVS, otadata, and two copies of a tiny app) is generated on first visit. What it reads:
-
App and bootloader images (
esp_image_header_t): chip, entry point, SPI mode, frequency and flash size, minimum/maximum chip revision, and each segment’s load address, length, file offset, and memory type (IRAM, DRAM, IROM, DROM, RTC, padding) from the chip’s memory map. The checksum (0xEF XOR every segment byte) and the appended SHA-256 are verified, the latter with WebCrypto. A Secure Boot v2 signature block is noted if present. -
esp_app_desc_t (magic 0xABCD5432): project name, version, compile date and time, ESP-IDF version, secure version, and the ELF SHA-256 that a panic prints. esp_bootloader_desc_t gives the bootloader’s IDF version and build time.
-
Partition tables (0xAA50 entries with the 0xEBEB MD5 entry), alone or found at 0x8000 (or any 4 KB boundary) in a dump. Each app partition’s image is parsed; otadata shows which OTA slot boots; core dump, filesystem, and empty partitions are labelled.
-
NVS partitions: page states, sequence numbers, header and entry CRCs, namespaces, and all keys with their u8…i64, string, and blob values (multi-page blobs reassembled). Erased entries — old values not yet garbage-collected — can be shown too.
-
A hex view with jumps to every header, segment, and partition.
Warnings cover bad checksums, hash mismatches, truncated images, segments outside the chip’s memory, images built for a different chip than the one you select, a bootloader at the wrong offset, a partition table with a bad MD5, apps larger than their partition, and an NVS partition with no free page.
To read a whole flash: esptool.py read_flash 0 ALL flash.bin (or a size such as 0x400000).
Formats follow ESP-IDF v5.4 and esptool; the sample matches esptool’s merge_bin,
gen_esp32part.py, and nvs_partition_gen.py byte for byte. Encrypted flash and encrypted
NVS cannot be decoded. Files stay in your browser.
Feedback is a gift. Something to improve, a feature to add, or a bug? Tell me.
Runs entirely in your browser; nothing you type leaves this page.