Advertisement
Guest User

bfw.pl

a guest
Mar 17th, 2019
56
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Perl 2.86 KB | None | 0 0
  1. #!/usr/bin/perl
  2. use strict;
  3. use Getopt::Std;
  4. use Archive::Zip qw(:ERROR_CODES :CONSTANTS);
  5.  
  6. my $image = 1;
  7. our($opt_x, $opt_i);
  8. getopts('xi');
  9. $#ARGV == 0 || die "Usage $0 [-x] file";
  10. open(F, $ARGV[0]) || die "open $ARGV[0]";
  11. while (256 == (my $nr = sysread(F, my $hdr, 256))) {
  12.     print "\n" if ($image > 1);
  13.     print "Image: $image\n";
  14.     my (
  15.         $tag, $sig1, $sig2, $chipid, $boardid, $bigendian,
  16.         $imagesize, $cfeaddr, $cfesize, $rootaddr, $rootsize, $kerneladdr, $kernelsize,
  17.         $dual, $inactive, $info1, $info2, $u1, $u2,
  18.         $totcrc, $rootcrc, $kerncrc, $z1, $z2, $hdrcrc,
  19.         ) = unpack("a4a20a14a6a16a2a10a12a10a12a10a12a10a2a2a20a28a8a18NNNNNN", $hdr);
  20.     if ($tag < 5 || $tag > 8) {
  21.         printf "unknown tag %x\n", $tag;
  22.         exit;
  23.     }
  24.     printf "tag: %x\nsig1: $sig1\nsig2: $sig2\nchipid: $chipid\nboardid: $boardid\n", $tag;
  25.     printf "bigendian: $bigendian\nimage size: %d\ncfe addr: %d %x\ncfe size: %d next: %x\nroot addr: %d %x\nroot size: %d next: %x\nkernel addr: %d %x\nkernel size: %d next: %x\n",
  26.         $imagesize, $cfeaddr, $cfeaddr, $cfesize, $cfeaddr+$cfesize,
  27.         $rootaddr, $rootaddr, $rootsize, $rootaddr+$rootsize,
  28.         $kerneladdr, $kerneladdr, $kernelsize, $kerneladdr+$kernelsize;
  29.     printf "dual $dual inactive %x info1 $info1 info2 $info2 u1 $u1 u2 $u2\n", $inactive;
  30.     printf "total crc: %x\nroot crc: %x\nkernel crc: %x\nheader crc: %x\n", $totcrc, $rootcrc, $kerncrc, $hdrcrc;
  31.     if ($opt_x) {
  32.         open(OF, ">header$image") || die "header"; syswrite(OF, $hdr); close(OF);
  33.     }
  34.     my $sub = substr($hdr, 0, 236);
  35.     my $crc = Archive::Zip::computeCRC32($sub);
  36.     $crc = ~$crc & 0xffffffff;
  37.     print "BAD " if ($crc != $hdrcrc);
  38.     printf "calculated header crc: %x\n", $crc;
  39.     my $total = "";
  40.  
  41.     if ($cfesize > 0) {
  42.         sysread(F, my $cfe, $cfesize) || die "read cfe";
  43.         $total .= $cfe;
  44.         my $crc = Archive::Zip::computeCRC32($cfe);
  45.         $crc = ~$crc & 0xffffffff;
  46.         printf "calculated cfe crc: %x\n", $crc;
  47.         if ($opt_x) {
  48.             open(OF, ">cfe$image") || die "cfe";
  49.             syswrite(OF, $cfe, $cfesize);
  50.             close(OF);
  51.         }
  52.     }
  53.  
  54.     if ($rootsize > 0) {
  55.         sysread(F, my $root, $rootsize) || die "read rootfs";
  56.         $total .= $root;
  57.         my $crc = Archive::Zip::computeCRC32($root);
  58.         $crc = ~$crc & 0xffffffff;
  59.         print "BAD " if ($crc != $rootcrc);
  60.         printf "calculated rootfs crc: %x\n", $crc;
  61.         if ($opt_x) {
  62.             open(OF, ">rootfs$image") || die "rootfs";
  63.             syswrite(OF, $root, $rootsize);
  64.             close(OF);
  65.         }
  66.     }
  67.     if ($kernelsize > 0) {
  68.         sysread(F, my $kernel, $kernelsize) || die "read kernel";
  69.         $total .= $kernel;
  70.         my $crc = Archive::Zip::computeCRC32($kernel);
  71.         $crc = ~$crc & 0xffffffff;
  72.         print "BAD " if ($crc != $kerncrc);
  73.         printf "calculated kernel crc: %x\n", $crc;
  74.         if ($opt_x) {
  75.             open(OF, ">kernel$image") || die "kernel";
  76.             syswrite(OF, $kernel, $kernelsize);
  77.             close(OF);
  78.         }
  79.     }
  80.     my $crc = Archive::Zip::computeCRC32($total);
  81.     $crc = ~$crc & 0xffffffff;
  82.     print "BAD " if ($crc != $totcrc);
  83.     printf "calculated total crc: %x\n", $crc;
  84.     $image++;
  85. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement