理解boot.img与逆向分析Android/linux内核

  一些尝试和理解。

  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 512

struct 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 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来转化,如下:

import re

address = []
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权限。

时间: 2024-11-05 22:55:41

理解boot.img与逆向分析Android/linux内核的相关文章

【Bugly干货分享】手把手教你逆向分析 Android 程序

很多人写文章,喜欢把什么行业现状啊,研究现状啊什么的写了一大通,感觉好像在写毕业论文似的,我这不废话,先直接上几个图,感受一下. 第一张图是在把代码注入到地图里面,启动首页的时候弹出个浮窗,下载网络的图片,苍老师你们不会不认识吧? 第二张图是微信运动步数作弊,6不6?ok,那我们从头说起 1.反编译 Android 的反编译,相信大家都应该有所了解,apktool.JEB 等工具我们先看一下 Apk 文件的结构吧,如下图: 1.META-INF:签名文件(这个是如何生成的后面会提到)2.res:

安全和逆向:如何逆向分析Android程序

经过前面对各种反编译工具apktool,dx2jar,jd-gui等工具的介绍,本章节我们结合一个实际的案例,向大家讲解如何分析Android程序. 一.分析步骤 1.使用dex2jar和jd-gui工具分析Java反编译源码: 2.使用apktools,反编译Smail文件.由于Smail语法单独阅读比较困难,我们可以结合Java反编译的源码进行分析: 3.根据相关的特征和线索,修改Smail源码,使用apktools重新打包: 4.使用jarsigner重新签名apk,安装并验证修改是否正确

Android Linux内核编译

平台: Wind7_64 + Ubuntu12_04_64 + VMware 这里以Android5.0为例: Android5.0 可以到这里下载: android-5.0.tar.gz 115网盘礼包码:5lbd7crtk1wzhttp://115.com/lb/5lbd7crtk1wz Linux_source_goldfish 可以到这里下载: Android5.0的编译可以参考: 遇到的问题 http://www.cnblogs.com/pengdonglin137/p/4197969

linux内核学习之三 跟踪分析内核的启动过程

一   前期准备工作       1 搭建环境 1.1下载内核源代码并编译内核 创建目录,并进入该目录: 下载源码: 解压缩,并进入该目录:xz -d linux-3.18.6.tar.xz tar -xvf linux-3.18.6 cd  linux-3.18.6 选定x86架构的相关文件编译: 编译: 1.2 制作根文件系统 在工作目录下新建一个文件夹: mkdir rootfs 下载老师提供的资料:git clone https://github.com/mengning/menu.gi

《Linux内核分析》课程总结

朱宇轲 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 不知不觉,在网易云课堂上追了两个多月的课程<Linux内核分析>就要告一段落了.在课程即将结束的时刻,我想将这八周的课程串起来,进行一个简单的总结,同时讲一讲自己上这门课的感悟和体会,以期再接再厉,继往开来. 每一周的视频,我都认真看过,并完成了测验,撰写了相关的博客,下面首先进行简单的回顾和总结: 第一周:从一

Linux内核及分析 第三周 Linux内核的启动过程

实验过程: 打开shell终端,执行以下命令: cd LinuxKernel/ qemu -kernel linux-3.18.6/arch/x86/boot/bzImage-initrd rootfs.img 执行完毕后会弹出QEMU窗口,输出Linux内核启动信息,启动成功后显示Menuos 输入help,提示该精简的系统支持三个命令:help.version.quit 使用gdb跟踪调试内核 打开shell终端,执行以下命令: cd LinuxKernel/ qemu -kernel li

Linux内核--网络栈实现分析(二)--数据包的传递过程(上)

本文分析基于Linux Kernel 1.2.13 原创作品,转载请标明http://blog.csdn.net/yming0221/article/details/7492423 更多请看专栏,地址http://blog.csdn.net/column/details/linux-kernel-net.html 作者:闫明 注:标题中的”(上)“,”(下)“表示分析过程基于数据包的传递方向:”(上)“表示分析是从底层向上分析.”(下)“表示分析是从上向下分析. 上一篇博文中我们从宏观上分析了L

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

0x1.手机设备环境 Model number: Nexus 5 OS Version: Android 4.4.4 KTU84P Kernel Version: 3.4.0-gd59db4e 0x2.Android内核提取 查找Android设备的boot分区文件.高通芯片的设备可以通过下面的命令进行查找. cd /home/androidcode/AndroidDevlop/modifyNexus5Boot adb shell ls -al /dev/block/platform/msm_s

linux系统启动过程具体解释-开机加电后发生了什么 --linux内核剖析(零)

本文參考了例如以下文章 深入理解linux启动过程 mbr (主引导记录(Master Boot Record)) 电脑从开机加电到操作系统main函数之前执行的过程 详细解释linux系统的启动过程及系统初始化 linux系统的启动流程 关于linux系统的启动流程我们能够按步进行划分为例如以下: BIOS POST自检 BIOS(Boot Sequence) 引导操作系统 载入对应引导上的MBR(bootloader) 主引导设置载入其BootLoader 载入操作系统 启动BIOS,准备实