zoukankan      html  css  js  c++  java
  • 挂载system.img并提取文件

    今天提取线刷包的system.img出来,使用Mount命令挂载

    复制代码
    $ sudo mount -t ext4 -o loop system.img /mnt
    mount: 文件系统类型错误、选项错误、/dev/loop0 上有坏超级块、
           缺少代码页或助手程序,或其他错误
    
           有些情况下在 syslog 中可以找到一些有用信息- 请尝试
           dmesg | tail  这样的命令看看。
    复制代码

    这坑爹死了。。于是想了个办法把ext4转为yaffs2格式,使用simg2img.py,脚本在博文最下面

    $ ./simg2img.py system.img

    等待转换完成,当前目录下就会出现一个tmp.img,然后我们就可以挂载了!

    $ mkdir tmp
    $ sudo mount tmp.img tmp

    我需要提取system.img里面文件,所以复制一份出来,然后卸载tmp.img的挂载

    $ sudo cp -r tmp system
    $ sudo umount tmp

    最后递归修改提取出来的文件用户就可以了!

    $ sudo chown -R michellgaby system

    这样就大功告成了!!下面是ext4转换为yaffs2的脚本

    复制代码
    #!/usr/bin/env python
    #encoding:utf8
    #===============================================================================
    #
    #          FILE:  simg2img.py
    # 
    #         USAGE:  ./simg2img.py system.img 
    # 
    #   DESCRIPTION:  
    # 
    #        AUTHOR: Karl Zheng 
    #       COMPANY: Meizu
    #       CREATED: 2011年10月18日 15时25分15秒 CST
    #      REVISION:  ---
    #===============================================================================
    
    import sys
    import struct
    
    class ext4_file_header:
        def __init__(self, buf):
            self.magic, 
                    self.major, 
                    self.minor, 
                    self.file_header_size, 
                    self.chunk_header_size, 
                    self.block_size, 
                    self.total_blocks, 
                    self.total_chunks, 
                    self.crc32, 
                    = struct.unpack('<IHHHHIIII', buf)
    
    class ext4_chunk_header:
        def __init__(self, buf):
            self.type,
                    self.reserved,
                    self.chunk_size,
                    self.total_size,
                    = struct.unpack('<HHII', buf)
    
    if len(sys.argv) > 1:
        filename = sys.argv[1]
    else:
        print "No file is designated!!"
        sys.exit(1)
    ifd = open(filename, "rb")
    
    buf=""
    
    # get filelen
    ifd.seek(0, 2)
    file_len = ifd.tell()
    print file_len
    ifd.seek(0, 0)
    
    buf = ifd.read(28)
    #print repr(buf)
    file_header = ext4_file_header(buf)
    
    EXT4_FILE_HEADER_MAGIC = 0xED26FF3A
    EXT4_CHUNK_HEADER_SIZE = 12
    
    if file_header.magic != EXT4_FILE_HEADER_MAGIC:
        print "Not a compressed ext4 file!!"
        sys.exit(1)
    
    print "file_header chunks:%X"%(file_header.total_chunks)
    
    total_chunks = file_header.total_chunks
    print("total chunk = %d "%(total_chunks))
    
    ofd = open("tmp.img", "wb")
    
    sector_base = 82528
    output_len = 0
    
    while total_chunks > 0:
        buf = ifd.read(EXT4_CHUNK_HEADER_SIZE)
        chunk_header = ext4_chunk_header(buf)
        sector_size = (chunk_header.chunk_size * file_header.block_size) >> 9;
        #print "ct:%X, cs:%X, ts:%X, ss:%X"%(chunk_header.type, chunk_header.chunk_size, chunk_header.total_size, sector_size)
    
        data = ""
        if chunk_header.type == 0xCAC1:  # raw type 
            data = ifd.read(chunk_header.total_size - EXT4_CHUNK_HEADER_SIZE)
            if len(data) != (sector_size << 9):
                print("len data:%d, sector_size:%d"%(len(data), (sector_size << 9)))
                sys.exit(1)
            else:
                print ("len data:%d, sector_size:%d"%(len(data), sector_size << 9))
                ofd.write(data)
                output_len += len(data)
                print("raw_chunk ")
                print("write raw data in %d size %d 
    "%(sector_base, sector_size))
                print("output len:%x"%(output_len))
    
                sector_base += sector_size
        else:
            if chunk_header.type == 0xCAC2:  # TYPE_FILL
                data = '' * (sector_size << 9);
                ofd.write(data) 
                output_len += len(data)
                print("fill_chunk 
    ")
                print("chunk_size:%x"%(chunk_header.chunk_size))
                print("output len:%x"%(output_len))
                sector_base += sector_size
            else:
                if chunk_header.type == 0xCAC3:  # TYPE_DONT_CARE
                    print "none chunk at chunk:%d"%(file_header.total_chunks - total_chunks)
                    print("data_size:0x%x, chunk_size:%d, block_size:%d"%(sector_size << 9, chunk_header.chunk_size, file_header.block_size))
                    data = '' * (sector_size << 9);
                    ofd.write(data) 
                    output_len += len(data)
                    sector_base += sector_size
                else:
                    data = '' * (sector_size << 9);
                    ofd.write(data)
                    print "unknown type!!"
                    output_len += len(data)
                    print("output len:%x"%(output_len))
                    sector_base += sector_size
    
        total_chunks -= 1 
        print("remain chunks = %d "%(total_chunks));
    
    print "write done"
    
    ifd.close()
    ofd.close()
    复制代码
  • 相关阅读:
    c++数据类型
    c++注释
    c++基本语法
    c++环境配置
    c++简介
    9 HTTP和HTTPS
    12 RESTful架构(SOAP,RPC)
    剑指10二进制中1的个数
    第2章 新手必须掌握的Linux命令
    11个炫酷的Linux终端命令大全
  • 原文地址:https://www.cnblogs.com/xunbu7/p/10844075.html
Copyright © 2011-2022 走看看