一些尝试和理解。

  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

  

  1. typedef struct boot_img_hdr boot_img_hdr;
  2.  
  3. #define BOOT_MAGIC "Android!"
  4. #define BOOT_MAGIC_SIZE 8
  5. #define BOOT_NAME_SIZE 16
  6. #define BOOT_ARGS_SIZE 512
  7.  
  8. struct boot_img_hdr
  9. {
  10. unsigned char magic[BOOT_MAGIC_SIZE];
  11.  
  12. unsigned kernel_size; /* size in bytes */
  13. unsigned kernel_addr; /* physical load addr */
  14.  
  15. unsigned ramdisk_size; /* size in bytes */
  16. unsigned ramdisk_addr; /* physical load addr */
  17.  
  18. unsigned second_size; /* size in bytes */
  19. unsigned second_addr; /* physical load addr */
  20.  
  21. unsigned tags_addr; /* physical addr for kernel tags */
  22. unsigned page_size; /* flash page size we assume */
  23. unsigned dt_size; /* device tree in bytes */
  24. unsigned unused; /* future expansion: should be 0 */
  25. unsigned char name[BOOT_NAME_SIZE]; /* asciiz product name */
  26.  
  27. unsigned char cmdline[BOOT_ARGS_SIZE];
  28.  
  29. unsigned id[]; /* timestamp / checksum / sha1 / etc */
  30. };
  31.  
  32. boot,img文件跳过2k的文件头之后,包括两个 gz包,一个是boot.img-kernel.gzLinux内核,一个是boot.img-ramdisk.cpio.gz
  33. 大概的组成结构如下:
  34.  
  35. ** +-----------------+
  36. ** | boot header | page
  37. ** +-----------------+
  38. ** | kernel | n pages
  39. ** +-----------------+
  40. ** | ramdisk | m pages
  41. ** +-----------------+
  42. ** | second stage | o pages
  43. ** +-----------------+
  44. ** | device tree | p pages
  45. ** +-----------------+
  46. ** n = (kernel_size + page_size - ) / page_size
  47. ** m = (ramdisk_size + page_size - ) / page_size
  48. ** o = (second_size + page_size - ) / page_size
  49. ** p = (dt_size + page_size - ) / 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

    得到这个

  1. c0008000 T stext
  2. c0008000 T _sinittext
  3. c0008000 T _stext
  4. c0008000 T __init_begin
  5. c0008050 t __create_page_tables
  6. c0008104 t __enable_mmu_loc
  7. c0008110 t __vet_atags
  8. c0008148 t __fixup_smp
  9. c0008180 t __fixup_smp_on_up
  10. ...

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

  1. import re
  2.  
  3. address = []
  4. sym = []
  5.  
  6. with open('syms.txt','rt') as fr:
  7. for line in fr:
  8. group = re.split(' ',line,3)
  9. address.append(group[0])
  10. sym.append(group[2])
  11. with open('sym.idc','w+') as fw:
  12. fw.write("#include <idc.idc>\n")
  13. fw.write("static main()\n")
  14. fw.write("{")
  15. for i in range(0,len(address)):
  16. fw.write("\n\tMakeNameEx(0x"+address[i]+",\""+sym[i][:len(sym[i])-1]+"\",0);")
  17. fw.write("\n}")
  18. 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内核的更多相关文章

  1. android linux 内核层

    Android依赖于Linux2.6内核提高的高核心系统服务,例如安全,内存管理,进程管理,网络斎等等方面内容.内核作为一个抽象层,存在与硬件层和软件层之间.android对Linux下面内容做了增强 ...

  2. Android Linux内核编译

    平台: Wind7_64 + Ubuntu12_04_64 + VMware 这里以Android5.0为例: Android5.0 可以到这里下载:115网盘礼包码:5lbd7crtk1wzhttp ...

  3. Linux系统的理解及学习Linux内核的心得

    作业列表      (点击作业跳转) linux内核分析作业:以一简单C程序为例,分析汇编代码理解计算机如何工作 linux内核分析作业:操作系统是如何工作的进行:完成一个简单的时间片轮转多道程序内核 ...

  4. Linux内核启动过程概述

    版权声明:本文原创,转载需声明作者ID和原文链接地址. Hi!大家好,我是CrazyCatJack.今天给大家带来的是Linux内核启动过程概述.希望能够帮助大家更好的理解Linux内核的启动,并且创 ...

  5. Linux内核启动

    Linux内核启动过程概述 Linux的启动代码真的挺大,从汇编到C,从Makefile到LDS文件,需要理解的东西很多.毕竟Linux内核是由很多人,花费了巨大的时间和精力写出来的.而且直到现在,这 ...

  6. 《linux内核设计与实现》读书笔记第一、二章

    第一章 Linux内核简介 1.1 Unix的历史 1971年,Unix被移植到PDP-11型机中. 1973年,Unix操作系统用C语言改写——为Unix系统的广泛移植铺平了道路. 1977年,伯克 ...

  7. linux内核期中总结

    20135132陈雨鑫 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000  ...

  8. Linux内核分析之理解进程调度时机跟踪分析进程调度与进程切换的过程

    一.原理分析 1.调度时机 背景不同类型的进程有不同的调度需求第一种分类I/O-bond:频繁的进行I/O:通常会花费很多时间等待I/O操作的完成CPU-bound:计算密集型:需要大量的CPU时间进 ...

  9. 【转载】linux内核启动android文件系统过程分析

    主要介绍linux 内核启动过程以及挂载android 根文件系统的过程,以及介绍android 源代码中文件系统部分的浅析. 主要源代码目录介绍Makefile (全局的Makefile)bioni ...

随机推荐

  1. 【Neural Network】林轩田机器学习技法

    首先从单层神经网络开始介绍 最简单的单层神经网络可以看成是多个Perception的线性组合,这种简单的组合可以达到一些复杂的boundary. 比如,最简单的逻辑运算AND  OR NOT都可以由多 ...

  2. 基于Xtrabackup备份集来恢复某个误删除的表(drop)

      Preface       Yesterday,I've demonstratated how to rescue a droped and a truncated table based on ...

  3. 【Python】Django学习一:第一个Django程序

    项目开发环境 Python 3.6 Django 1.11.5 Django安装 在开始安装Django之前,Django更新比较频繁,所以要选择合适的版本,这里选择Django1.11.5. pip ...

  4. [译]9-spring bean的生命周期

    spring中bean的生命周期比较容易理解.bean在实例化之后有时需要调用某个初始化方法进行一些初始化的工作.同样的 ,当bean在销毁之前有时需要做一些资源回收的工作. 尽管bean在实例化和销 ...

  5. Python全栈 MySQL 数据库(SQL命令大全、MySQL 、Python调用)

    为了梦想与了信仰    开局一张图   主要三个方面: 1.Linux终端命令 2.MySQL语句 3.Python调用   先删库 再跑路.....                         ...

  6. 聊聊、Mybatis Java注解实现

    AbstractAnnotationConfigDispatcherServletInitializer public class MvcInitializer extends AbstractAnn ...

  7. Java进行身份证格式强校验(准)

    最近做了一个系统,涉及到对用户输入的身份证号进行校验,减少脏数据传入后台处理并降低企业验证成本,因此在接入层便对输入信息做格式强校验. 直接附上代码,可直接使用. package hope.ident ...

  8. 使用python读取mysql数据库并进行数据的操作

    (一)环境的配置 使用python调用mysql数据库要引进一些库. 目前我使用的python版本是python3.6.引进库为pymysql 其他对应的库可以有以下选择: mysqldb,oursq ...

  9. 【POJ 3080 Blue Jeans】

    Time Limit: 1000MSMemory Limit: 65536K Total Submissions: 19026Accepted: 8466 Description The Genogr ...

  10. macOS Sierra下如何打开任何来源(10.12系统)

    转载声明:本站文章无特别说明皆为原创,转载请注明:史蒂芬周的博客, 一定有很多朋友和小子一样,迫不及待的升级到了macOS Sierra,随之而来的是第三方应用都无法打开了,提示无法打开或者扔进废纸篓 ...