Chris Collins

Tools · embedded

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

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.

Runs entirely in your browser; nothing you type leaves this page.