理解boot.img與逆向分析Android/linux核心

來源:互聯網
上載者:User

標籤:pytho   app   load   設定   mmu   sig   ade   main   ramdisk   

  一些嘗試和理解。

  1>提取boot.img:

    

    其中,msm代表是高通的晶片,msm_sdcc.1是外接的SD卡掛載的目錄,by-name指的是這個sd卡分區的名稱。下面幾行代表每個分區儲存的東西。

 

    

    記得提前su,dd if=/dev/block/mmcblk0p8 of=/data/local/tmp/boot.img。將boot.img dump出來

 

    

    adb root獲得root許可權,將boot.img 移到pc上。

  2>boot.img格式分析

    如system/core/mkbootimg/bootimg.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 512struct boot_img_hdr{    unsigned char magic[BOOT_MAGIC_SIZE];    unsigned kernel_size;  /* size in bytes */    unsigned kernel_addr;  /* physical load addr */    unsigned ramdisk_size; /* size in bytes */    unsigned ramdisk_addr; /* physical load addr */    unsigned second_size;  /* size in bytes */    unsigned second_addr;  /* physical load addr */    unsigned tags_addr;    /* physical addr for kernel tags */    unsigned page_size;    /* flash page size we assume */    unsigned dt_size;      /* device tree in bytes */    unsigned unused;       /* future expansion: should be 0 */    unsigned char name[BOOT_NAME_SIZE]; /* asciiz product name */    unsigned char cmdline[BOOT_ARGS_SIZE];    unsigned id[8]; /* timestamp / checksum / sha1 / etc */};boot,img檔案跳過2k的檔案頭之後,包括兩個 gz包,一個是boot.img-kernel.gz:Linux核心,一個是boot.img-ramdisk.cpio.gz大概的組成結構如下:** +-----------------+ ** | boot header     | 1 page** +-----------------+** | kernel          | n pages  ** +-----------------+** | ramdisk         | m pages  ** +-----------------+** | second stage    | o pages** +-----------------+** | device tree     | p 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** p = (dt_size + page_size - 1) / page_size

    總而言之,boot.img包括boot.img header、kernel以及ramdisk檔案系統,其中kernel和ramdisk一般以zip的格式進行壓縮(取決於廠商)。利用binwalk來提取分析一下,並利用dd來提取兩個核心:

    

   3>先來分析kernel:

    

    拖入IDA,將處理器類型設定為ARM Little-endian,基地址改為c0008000。

         

    此時,由於沒有符號表,不方便閱讀和理解。擷取符號表

    cat /proc/kallsyms > /data/local/tmp/syms.txt

    同時,移到pc上。

    adb pull  /data/local/tmp/syms.txt syms.txt

    得到這個

c0008000 T stextc0008000 T _sinittextc0008000 T _stextc0008000 T __init_beginc0008050 t __create_page_tablesc0008104 t __enable_mmu_locc0008110 t __vet_atagsc0008148 t __fixup_smpc0008180 t __fixup_smp_on_up...

 

     將其轉化為sym.idc,直接用python來轉化,如下:

import readdress = []sym = []with open(‘syms.txt‘,‘rt‘) as fr:    for line in fr:        group = re.split(‘ ‘,line,3)        address.append(group[0])        sym.append(group[2])with open(‘sym.idc‘,‘w+‘) as fw:    fw.write("#include <idc.idc>\n")    fw.write("static main()\n")    fw.write("{")    for i in range(0,len(address)):        fw.write("\n\tMakeNameEx(0x"+address[i]+",\""+sym[i][:len(sym[i])-1]+"\",0);")    fw.write("\n}")print "OK!"

  之後將sym.idc載入ida,可以根據linux源碼來輔助閱讀並修改核心。如下

  

  可以修改task_pid_nr_ns()的傳回值來核心級繞過的tracepid的反調試。

  4>再來看ramdisk

    

    

    得到了randisk.img,通過binwalk來觀察,看到了ramdisk的檔案系統,以及裡面的檔案,如下:

    

    

    Android手機獲得Root許可權,可以讓/system和/data分區獲得讀寫的許可權.這兩個分區的許可權配置,一般在根分區的init.rc檔案中,修改這個檔案可永久獲得root許可權。

 

理解boot.img與逆向分析Android/linux核心

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.