设为首页 收藏本站
查看: 892|回复: 0

[经验分享] Perl 对比boot.img并修正

[复制链接]

尚未签到

发表于 2015-12-27 10:38:19 | 显示全部楼层 |阅读模式
  今天翻了翻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]\n"; }
if ($#ARGV == 0)  { die "usage: diffboot.pl [boot.img] [flash.blk]\n"; }
else { $boot_file = $ARGV[0]; $flash_file = $ARGV[1]; }
############################ boot.img #################################
#以只读模式打开文件,然后以二进制读取文件
open(INFILE, $boot_file) or die "Cannot open $boot_file: $!\n";
binmode INFILE;
#检测是否为boot.img文件
read(INFILE, $buffer, 8);
unless ($buffer eq "\x41\x4E\x44\x52\x4F\x49\x44\x21") { die "Unrecognised file format. Wrong identifier\n"; }
#获取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: $!\n";
binmode INFILE;
#检测是否为boot.img文件
read(INFILE, $buffer, 8);
unless ($buffer eq "\x41\x4E\x44\x52\x4F\x49\x44\x21") { die "Unrecognised file format. Wrong identifier\n"; }
#获取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\n" }
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]\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]\n",$about[$count]," "x8,unpack("V",$boot[$count])," "x12,unpack("V",$flash[$count])," "x13,$YN);
}
printf("%s\n","-"x79);
unless ($edit eq 1) { die "Check for the correct done!\n"; }
############################## 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: $!\n";
binmode OUTFILE;
printf OUTFILE "\x41\x4E\x44\x52\x4F\x49\x44\x21";
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!\n",$boot_file,$flash_file);
  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-156867-1-1.html 上篇帖子: perl读取excel 下篇帖子: 写个perl程序自动下载《南方周末》(2005年12月最后一期,38版,值得一看)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表