dump 固件android_芯片dump 出android 系统固件bin 挂载 解析 - CSDN
  • 一、手机设备环境 ...OS Version: Android 4.4.4 KTU84P Kernel Version: 3.4.0-gd59db4e 二、Android内核提取 adb shell su cd /dev/block/platform/msm_sdcc.1/by-name ls -l boot boot 是个系统符号软链

    本文博客链接:http://blog.csdn.net/qq1084283172/article/details/57074695


    一、手机设备环境

    Model number: Nexus 5
    OS Version: Android 4.4.4 KTU84P
    Kernel Version: 3.4.0-gd59db4e


    二、Android内核提取

    adb shell
    su
    cd /dev/block/platform/msm_sdcc.1/by-name
    ls -l boot


    boot 是个系统符号软链接,/dev/block/mmcblk0p19 就是boot分区


    用 dd 将其dump到Nexus 5手机的sdcard文件夹下:

    dd if=/dev/block/mmcblk0p19 of=/sdcard/boot.img


    adb pull 将dump出来的boot.img文件导出到 /home/androidcode/AndroidDevlop/Nexus5Boot 文件夹下

    adb pull /sdcard/boot.img /home/androidcode/AndroidDevlop/Nexus5Boot



    用 Binwalk 工具分析boot.img文件

    1.Binwalk工具的详细使用说明:Binwalk:后门(固件)分析利器

    2.Binwalk工具的github地址:https://github.com/devttys0/binwalk

    3.Binwalk工具的官方网址:http://binwalk.org/

    4.Binwalk工具的wiki使用说明的地址:https://github.com/devttys0/binwalk/wiki

    5.Binwalk工具作者收集的IDA插件和脚本:https://github.com/devttys0/ida

    6.Binwalk工具的安装说明:https://github.com/devttys0/binwalk/blob/master/INSTALL.md


    安装Binwalk工具并分析boot.img文件

    cd /home/androidcode/AndroidDevlop/Nexus5Boot/binwalk-master
    
    # 按照binwalk工具的说明安装binwalk
    sudo python setup.py install
    
    # 分析boot.img文件
    sudo binwalk ../boot.img >log


    分析的结果截图:



    boot.img文件跳过2k的文件头之后,包括有两个gz包,一个是boot.img-kernel.gz即Linux内核,一个是boot.img-ramdisk.cpio.gz,
    大概的组成结构如下图,详细的信息可以参考Android源码的 android/platform/system/core/master/mkbootimg/bootimg.h 文件,在线查看 booting.h 文件地址:https://android.googlesource.com/platform/system/core/+/master/mkbootimg/bootimg.h

    /* tools/mkbootimg/bootimg.h
    **
    ** Copyright 2007, The Android Open Source Project
    **
    ** Licensed under the Apache License, Version 2.0 (the "License"); 
    ** you may not use this file except in compliance with the License. 
    ** You may obtain a copy of the License at 
    **
    **     http://www.apache.org/licenses/LICENSE-2.0 
    **
    ** Unless required by applicable law or agreed to in writing, software 
    ** distributed under the License is distributed on an "AS IS" BASIS, 
    ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
    ** See the License for the specific language governing permissions and 
    ** limitations under the License.
    */
    #include <stdint.h>
    #ifndef _BOOT_IMAGE_H_
    #define _BOOT_IMAGE_H_
    typedef struct boot_img_hdr boot_img_hdr;
    #define BOOT_MAGIC "ANDROID!"
    #define BOOT_MAGIC_SIZE 8
    #define BOOT_NAME_SIZE 16
    #define BOOT_ARGS_SIZE 512
    #define BOOT_EXTRA_ARGS_SIZE 1024
    struct boot_img_hdr
    {
        uint8_t magic[BOOT_MAGIC_SIZE];
        uint32_t kernel_size;  /* size in bytes */
        uint32_t kernel_addr;  /* physical load addr */
        uint32_t ramdisk_size; /* size in bytes */
        uint32_t ramdisk_addr; /* physical load addr */
        uint32_t second_size;  /* size in bytes */
        uint32_t second_addr;  /* physical load addr */
        uint32_t tags_addr;    /* physical addr for kernel tags */
        uint32_t page_size;    /* flash page size we assume */
        uint32_t unused;       /* reserved for future expansion: MUST be 0 */
        /* operating system version and security patch level; for
         * version "A.B.C" and patch level "Y-M-D":
         * ver = A << 14 | B << 7 | C         (7 bits for each of A, B, C)
         * lvl = ((Y - 2000) & 127) << 4 | M  (7 bits for Y, 4 bits for M)
         * os_version = ver << 11 | lvl */
        uint32_t os_version;
        uint8_t name[BOOT_NAME_SIZE]; /* asciiz product name */
        uint8_t cmdline[BOOT_ARGS_SIZE];
        uint32_t id[8]; /* timestamp / checksum / sha1 / etc */
        /* Supplemental command line data; kept here to maintain
         * binary compatibility with older versions of mkbootimg */
        uint8_t extra_cmdline[BOOT_EXTRA_ARGS_SIZE];
    } __attribute__((packed));
    /*
    ** +-----------------+ 
    ** | boot header     | 1 page
    ** +-----------------+
    ** | kernel          | n pages  
    ** +-----------------+
    ** | ramdisk         | m pages  
    ** +-----------------+
    ** | second stage    | o pages
    ** +-----------------+
    **
    ** n = (kernel_size + page_size - 1) / page_size
    ** m = (ramdisk_size + page_size - 1) / page_size
    ** o = (second_size + page_size - 1) / page_size
    **
    ** 0. all entities are page_size aligned in flash
    ** 1. kernel and ramdisk are required (size != 0)
    ** 2. second is optional (second_size == 0 -> no second)
    ** 3. load each element (kernel, ramdisk, second) at
    **    the specified physical address (kernel_addr, etc)
    ** 4. prepare tags at tag_addr.  kernel_args[] is
    **    appended to the kernel commandline in the tags.
    ** 5. r0 = 0, r1 = MACHINE_TYPE, r2 = tags_addr
    ** 6. if second_size != 0: jump to second_addr
    **    else: jump to kernel_addr
    */
    #if 0
    typedef struct ptentry ptentry;
    struct ptentry {
        char name[16];      /* asciiz partition name    */
        unsigned start;     /* starting block number    */
        unsigned length;    /* length in blocks         */
        unsigned flags;     /* set to zero              */
    };
    /* MSM Partition Table ATAG
    **
    ** length: 2 + 7 * n
    ** atag:   0x4d534d70
    **         <ptentry> x n
    */
    #endif
    #endif

    有关boot.img文件的生成可以参考Android源码的 android/platform/system/core/master/mkbootimg/bootimg 文件,在线查看 booting文件地址:https://android.googlesource.com/platform/system/core/+/master/mkbootimg/mkbootimg

    #!/usr/bin/env python
    # Copyright 2015, The Android Open Source Project
    #
    # Licensed under the Apache License, Version 2.0 (the "License");
    # you may not use this file except in compliance with the License.
    # You may obtain a copy of the License at
    #
    #     http://www.apache.org/licenses/LICENSE-2.0
    #
    # Unless required by applicable law or agreed to in writing, software
    # distributed under the License is distributed on an "AS IS" BASIS,
    # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    # See the License for the specific language governing permissions and
    # limitations under the License.
    from __future__ import print_function
    from sys import argv, exit, stderr
    from argparse import ArgumentParser, FileType, Action
    from os import fstat
    from struct import pack
    from hashlib import sha1
    import sys
    import re
    def filesize(f):
        if f is None:
            return 0
        try:
            return fstat(f.fileno()).st_size
        except OSError:
            return 0
    def update_sha(sha, f):
        if f:
            sha.update(f.read())
            f.seek(0)
            sha.update(pack('I', filesize(f)))
        else:
            sha.update(pack('I', 0))
    def pad_file(f, padding):
        pad = (padding - (f.tell() & (padding - 1))) & (padding - 1)
        f.write(pack(str(pad) + 'x'))
    def write_header(args):
        BOOT_MAGIC = 'ANDROID!'.encode()
        args.output.write(pack('8s', BOOT_MAGIC))
        args.output.write(pack('10I',
            filesize(args.kernel),                          # size in bytes
            args.base + args.kernel_offset,                 # physical load addr
            filesize(args.ramdisk),                         # size in bytes
            args.base + args.ramdisk_offset,                # physical load addr
            filesize(args.second),                          # size in bytes
            args.base + args.second_offset,                 # physical load addr
            args.base + args.tags_offset,                   # physical addr for kernel tags
            args.pagesize,                                  # flash page size we assume
            0,                                              # future expansion: MUST be 0
            (args.os_version << 11) | args.os_patch_level)) # os version and patch level
        args.output.write(pack('16s', args.board.encode())) # asciiz product name
        args.output.write(pack('512s', args.cmdline[:512].encode()))
        sha = sha1()
        update_sha(sha, args.kernel)
        update_sha(sha, args.ramdisk)
        update_sha(sha, args.second)
        img_id = pack('32s', sha.digest())
        args.output.write(img_id)
        args.output.write(pack('1024s', args.cmdline[512:].encode()))
        pad_file(args.output, args.pagesize)
        return img_id
    class ValidateStrLenAction(Action):
        def __init__(self, option_strings, dest, nargs=None, **kwargs):
            if 'maxlen' not in kwargs:
                raise ValueError('maxlen must be set')
            self.maxlen = int(kwargs['maxlen'])
            del kwargs['maxlen']
            super(ValidateStrLenAction, self).__init__(option_strings, dest, **kwargs)
        def __call__(self, parser, namespace, values, option_string=None):
            if len(values) > self.maxlen:
                raise ValueError('String argument too long: max {0:d}, got {1:d}'.
                    format(self.maxlen, len(values)))
            setattr(namespace, self.dest, values)
    def write_padded_file(f_out, f_in, padding):
        if f_in is None:
            return
        f_out.write(f_in.read())
        pad_file(f_out, padding)
    def parse_int(x):
        return int(x, 0)
    def parse_os_version(x):
        match = re.search(r'^(\d{1,3})(?:\.(\d{1,3})(?:\.(\d{1,3}))?)?', x)
        if match:
            a = int(match.group(1))
            b = c = 0
            if match.lastindex >= 2:
                b = int(match.group(2))
            if match.lastindex == 3:
                c = int(match.group(3))
            # 7 bits allocated for each field
            assert a < 128
            assert b < 128
            assert c < 128
            return (a << 14) | (b << 7) | c
        return 0
    def parse_os_patch_level(x):
        match = re.search(r'^(\d{4})-(\d{2})-(\d{2})', x)
        if match:
            y = int(match.group(1)) - 2000
            m = int(match.group(2))
            # 7 bits allocated for the year, 4 bits for the month
            assert y >= 0 and y < 128
            assert m > 0 and m <= 12
            return (y << 4) | m
        return 0
    def parse_cmdline():
        parser = ArgumentParser()
        parser.add_argument('--kernel', help='path to the kernel', type=FileType('rb'),
                            required=True)
        parser.add_argument('--ramdisk', help='path to the ramdisk', type=FileType('rb'))
        parser.add_argument('--second', help='path to the 2nd bootloader', type=FileType('rb'))
        parser.add_argument('--cmdline', help='extra arguments to be passed on the '
                            'kernel command line', default='', action=ValidateStrLenAction, maxlen=1536)
        parser.add_argument('--base', help='base address', type=parse_int, default=0x10000000)
        parser.add_argument('--kernel_offset', help='kernel offset', type=parse_int, default=0x00008000)
        parser.add_argument('--ramdisk_offset', help='ramdisk offset', type=parse_int, default=0x01000000)
        parser.add_argument('--second_offset', help='2nd bootloader offset', type=parse_int,
                            default=0x00f00000)
        parser.add_argument('--os_version', help='operating system version', type=parse_os_version,
                            default=0)
        parser.add_argument('--os_patch_level', help='operating system patch level',
                            type=parse_os_patch_level, default=0)
        parser.add_argument('--tags_offset', help='tags offset', type=parse_int, default=0x00000100)
        parser.add_argument('--board', help='board name', default='', action=ValidateStrLenAction,
                            maxlen=16)
        parser.add_argument('--pagesize', help='page size', type=parse_int,
                            choices=[2**i for i in range(11,15)], default=2048)
        parser.add_argument('--id', help='print the image ID on standard output',
                            action='store_true')
        parser.add_argument('-o', '--output', help='output file name', type=FileType('wb'),
                            required=True)
        return parser.parse_args()
    def write_data(args):
        write_padded_file(args.output, args.kernel, args.pagesize)
        write_padded_file(args.output, args.ramdisk, args.pagesize)
        write_padded_file(args.output, args.second, args.pagesize)
    def main():
        args = parse_cmdline()
        img_id = write_header(args)
        write_data(args)
        if args.id:
            if isinstance(img_id, str):
                # Python 2's struct.pack returns a string, but py3 returns bytes.
                img_id = [ord(x) for x in img_id]
            print('0x' + ''.join('{:02x}'.format(c) for c in img_id))
    if __name__ == '__main__':
        main()


    根据上面的信息,从boot.img中提取出压缩的内核文件:

    cd ../
    
    dd if=boot.img of=kernel.gz bs=1 skip=20660




    由于Android的内核文件经过了gzip压缩,因此要拿到最终的Android内核文件还需要进行解压缩:

    gzip -d kernel.gz



    补充说明:关于Android的内核文件的提取和解压方法很多,常用的工具也比较多,也可以使用下面的几个工具之一来进行boot.img文件的解包和gzip的解压缩操作。

    bootimg.exe	https://github.com/cofface/android_bootimg 
    
    bootimg-tools   https://github.com/pbatard/bootimg-tools.git  
    
    unpackbootimg	http://bbs.pediy.com/showthread.php?t=197334
    
    abootimg	https://github.com/ggrandou/abootimg



    解压后的Android内核文件kernel中不包含符号信息。所以还要从Android设备中提取符号信息,尽管 /proc/kallsyms 文件中存储了所有内核符号信息,但是从分析的结果来看,文件中存储的内存地址值都是0,这是为了防止内核地址泄露。在dump 镜像文件boot.img的Android设备上执行下面的命令,就会发现Android设备上的所有内核符号都被屏蔽隐藏了。

    adb shell
    
    cat /proc/kallsyms




    为了要获取Android内核中所有的内核符号信息,可以通过在root权限下,修改Andriod设备中的/proc/sys/kernel/kptr_restrict的值来实现,去掉Android内核符号的信息屏蔽。

    adb shell
    su
    
    # 查看默认值
    cat /proc/sys/kernel/kptr_restrict
    
    # 关闭内核符号屏蔽
    echo 0 > /proc/sys/kernel/kptr_restrict 
    
    # 查看修改后的值
    cat /proc/sys/kernel/kptr_restrict
    
    cat /proc/kallsyms



    关闭Android设备的内核符号的屏蔽以后,再次执行 cat /proc/kallsyms ,发现被隐藏的内核符号信息都显示出来了。


    在root权限下,将Android设备中的内核符号信息dump出来,导出到 /home/androidcode/AndroidDevlop/Nexus5Boot/syms.txt文件中。因此,Android内核文件的内核符号信息都保存在syms.txt文件中了。

    # cat /proc/kallsyms > /sdcard/syms.txt
    
    # exit
    $ exit
    
    $ adb pull /sdcard/syms.txt syms.txt





    三、IDA分析导出的Androd内核文件

    将提取出来的Android内核 kernel文件 拖到IDA Pro 6.8中进行分析,设置处理器类型ARM Little-endian

     


    ROM start addressLoading address 处填上0xc0008000,然后点击 OK 完成 。



    *至于这里为什么要设置 ROM start address 和 Loading address的地址为 0xc0008000? 具体的可以参考 bootheader这个数据结构,在这里需要关注其中几个比较重要的值,这些值定义在boot/boardconfig.h中,不同的芯片对应vendor下不同的boardconfig,在这里我们的值分别是(分别是 kernel/ramdis/tags 载入ram的物理地址):

    #define PHYSICAL_DRAM_BASE   0x00200000 
    #define KERNEL_ADDR          (PHYSICAL_DRAM_BASE + 0x00008000)
    #define RAMDISK_ADDR         (PHYSICAL_DRAM_BASE + 0x01000000)
    #define TAGS_ADDR            (PHYSICAL_DRAM_BASE + 0x00000100)
    #define NEWTAGS_ADDR         (PHYSICAL_DRAM_BASE + 0x00004000)
    上面这些值分中 KERNEL_ADDR 就是 ZTEXTADDR,RAMDISK_ADDR 就是 INITRD_PHYS,而 TAGS_ADDR 就是PARAMS_PHYS。bootloader会从boot.img的分区中将kernel和ramdisk分别读入RAM上面定义的内存地址中,然后就会跳到ZTEXTADDR开始执行。

    详细的参考:Android boot.img 结构

    OK,现在就可以在IDA中查看和分析Android内核文件中的代码了,但是函数名称不是很友好,很多系统函数的名称都没有显示出来,只是显示成IDA中默认的普通函数名称。



    前面我们已经将Androd内核文件中的内核符号信息都dump出来,这里大有用武之地。因此,向IDA中导入之前提取出来的内核符号信息就可以看到对应的函数名称了。需要用到下面的python脚本:

    ksyms = open("C:\Users\Fly2016\Desktop\Binwalk工具\Nexus5_kernel\syms.txt")
    for line in ksyms:
        addr = int(line[0:8],16)
        name = line[11:]
        idaapi.set_debug_name(addr,name)
        MakeNameEx(addr,name,SN_NOWARN)
        Message("%08X:%sn"%(addr,name))


    在IDA的 File->Script Command中运行上述python脚本,之后就可以在IDA中成功添加内核符号信息使IDA显示出正确的系统调用的函数名称来。



    大功告成,现在可以愉快的分析Android内核的代码了:



    总结:通过这种dump设备固件的方法,可以逆向分析没有源码的固件二进制文件,对于Android设备来说又可以通过这种方法修改Android的内核文件来进行反调试或者其他的目的。将修改好的Android内核文件使用boot.img等打包解包工具还原打包回到boot.img文件中,然后 fastboot flash boot boot.img  更新Android设备的内核文件即可达到目的。



    学习链接

    从Android手机中提取内核 <主要参考>

    root技术背后android手机内核提取及逆向分析

    逆向修改手机内核,绕过反调试

    提取Android内核的方法

    android boot.img 结构

    boot.img逆向分析

    理解boot.img与静态分析Android/linux内核

    展开全文
  • android固件是在mtdblock中, 但是会有很多个block, root@android: # cat /proc/partitions major minor #blocks name 31 0 4096 mtdblock0 31 1 16384 mtdblock1 31 2 16384 mtd...

    android固件是在mtdblock中, 但是会有很多个block,

    root@android: # cat /proc/partitions
    
    major minor  #blocks name
      31        0       4096 mtdblock0
      31        1      16384 mtdblock1
      31        2      16384 mtdblock2
      31        3      16384 mtdblock3
      31        4     393216 mtdblock4
      31        5     131072 mtdblock5
      31        6    2097152 mtdblock6
      31        7       4096 mtdblock7
      31        8     524288 mtdblock8
      31        9    4509696 mtdblock9
     179        0    3941376 mmcblk0
     179        1    3941344 mmcblk0p1
    

    各个block分别对应哪个分区?

    root@android: # cat /proc/mtd
    
    dev:    size   erasesize  name
    mtd0: 00400000 00004000 "misc"
    mtd1: 01000000 00004000 "kernel"
    mtd2: 01000000 00004000 "boot"
    mtd3: 01000000 00004000 "recovery"
    mtd4: 18000000 00004000 "backup"
    mtd5: 08000000 00004000 "cache"
    mtd6: 80000000 00004000 "userdata"
    mtd7: 00400000 00004000 "kpanic"
    mtd8: 20000000 00004000 "system"
    mtd9: 113400000 00004000 "user"
    

    这样我们就知道了, mtd1 是kernel 所在, 所以我们想dump kernel.img 就用dd即可:

    root@android: # dd if=/dev/block/mtdblock1 of=/mnt/external_sd/dd.out/kernel.img
    展开全文
  • 全志Tina 系统dump固件制作方法 【适用范围】 适用于Tina1.0 ,Tina2.1 平台 ( 两个平台对应修改的内容不同 ) 【问题现象】 目前tina 平台缺少将烧录的固件dump出来的功能。(android 平台的lichee目录,通过./...

    全志Tina 系统dump固件制作方法
    【适用范围】
    适用于Tina1.0 ,Tina2.1 平台 ( 两个平台对应修改的内容不同 )
    【问题现象】
    目前tina 平台缺少将烧录的固件dump出来的功能。(android 平台的lichee目录,通过./build.sh pack_dump 就可以编译出来,该功能常用于客退分析)
    【问题原因】
    Tina 平台的编译方式不一样,所以需要修改pack 的代码。
    【解决办法】
    Tina1.0 修改内容如下:
    1. 修改对应的 scripts/setenv.sh
    — a/scripts/setenv.sh
    +++ b/scripts/setenv.sh
    @@ -178,13 +178,27 @@ function pack()
    local T=(gettop)localP=localO=localD=uart0localU=+localD=uart0+localM=nonelocalH=(gettop)/staging_dir/host/bin/
    export PATH=H:PATH
    - if [ “1=d];thenD=card0fi++unsetOPTIND+whilegetoptsdmarg+do+casearg in
    + d)
    + D=card0
    + ;;
    + m)
    + M=dump
    + ;;
    + ?)
    + return 1
    + ;;
    + esac
    + done

    if [ "$T" ]; then
        if [ "x${CHIP}" = "xsun5i" ]; then
    

    @@ -202,7 +216,7 @@ function pack()
    make $U/install >> /dev/null

    if [ -x $P ]; then
    

    - PrO -c CHIPdD -b BOARD+P -r OcCHIP -d DbBOARD -m $M
    fi
    }
    function make_img_md5(){

    1. 修改对应的 target/linux/xxx/image/pack_img.sh
      — a/target/linux/sunxi/image/pack_img.sh
      +++ b/target/linux/sunxi/image/pack_img.sh
      @@ -6,7 +6,7 @@ PACK_SIG=none
      PACK_MODE=none
      PACK_DIR=
      -while getopts “c:p:b:d:r:sh” arg
      +while getopts “c:p:b:d:r:m:sh” arg
      do
      case arginc)@@18,6+18,9@@dod)PACKDEBUG=OPTARG
      ;;

      • m)
      • PACK_MODE=$OPTARG
      • ;;
        s)
        PACK_SIG=sig
        ;;
        @@ -81,6 +84,11 @@ function do_prepare()
        sed -i ‘s/\\/\//g’ image.cfg
        sed -i ‘s/^imagename/;imagename/g’ image.cfg

      • if [ “x${PACK_MODE}” = “xdump” ] ; then

      • cp -vf sys_partition_dump.fex sys_partition.fex
      • cp -vf usbtool_test.fex usbtool.fex
      • fi
        +
        if [ “xPACKDEBUG"="xcard0"a"x{PACK_MODE}” != “xdump” \
        -a “x${PACK_FUNC}” != “xprvt” ] ; then
        uart_switch

    Tina2.0 对应修改的内容如下:
    function pack() {
    local T=(gettop)localchip=sun5ilocalplatform=(get_build_var TARGET_BUILD_VARIANT)
    local board_platform=(getbuildvarTARGETBOARDPLATFORM)localboard=(get_build_var TARGET_BOARD)
    local debug=uart0
    + local mode=normal
    local sigmode=none
    local securemode=none
    local mode=normal
    unset OPTIND
    - while getopts “dsvh” arg
    + while getopts “dsvmh” arg
    do
    case $arg in
    d)
    debug=card0
    ;;
    s)
    sigmode=secure
    ;;
    v)
    securemode=secure
    ;;
    + m)
    + mode=dump
    + ;;
    h)
    usage
    return 0
    ;;
    ?)
    return 1
    ;;
    esac
    done

    chip=$(get_chip)
    if [ "x$chip" = "x" ]; then
        echo "platform($TARGET_PLATFORM) not support"
        return
    fi
    

    - T/scripts/packimg.shcchip -p platformbboard -d debugssigmode -v securemodetT
    + T/scripts/packimg.shcchip -p platformbboard \
    -d debugssigmode -m modevsecuremode -t $T
    }

    所以用方法
    1. 使用pack -m [-d] (”-m” 选项),打包成固件名类似:sun8iw5p1_tina_evb_card0_dump.img
    2. 在D盘中创建目录:test,即D:/test
    3. 使用打包成的固件进行正常烧录,在烧录过程中并不会把固件烧写到flash中,而是自动把flash中的固件按分区dump到D:/test

    展开全文
  • 固件目的:主要是dump 存储在nvm 上的运行固件内容。使用方法: 在D盘根目录建立test文件夹,然后使用phoenixsuit 目录烧录,完成后就会在...注意,在先编译android 并pack 完成后,再编译lichee 的 dump 固件 ...

    固件目的:
    主要是dump 存储在nvm 上的运行固件内容。


    使用方法:

    在D盘根目录建立test文件夹,然后使用phoenixsuit 目录烧录,完成后就会在test 文件夹dump出对应的

    原来烧录固件的内容。

    编译过程:
    在lichee目录下,输入 ./build.sh pack_dump

    注意,在先编译android 并pack 完成后,再编译lichee 的 dump 固件

     

     

    
    

     

    
       生成的固件,按照普通固件的方式进行usb量产操作

     

    转载于:https://www.cnblogs.com/zhangyin-ethan/p/7509534.html

    展开全文
  • 锋影email:174176320@qq.com1 总述为了方便客户日后的固件升级,本周研究了一下android的recovery模式。网上有不少这类的资料,但都比较繁杂,没有一个系统的介绍与认识,在这里将网上所找到的和自己通过查阅代码所...
  •  Android系统为了保证各商业公司的利益,允许在系统中使用不开源的固件。因此我们可以看到比如用于音频处理的、用于键盘支持的等等大量固件。既然这么多模块要用到固件,那么我们也有必要来了解一下固件在崩溃后的...
  • Android native memory leak detect (Android native泄露检测) 简介 Android应用中,经常会有业务需要使用到Native实现。比如加密,音视频播放等。也就是常见的二进制文件xxx.so 这部分代码,申请的内存不走...
  • 2012年3月23日 android recovery模式及ROM制作 ...为了方便客户日后的固件升级,本周研究了一下android的recovery模式。网上有不少这类的资料,但都比较繁杂,没有一个系统的介绍与认识,在这里将网上所找
  • (一)DDMS 的Heap Dump     1) Data Object:java object. 2) Class Object:object of type Class, e.g. what you'd get from java.lang.String.class or myObject.getClass( ). 3) 1,2,4,8-byte ...
  • 1. 使用am 命令 进入adb shell C:\Users\zy>...am dumpheap com.chaozh.iReader /sdcard/a.hprof Error: Unable to open file: /sdcard/a.hprof Consider using a file under /data/local/tmp/ 提示我们用...
  • 这个boot.img主要包括kernel+ramdisk。 2、system/目录的内容在升级后会放在系统的system分区。主要用来更新系统的一些应用或则应用会用到的一些库...可以将Android源码编译out/target/product/tcc8800/system/中的...
  • 最近遇到一个关于modem crash的问题,机器modem发生错误之后,不仅重启自己,还把... 使用ADB打开android shell环境,有这么一个文件夹:sys/bus/msm_subsys/devices,里面分别有三个文件夹:subsys0、subsys1、subs...
  • 删除无用APk 系统备份、cts测试相关、系统壁纸备份 build/make/target/product/base_system.mk @@ -41,7 +41,6 @@ PRODUCT_PACKAGES += \ ashmemd \ atrace \ audioserver \ - BackupRestoreConfirmation \ ...
  • Android签名证书 背景 因业务需求,经常与系统厂商打交道,大多需要厂商开放root权限 目前获取系统权限的总结有三种方式(均有实际应用) platform签名 root固件 (有su) 调用厂商封装好的系统权限的sdk 后两者调试比较...
  • 基于Android 8.1 的博通蓝牙(BCM89342)的驱动移植记录说明一 、软硬件平台二、蓝牙移植流程2.1 kernel 对蓝牙的驱动支持配置2.2 kernel层编写蓝牙电源管理(bt rfkill)驱动2.3 android源码中把蓝牙这个宏定义给选...
  • A20平台固件解包打包

    2016-04-20 18:22:28
    官方工具有DragonFace,这是一个Windows平台的软件,使用起来非常的方便。但是也有一些缺点,比如内置APP时,如果该APP包含了jni库,比如常见的libserial_jni.so以及libusb1.0.so,那么在内置时,第一次会成功;...
  • Android开发小问题集

    2016-08-06 13:17:19
    1、触屏鼠标模式和触屏模式开发android4.3高通400平台时,用atmel_max 640T作为触屏,很奇怪的问题,调好驱动后,系统运行的效果,居然跟鼠标一样,相对运动,网上查询资料几乎没有,大家都很懒啊!查到一个相关的...
  • Android 干货分享 本篇文章主要介绍 Android 开发中 SystemServer进程启动 部分知识点,通过阅读本篇文章,您将收获以下内容: 一、SystemServer 启动的服务有哪些 二、SystemServer启动总体流程概述 三、...
  • android的recovery模式

    2015-08-13 16:39:49
    为了方便客户日后的固件升级,本周研究了一下android的recovery模式。网上有不少这类的资料,但都比较繁杂,没有一个系统的介绍与认识,在这里将网上所找到的和自己通过查阅代码所掌握的东西整理出来,给大家一个...
1 2 3 4 5 ... 18
收藏数 357
精华内容 142
关键字:

dump 固件android