About this tool
The first ten minutes with an unknown image
You have a .bin pulled off a router, a camera or a dev board, and no documentation. The first questions are always the same four: how big is it, which parts of it are compressed, which known formats are embedded in it, and does it say anything about itself in plain text. That is one binwalk run and a couple of strings | grep invocations, and it is what this page does — in a Web Worker, in your own browser, on a file that never moves. What it deliberately does not do is unpack: this tool identifies and slices, so you leave with offsets and lengths rather than a directory of extracted files.
The entropy map, and the one thing it cannot tell you
Entropy is a single number per block: how evenly the 256 possible byte values are spread across it, from 0 for a block that is one repeated byte to 8 for a block where every value appears equally often. Erased flash sits at zero, a bootloader's code and tables land in the middle, and a compressed payload pins the top of the chart and stays there — which is why the boundary between two sections is usually a visible step rather than a number you had to look for. The block size is yours: 4096 bytes shows the shape of the whole image, 256 finds the exact edge once you know roughly where it is. The four bands are padding, structured, mixed and compressed, and the last one is not called “encrypted” on purpose. A byte histogram cannot separate a compressed blob from an encrypted one; a tool that labels it for you is reporting something it does not know.
Signatures, regions, and the gaps between them
The scan walks the image once and reports every offset where a known magic sits: squashfs in four byte orders, JFFS2, CramFS, UBI and UBIFS, uImage, TRX, DfuSe, the DFU trailer, Android boot images, device tree blobs, Netgear CHK, PEM and SSH key markers — plus the whole shared format catalog this site already uses for file-type detection. Overlapping hits are all reported, because a squashfs magic inside a gzip blob is a real fact about the file rather than a mistake to tidy up. Each hit then starts a region that ends at the next hit, or at the length the header itself declared where there was one, which in practice is uImage and TRX and nothing else. When a declared length is shorter than the distance to the next hit, the map is left with a gap — and the gap is drawn, because bytes that no signature claimed are a finding, and stretching a region over them would be a guess wearing a border.
Strings, headers, and a guess that is allowed to say no
Printable runs are extracted in ASCII and UTF-16LE and tagged by shape: url, ip, email, path, version, private-key, ssh-key, certificate, credential, busybox, linux-version, u-boot. A tag is a shape and not a claim — 1.2.3.4 carries both ip and version because it honestly is both, and showing you what a string could be beats picking one for you. Where a header parses you get its fields with the format's own names on them: the uImage load address, entry point and CRCs; the ESP segment table with each segment's load address and length; the TRX offsets; the Android boot page size and kernel command line; the DFU suffix read from the end of the file. And where the architecture follows from one of those, or from a Linux version string that names its target, you get it with the evidence printed beside it. Where it does not follow from anything, you get unknown — never a default, and never the most popular answer.
Nothing is uploaded, which matters more here than on most pages
The files people bring to a firmware inspector are the ones they are least free to send anywhere: an image pulled off a customer's device, a build that has not shipped, a dump from a box that belongs to someone else. This page is a static file with no API behind it. The image is read with the File API, transferred into a Web Worker, analysed there and dropped when the tab closes, and you can confirm it the direct way: leave DevTools open on the Network tab and watch it stay empty while a 64 MB image is analysed.