لینوکس و من

لینوکس و من

لینوکس و من

حاصل تجربیات ما از سر و کله زدن ها با لینوکس

بایگانی
هدف اینه که فایلهای سیستمی یک رام رسمی دانلود شده (در اینجا برای گوشی های هواوی) را از داخل فایل مربوطه استخراج کنیم.
برای اینکار در لینوکس، نیاز به Perl داریم. یک اسکریپت آماده که در ادامه مطلب اون رو کپی کنید و در یک فایل با پسوند pl ذخیره کنید.

اول باید فایل فشرده ای که دانلود کردید استخراج کنید و فایل UPDATE.APP رو از توی اون بیرون میاریم. و بعد با اسکریپت اون فایل رو بدین ترتیب بازش میکنیم.

perl /pat/to/script.pl /path/to/UPDATE.APP
حالا در همون محل اسکریپت یک فولدر ایجاد میشه به نام output که یه سری فایل توی اون ذخیره میشن. اینها همون پارتیشن ها و قسمت های مختلف رام هستن که روی سخت افزار گوشی شما قرار میگیرن و با پسوند img هستند. (شما هر رام از هر گوشی ای داشته باشید و فایلهای img اون رو استخراج کرده باشید میتونید از ادامه ی ماجرا استفاده کنید.

از این تاپیک آخرین نسخه ی برنامه ext4 utils رو دانلود کنید. بعد از اکسترکت کردن فایل دانلود شده فقط در پوشه خودش دستور make رو اجرا کنید. هیچ کار دیگه ای لازم نیست.

حالا با این دستور، فایلهای img رام به فایلهای imgی تبدیل میشن که میتونیم بوسیله mount اونها رو ببینیم.

 ./simg2img factoryfs.img output.img

که البته factoryfs.img مثلا فایل سیستمی ای هست که شما از رام استخراج کردید.

حالا با کمک mount محتویات داخلش رو میتونیم ببینیم
 mount -o loop /path/to/output.img /mnt/img

برای دیدن اسکریپت perl به ادامه مطلب برید

قسمت های نارنجی مسیرهایی است که وجود دارند.
 #!/usr/bin/perl
######################################################################
#
#   File          : split_updata.pl
#   Author(s)     : McSpoon
#   Description   : Unpack a Huawei U8220 'UPDATA.APP' file.
#                   http://pulse.modaco.com
#
#   Last Modified : Thu 24 December 2009
#   By            : McSpoon
#
#   Last Modified : Wed 18 June 2010
#   By            : ZeBadger (z e b a d g e r @ h o t m a i l . c o m)
#   Comment       : Added filename selection
#
#   Last Modified : Wed 19 June 2010
#   By            : ZeBadger (z e b a d g e r @ h o t m a i l . c o m)
#   Comment       : Added CRC checking
#
######################################################################
 
use strict;
use warnings;

my $CRC_CHECK= -e "crc" && -x _;
 
my %fileHash=(    "\x00\x00\x00\x10","appsboot.mbn",
        "\x00\x00\x00\x20","file25.mbn",
        "\x00\x00\x00\x30","boot.img",
        "\x00\x00\x00\x40","system.img",
        "\x00\x00\x00\x50","userdata.img",
        "\x00\x00\x00\x60","recovery.img",
        "\x00\x00\x00\xB0","FactoryImage.img",
        "\x00\x00\x00\xC0","file11.mbn",
        "\x00\x00\x00\xD0","amss.mbn",
        "\x00\x00\x00\xE0","oemsbl.mbn",
        "\x00\x00\x00\xF0","file04.mbn", #oemsblhd.mbn?
        "\x00\x00\x00\xF1","file07.mbn",
        "\x00\x00\x00\xF2","splash.raw565",
        "\x00\x00\x00\xF3","file01.mbn",
        "\x00\x00\x00\xF4","file02.mbn",
        "\x00\x00\x00\xF5","file14.mbn",
        "\x00\x00\x00\xF6","boot_versions.txt",
        "\x00\x00\x00\xF7","upgradable_versions.txt",
        "\x00\x00\x00\xF8","file09.mbn",
        "\x00\x00\x00\xF9","version.txt",
        "\x00\x00\x00\xFA","file20.mbn",
        "\x00\x00\x00\xFB","appsboothd.mbn",
        "\x00\x00\x00\xFC","file23.mbn",
        "\x00\x00\x00\xFD","file16.mbn",
        "\x00\x00\x00\xFE","file18.mbn",
        "\x00\x00\x00\xFF","file21.mbn",
        "\x00\x00\x10\xF6","file22.txt",
    );

my $unknown_count=0;

# Turn on print flushing.
$|++;
 
# Unsigned integers are 4 bytes.
use constant UINT_SIZE => 4;
 
# If a filename wasn't specified on the commmand line then
# assume the file to be unpacked is under current directory.
my $FILENAME = undef;
if (@ARGV) {
    $FILENAME = $ARGV[0];
}
else {
    my @files = `ls`;
    $FILENAME = $ARGV[0];
    foreach (@files){
        if(/updata.app/i){
            $FILENAME=$_;
        }
    }
}
 
open(INFILE, $FILENAME) or die "Cannot open $FILENAME: $!\n";
binmode INFILE;
 
# Skip the first 92 bytes, they're blank.
#seek(INFILE, 92, 0);
 
# We'll dump the files into a folder called "output".
my $fileLoc=0;
my $BASEPATH = "output/";
mkdir $BASEPATH;

while (!eof(INFILE))
{
    $fileLoc=&find_next_file($fileLoc);
    #printf "fileLoc=%x\n",$fileLoc;
    seek(INFILE, $fileLoc, 0);
    $fileLoc=&dump_file();
}

close INFILE;
 

# Find the next file block in the main file
sub find_next_file
{
    my ($_fileLoc) = @_;
    my $_buffer = undef;
    my $_skipped=0;

    read(INFILE, $_buffer, UINT_SIZE);
    while ($_buffer ne "\x55\xAA\x5A\xA5" && !eof(INFILE))
    {
        read(INFILE, $_buffer, UINT_SIZE);
        $_skipped+=UINT_SIZE;
    }

    return($_fileLoc + $_skipped);
}
 
# Unpack a file block and output the payload to a file.
sub dump_file {
    my $buffer = undef;
    my $outfilename = undef;
    my $fileSeq;
    my $calculatedcrc = undef;
    my $sourcecrc = undef;
    my $fileChecksum;
 
    # Verify the identifier matches.
    read(INFILE, $buffer, UINT_SIZE); # Packet Identifier
    unless ($buffer eq "\x55\xAA\x5A\xA5") { die "Unrecognised file format. Wrong identifier.\n"; }
    read(INFILE, $buffer, UINT_SIZE); # Packet Length.
    my ($headerLength) = unpack("V", $buffer);
    read(INFILE, $buffer, 4);         # Always 1
    read(INFILE, $buffer, 8);         # Hardware ID
    read(INFILE, $fileSeq, 4);        # File Sequence
    #my ($temp)=unpack("V",$fileSeq);
    #print "fileSeq=$temp\n";
    if (exists($fileHash{$fileSeq})) {
    $outfilename=$fileHash{$fileSeq};
    } else {
    $outfilename="unknown_file.$unknown_count";
    $unknown_count++;
    }
    
    read(INFILE, $buffer, UINT_SIZE); # Data file length
    my ($dataLength) = unpack("V", $buffer);
    read(INFILE, $buffer, 16);        # File date
    read(INFILE, $buffer, 16);        # File time
    read(INFILE, $buffer, 16);        # The word INPUT ?
    read(INFILE, $buffer, 16);        # Blank
    read(INFILE, $buffer, 2);         # Checksum of the header maybe?
    read(INFILE, $buffer, 2);         # Always 1?
    read(INFILE, $buffer, 2);         # Blank

    # Grab the checksum of the file
    read(INFILE, $fileChecksum, $headerLength-98);
    $sourcecrc=slimhexdump($fileChecksum);
    
    # Dump the payload.
    read(INFILE, $buffer, $dataLength);
    open(OUTFILE, ">$BASEPATH$outfilename") or die "Unable to create $outfilename: $!\n";
    binmode OUTFILE;
    print OUTFILE $buffer;
    close OUTFILE;

    $calculatedcrc=`./crc $BASEPATH$outfilename` if $CRC_CHECK;
    chomp($calculatedcrc) if $CRC_CHECK;

    print STDOUT "Extracted $outfilename";
    print "\n" if !$CRC_CHECK;
    if($CRC_CHECK){
        if ($calculatedcrc eq $sourcecrc)
    {
        print " - CRC Okay\n";
    }
    else
    {
        print " - ERROR: CRC did not match\n";
    }
    }
    
    # Ensure we finish on a 4 byte boundary alignment.
    my $remainder = UINT_SIZE - (tell(INFILE) % UINT_SIZE);
    if ($remainder < UINT_SIZE) {
        # We can ignore the remaining padding.
        read(INFILE, $buffer, $remainder);
    }
    
    return (tell(INFILE));
}

sub hexdump ()
{
        my $num=0;
        my $i;
        my $rhs;
        my $lhs;
        my ($buf) = @_;
        my $ret_str="";

        foreach $i ($buf =~ m/./gs)
        {
                # This loop is to process each character at a time.
                #
                $lhs .= sprintf(" %02X",ord($i));

                if ($i =~ m/[ -~]/)
                {
                        $rhs .= $i;
                }
                else
                {
                        $rhs .= ".";
                }

                $num++;
                if (($num % 16) == 0)
                {
                        $ret_str.=sprintf("%-50s %s\n",$lhs,$rhs);
                        $lhs="";
                        $rhs="";
                }
        }
        if (($num % 16) != 0)
        {
                $ret_str.=sprintf("%-50s %s\n",$lhs,$rhs);
        }

    return ($ret_str);
}
        
sub slimhexdump ()
{
        my $i;
        my ($buf) = @_;
        my $ret_str="";

        foreach $i ($buf =~ m/./gs)
        {
                # This loop is to process each character at a time.
                #
                $ret_str .= sprintf("%02X",ord($i));
        }

    return ($ret_str);
}
دسته:

نرم افزار

کلیدواژه:

Android

Huawei

نظرات  (۵)

درود بر شما

بله درست میگید البته این فایل باید دانلود میشد

http://forum.xda-developers.com/showthread.php?t=1588461

و با ترکیب کد های شما و xda تونستم قشنگ فایل رو انپک و ریپک کنم فقط میشه
کمک کنید و ی اسکریپت بدین

که بشه همینجور که update.app رو انپک کرد مجددا ریپکش کرد

اگه کمک کنید ممنون میشم
پاسخ:
متاسفانه فرصتش رو ندارم. اگه خودت پیدا کردی با ما هم share کن.
ببخشید من هرجایی توی این پوشه هام ترمینال باز کردم و این دستور رو زدم

./simg2img unknown_file.19.img output.img

اما همش این خطا تو عکس میده نگاه کنید

http://s7.picofile.com/file/8259551834/rdsfsd.JPG

شرمنده شما تلگرام دارید با مکاتبه سریع این مشکل رو حل کنیم بنده کمی عجله دارم

https://telegram.me/nour_bakhsh

ممنون میشم پیام بدین
پاسخ:
خب دوست عزیز شما باید در پوشه ای که فایل simg2img وجود داره این کار رو بکنی. و به پیام های خطا توجه کنی و اونها رو بخونی ببینی چی میگن.
سلام من با این دستور

perl script.pl update.app

بالاخره فایل هارو اکسترکت کرد اما با فرمت ناشناخته

شما روی رام چه مدل گوشی هواوی تست کردید


http://s7.picofile.com/file/8259536726/asqw.JPG
پاسخ:
خب،‌ آفرین. درست اومدی. حالا با simg2img اون فایل سیستمی ای رو که میخوای باید تبدیل کنی. بجای factoryfs.img اون فایل مورد نظر خودت رو بذار. مثلا unknown_file.12.img بعد که استخراج کرد، فایل ایمیج رو میتونی با mount ببینی. اگه اپلیکیشن ها و کلا پارتیشن system رو میخوای، دنبال بزرگترین فایل بگرد. من رام رسمی honor 3c شماره build320 رو باز کردم
سلام. من زیاد با دنیای لینوکس آشنایی ندارم.
این رو میدونم مسیر باید بدم

توی عکس نگاه کنید حالت های مختلف دادم اما باز این خطاهارو میده

حتی عکس رو ببینید ی فایل img هم دارم تو پوشه بعد دستور دوم هم دادم اونم ی خطا داد اگه میشه ی راهنمایی کامل بکنید ممنونت میشم

http://s7.picofile.com/file/8259525684/234f.JPG
پاسخ:
در کامنت بعدی به نتیجه رسیدی... آفرین
با سلام و درود اقا بنده خط اول مشکل دارم

میشه یکم ساده تر بگین اینم خطا

http://s7.picofile.com/file/8259503384/32435435.JPG
پاسخ:
سلام. منظور از /path/to/... آدرس محل اسکریپت است