linux内核逆分析,理解boot.img与逆向分析Android/linux内核(示例代码)

一些尝试和理解。

1>提取boot.img:

20180110212923024411.png

其中,msm代表是高通的芯片,msm_sdcc.1是外接的SD卡挂载的目录,by-name指的是这个sd卡分区的名称。下面几行代表每个分区存储的东西。

20180110212923026364.png

记得提前su,dd if=/dev/block/mmcblk0p8 of=/data/local/tmp/boot.img。将boot.img dump出来

20180110212923028317.png

adb root获得root权限,将boot.img 移到pc上。

2>boot.img格式分析

如system/core/mkbootimg/bootimg.h

typedef structboot_img_hdr boot_img_hdr;#define BOOT_MAGIC "Android!"

#define BOOT_MAGIC_SIZE 8

#define BOOT_NAME_SIZE 16

#define BOOT_ARGS_SIZE 512

structboot_img_hdr

{

unsignedcharmagic[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*/unsignedchar name[BOOT_NAME_SIZE]; /*asciiz product name*/unsignedcharcmdline[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 | 1page** +-----------------+

** | 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来提取两个内核:

20180110212923030270.png

3>先来分析kernel:

20180110212923032223.png

拖入IDA,将处理器类型设置为ARM Little-endian,基地址改为c0008000。

20180110212923033200.png     

20180110212923035153.png

此时,由于没有符号表,不方便阅读和理解。获取符号表

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

同时,移到pc上。

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

得到这个

c0008000 T stext

c0008000 T _sinittext

c0008000 T _stext

c0008000 T __init_begin

c0008050 t __create_page_tables

c0008104 t __enable_mmu_loc

c0008110 t __vet_atags

c0008148 t __fixup_smp

c0008180 t __fixup_smp_on_up

...

将其转化为sym.idc,直接用python来转化,如下:

importre

address=[]

sym=[]

with open(‘syms.txt‘,‘rt‘) as fr:for line infr:

group= re.split(‘ ‘,line,3)

address.append(group[0])

sym.append(group[2])

with open(‘sym.idc‘,‘w+‘) as fw:

fw.write("#include \n")

fw.write("static main()\n")

fw.write("{")for i inrange(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源码来辅助阅读并修改内核。如下

20180110212923037106.png

可以修改task_pid_nr_ns()的返回值来内核级绕过的tracepid的反调试。

4>再来看ramdisk

20180110212923038083.png

20180110212923040036.png

得到了randisk.img,通过binwalk来观察,看到了ramdisk的文件系统,以及里面的文件,如下:

20180110212923041989.png

20180110212923043943.png

Android手机获得Root权限,可以让/system和/data分区获得读写的权限.这两个分区的权限配置,一般在根分区的init.rc文件中,修改这个文件可永久获得root权限。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值