#! /usr/bin/perl use strict; use warnings; my $count = 0; my $offset = 0; my ($buf, $blen, $len, $n); while(read (STDIN, $buf, 4) == 4) { if (unpack('N', $buf) == 0x42faedfe) { printf "found an image: %x\n", $offset; if (read (STDIN, $blen, 4) == 4) { $offset += 4; $len = unpack('V', $blen) + 16; printf "length %d\n", $len; { use integer; $len = (($len+3)/4)*4; } printf "length %d\n", $len; open OUT, ">$count.image" or die "$!"; print OUT $buf, $blen; DUMP: while ($len > 0 && ($n = read (STDIN, $buf, ($len > 1024?1024:$len))) > 0) { $len -= $n; $offset += $n; print OUT $buf; } close OUT; if ($len) { die "short image in input: $len"; } } else { die "can't read len from possible image"; } $count++; } elsif (unpack('V', $buf) == 0x73717368) { printf "found an le squashfs: %x\n", $offset; my $dummy; if (read(STDIN, $dummy, 4) == 4 && read(STDIN, $blen, 4) == 4) { $offset += 8; $len = unpack('V', $blen); printf "length %d\n", $len; { use integer; $len = (($len+3)/4)*4; } printf "length %d\n", $len; open OUT, ">$count.image" or die "$!"; print OUT $buf, $dummy, $blen; goto DUMP; } } $offset += 4; }