zoukankan      html  css  js  c++  java
  • Perl 对比boot.img并修正

    今天翻了翻115网盘。。发现半年前写的东西居然在那,于是顺便放这里当个存档

    今天看了下,发现有点看不懂了。。毕竟半年没写了。。

    #!/usr/bin/perl
    ######################################################################
    #
    #   文件      : diffboot.pl
    #   作者      : Michellgaby(vincent.18023962826@gmail.com)
    #   说明      : 对比boot.img的参数并进行修正,输出check_boot.blk文件;
    #
    #   致谢      : 感谢&ROMDIYing老师,他对人类的工具化革命付出了伟大的贡献,
    #               鄙人的本工具参考了他的代码,使本工具蓬荜生辉,实在令我感激
    #               不尽,他乃一位功法大成者,对安卓的ROOT历史划上了崭新的一笔,
    #               他所写的【batROMdiy】工具箱造福广大机油,使他们免受定制软件
    #               的煎熬,让我们给&ROMDIYing掌声;(http://weibo.com/romdiying)
    #
    #   创建时间  : 2013年01月16日 -Michellgaby
    #   使用方法  : diffboot.pl [boot.img] [flash.blk]
    #
    ######################################################################
    
    ############################## 定义变量 ##############################
    use strict;
    use warnings;
    my ($boot_file,$flash_file,$buffer,$ramdisk_size,$flash_correct,$count,$YN,$edit) = (undef,undef,undef,undef,undef,undef,undef,0);
    my @boot  = ("boot_kernel_size", "boot_kernel_addr", "boot_ramdisk_addr", "boot_second_size", "boot_second_addr", "boot_tags_addr", "boot_page_size", "boot_unkown", "boot_name", "boot_cmdline");
    my @flash = ("flash_kernel_size", "flash_kernel_addr", "flash_ramdisk_addr", "flash_second_size", "flash_second_addr", "flash_tags_addr", "flash_page_size", "flash_unkown", "flash_name", "flash_cmdline");
    my @about = ("kernel  [size]", "kernel  [addr]", "ramdisk [addr]", "second  [size]", "second  [addr]", "tags    [addr]", "page    [size]","unkown  [addr]", "name    [char]", "cmdline [char]");
    my @check = (1, 0, 0, 0, 0, 0, 0, 0, 0, 0);
    my @unkown= (1, 1, 1, 1, 1, 1, 1, 2, 4, 128);
    ########################### 检查输入的参数 ############################
    if ($#ARGV == -1) { die "usage: diffboot.pl [boot.img] [flash.blk]
    "; }
    if ($#ARGV == 0)  { die "usage: diffboot.pl [boot.img] [flash.blk]
    "; }
    else { $boot_file = $ARGV[0]; $flash_file = $ARGV[1]; }
    
    ############################ boot.img #################################
    #以只读模式打开文件,然后以二进制读取文件
    open(INFILE, $boot_file) or die "Cannot open $boot_file: $!
    ";
    binmode INFILE;
    #检测是否为boot.img文件
    read(INFILE, $buffer, 8);
    unless ($buffer eq "x41x4Ex44x52x4Fx49x44x21") { die "Unrecognised file format. Wrong identifier
    "; }
    #获取boot信息
    for ($count=0; $count < 10; $count++) {
      seek(INFILE, 4, 1) if ($count eq 2);
      read(INFILE, $boot[$count], $unkown[$count] * 4);
    }
    close INFILE;
    
    ############################ flash.blk ################################
    #以只读模式打开文件,然后以二进制读取文件
    open(INFILE, $flash_file) or die "Cannot open $flash_file: $!
    ";
    binmode INFILE;
    #检测是否为boot.img文件
    read(INFILE, $buffer, 8);
    unless ($buffer eq "x41x4Ex44x52x4Fx49x44x21") { die "Unrecognised file format. Wrong identifier
    "; }
    #获取flash信息
    for ($count=0; $count < 10; $count++) {
      read(INFILE, $ramdisk_size, 4) if ($count eq 2);
      read(INFILE, $flash[$count], $unkown[$count] * 4);
    }
    $flash_correct = do { local $/; <INFILE> };
    close INFILE;
    
    ############################## DIFF ###################################
    #输出比较信息
    unless ($boot[0] eq $flash[0]) { die "kernel size not the same
    " }
    for ($count=1; $count < 10; $count++) { if ($boot[$count] eq $flash[$count] ) { $check[$count] = 1; } }
    printf("%s[name]%s[boot]%s[flash]%s[Y/N]
    ","-"x4,"-"x17,"-"x17,"-"x17);
    for ($count=0; $count < 10; $count++) {
      if ($check[$count] eq 1) { $YN = "Yes"; } else { $YN = "No"; $edit = 1;}
      printf("%-15s %s 0x%08x %s 0x%08x %s [%s]
    ",$about[$count]," "x8,unpack("V",$boot[$count])," "x12,unpack("V",$flash[$count])," "x13,$YN);
    }
    printf("%s
    ","-"x79);
    unless ($edit eq 1) { die "Check for the correct done!
    "; }
    
    ############################## EDIT ###################################
    #修改boot参数
    printf("%s and %s diff: press ENTER to continue...",$boot_file,$flash_file  );
    $edit=<STDIN>;
    open(OUTFILE, ">check_flash.blk") or die "Cannot open check_flash.blk: $!
    ";
    binmode OUTFILE;
    printf OUTFILE "x41x4Ex44x52x4Fx49x44x21";
    for ($count=0; $count < 10; $count++) {
      print OUTFILE $ramdisk_size if ($count eq 2);
      print OUTFILE $boot[$count];
    }
    print OUTFILE $flash_correct;
    close OUTFILE;
    printf("%s and %s diff: recreate check_flash.blk done!
    ",$boot_file,$flash_file);
  • 相关阅读:
    python连接mysql数据库(MySQL)
    PHP+Redis 实例【一】点赞 + 热度 上篇
    linux centos7安装phpMyAdmin详解,以及解决各种bug问题
    Linux crontab命令 定时任务 用法详解以及no crontab for root解决办法
    composer安装教程 windows系统 | Linux系统 | mac系统
    CentOS 7.0下使用yum安装MySQL
    Linux PHP多版本切换 超简单办法
    tornado 入门
    Websocket、长连接、循环连接
    阻塞和非阻塞,同步和异步
  • 原文地址:https://www.cnblogs.com/GentlemanMod/p/3272551.html
Copyright © 2011-2022 走看看