Firmware uitpakken (bestanden)
Firmware
Firmware is de software dat geïnstalleerd is op een embedded device (bijvoorbeeld router/switch), meestal is dit een “mini” Linux omgeving met beperkte functies, een firmware “image” is een IMG/BIN bestand met dus de software in één bestand geperst, dit samen met de Linux bootloader (en eventuele andere fratsen) en een SquashFS bestandssysteem
Ik pak hier als voorbeeld de firmware van de Plugwise Stretch 2.0, we willen bijvoorbeeld weten hoe de ZigBee stick aangestuurd word (gaan we hier niet behandelen, het is maar om een idee te geven)
Wat heb je nodig?
1) Binwalk
2) DD (voor windows)
3) SquashFS Tools
Aan de slag
1) We plaatsen het bestand “image-1.0.41.bin” op het Linux systeem.
2) We gebruiken Binwalk om te onderzoeken hoe de “firmware image” eruitziet, Binwalk doorzoekt het bestand naar headers en geeft weer welke type data zich waar in het bestand vind.
Het Linux commando is dan als volgt: binwalk image-1.0.41.bin
1 2 3 4 5 |
DECIMAL HEX DESCRIPTION ------------------------------------------------------------------------------------------------------------------- 0 0x0 uImage header, header size: 64 bytes, header CRC: 0xF115E2DE, created: Thu Feb 21 06:22:02 2013, image size: 837456 bytes, Data Address: 0x80000000, Entry Point: 0x80000000, data CRC: 0x45401800, OS: Linux, CPU: MIPS, image type: OS Kernel Image, compression type: lzma, image name: "MIPS OpenWrt Linux-3.3.7" 64 0x40 LZMA compressed data, properties: 0x6D, dictionary size: 8388608 bytes, uncompressed size: 2478256 bytes 1048576 0x100000 Squashfs filesystem, little endian, version 4.0, compression: size: 5315382 bytes, 1703 inodes, blocksize: 262144 bytes, created: Thu Feb 21 06:21:59 2013 |
wat zien we hier?
a) We zien dat in het “image” bestand de SquashFS partitie zich bevind vanaf 1048576 bytes (1e kolom)
b) We zien hoe groot de SquashFS partitie is, namelijk 5315382 bytes
3), DD, gebruik het DD commando om bepaalde gegevens uit een bestand te kopiëren.
Het commando om de SquashFS partitie uit het “image” bestand te halen is dan:
dd if=image-1.0.41.bin bs=1 skip=1048576 count=5315382 of=stretch_1_0_41.squashfs
Wat betekend dit? (je kan alle functies hier zien)
if= IN file (het input bestand)
skip= n bytes (sla deze hoeveelheid bytes over, hiermee zet je het startpunt voor het kopieren)
count= n bytes (kopieer deze hoeveelheid bytes vanaf het startpunt dat we hebben opgegeven)
of= OUT file (de gekopieerde data wordt opgeslagen in dit bestand)
1 2 3 |
5315382+0 records in 5315382+0 records out 5315382 bytes (5.3 MB) copied, 13.8922 s, 383 kB/s |
We hebben nu dus een stretch_1_0_41.squashfs bestand, dat het bestandssysteem is.
4) Gebruik UnsquashFS om het bestand uit te pakken, het commando is vrij eenvoudig: unsquashfs stretch_1_0_41.squashfs
1 2 3 4 5 6 7 8 9 |
Parallel unsquashfs: Using 2 processors 1518 inodes (1532 blocks) to write [====================================================================================================================================/] 1532/1532 100% created 1283 files created 185 directories created 235 symlinks created 0 devices created 0 fifos |
Er is nu een folder aangemaakt, genaamd “squashfs-root” met daarin alle bestanden:
[#/software/firmware_tools” ]