1、bootloader是什么?

简单地说,bootloader 就是在操作系统内核运行之前运行的一段小程序。通过这段小程序,我们可以初始化硬件设备、建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统内核准备好正确的环境。

Android系统基于Linux,所以bootloader部分也是与传统的嵌入式设备上运行的Linux没有什么区别。由于除Google外的大部分Android厂商都没有提供bootloader的源代码,所以分析手机设备的bootloader需要使用逆向工程的手段,当然由于有了Google官方的开源bootloader代码做参考,能让分析工作轻松不少。本文中使用的分析工具为IDA 6.5,针对的手机设备为N9006,固件版本为N9006ZCUDMK2。

2、bootloader典型结构

这部分会以高通MSM8960为例子介绍下Bootloader的典型结构。

高通MSM8960中包含多个运算单元,分别负责引导过程中的不同功能,sbl1的代码负责加载sbl2,sbl2加载tz和sbl3,sbl3加载apppsbl,appsbl加载HLOS(基带)。

图1 SecureBoot 3.0 的Code Flow
 
图2 MSM8960引导过程简化流程图

3、Note3的bootloader结构分析

国行版Note3(N9006)使用的CPU是MSM8974,它的bootloader结构与典型的MSM8960差不多,最大的区别就是把sbl1,sbl2,sbl3整合进了一个文件sbl1中,TrustZone和APPSBL都由sbl1进行验证和加载,以下为几个主要功能的加载代码分析。
      sbl1的功能是对硬件进行初始化并加载其他模块,需要加载的模块信息按顺序保存在sbl1中,对应每个模块的数据是一段大小为0x64字节的模块信息数据内,sbl1中有一个循环负责验证和加载所有需要的其他模块(tz,rpm,wdt,appsbl),加载代码会根据模块信息内的数据调用不同的加载器加载和验证的代码,具体代码如下图。

图3 sbl1中循环加载全部模块的代码

图4 sbl1中对待加载模块进行验证

图5 TZ模块信息数据

图6 APPSBL模块信息数据

固件包里的tz.mbn是加载在TrustZone中的模块,模块格式为elf,这个模块中的代码和系统其他模块代码运行在互相隔离的区域内,权限也比其他模块更高,三星KNOX的很多底层安全特性也是在这部分中实现,关于TrustZone的更多资料可以参考arm官方的说明。

固件包里的aboot.mbn就是APPSBL模块,模块格式为bin,文件最前面的0x28字节的头部描述了bin的加载地址等信息,后面的数据就是实际加载到内存中的映像,整个bootloader中这个模块的代码量最大(很大一部分是openssl的代码),linux内核的验证和加载(正常启动和Recovery模式),ODIN模式等等代码都包含在这个模块内。

图7 aboot.mbn文件头

图8 根据按键和共享内存中的数据确定引导模式

图9 三星特有的ODIN刷机模式代码

4、Note3的bootloader中KNOX系统的底层代码初步分析

Note3提供了一个企业安全套装KNOX,这个系统包含了底层的Customizable Secure Boot和TrustZone-based Integrity Measurement Architecture(TIMA,目前为2.0版本),系统层的SecurityEnhancements for Android(SE-Android)和应用层的Samsung KNOX Container,Encrypted File System(EFS),Virtual Private Network(VPN),其中Customizable Secure Boot和TIMA的代码包含在Bootloader的aboot.mbn,tz.mbn,NON-HLOS.bin中,功能为保障加载的内核在加载时和运行期的完整性。

通过前面的分析,我们已经知道了tz.mbn和aboot.mbn在加载时已经由sbl1验证过完整性,tz.mbn加载后会在CPU的安全环境下运行,从高权限的隔离区域内对系统的完整性进行监控,而负责加载android内核的aboot.mbn中包含对内核的完整性检测,三星在bootloader每一部分的结尾都会加上自己的签名,加载前会对签名进行验证,以保障系统未被修改过。

图10  tz.mbn中初始化TIMA系统的的代码

图11 aboot.mbn中对内核是否使用SEANDROID进行验证

当任何一部分检测代码发现系统异常状况后,就会调用SMC指令通知TrustZone中运行的TIMA系统设置fuse为系统完整性被破坏,此fuse数据一旦被设置后没有办法被重置,系统也无法再次进入KNOX系统。
 
图12 加载内核前对内核签名和TIMA的测点进行验证
 
图13 系统完整性检测失败后设置fuse值

当以上所有检测都通过后,bootloader会把内核复制到指定的内存地址并跳到内核的入口继续执行,到此,就进入了系统内核代码的范畴,bootloader的使命也就完成了,跳到linux内核入口的代码见图14。

图14 内核加载和校验完成后跳到内核的入口点继续执行

另外,除了这两个模块外Modem固件相关的NON-HLOS.bin中也有大量TIMA系统相关的文件,由于TIMA系统包含大量硬件相关代码(使用三星猎户座CPU的N900中TIMA系统的实现与高通CPU的N9006差别很大),如果需要进行进一步的分析TIMA在modem中的行为,需要对TrustZone,modem工作方式等有更多了解。

图15 NON-HLOS.bin中包含的大量TIMA相关文件 (全文来自网络,有删改)

高通、猎户机型Android典型bootloader分析相关推荐

  1. Qualcomm 高通芯片组与Android音频系统缺陷测评分析

    转自:http://www.soomal.com/doc/10100002164.htm Qualcomm高通公司是目前Android智能手机上最为知名的ARM架构的处理器和芯片方案硬件提供商,高通公 ...

  2. 【高通SDM660平台 Android 10.0】(10) --- Camera Sensor lib 与 Kernel Camera Probe 代码分析

    [高通SDM660平台 Android 10.0]Camera Sensor lib 与 Kernel Camera Probe 代码分析 一.libmmcamera_imx258.so 代码分析 1 ...

  3. 【高通SDM660平台 Android 10.0】(19) --- Camera_focus、Camera_snapshot、volume_up 按键工作原理分析

    [高通SDM660平台 Android 10.0]19 --- Camera_focus.Camera_snapshot.volume_up 按键工作原理分析 一. DTS代码配置 二. Kernel ...

  4. 【高通SDM660平台 Android 10.0】(12) --- Camera Chromatix 代码分析

    [高通SDM660平台 Android 10.0]Qcom Camera Daemon 代码分析 一.chromatix_imx258_lc898217xc 目录 1.1 例:imx258_lc898 ...

  5. 高通芯片刷机我的分析理解(启动分析故障分析)

    安卓手机高通芯片刷机我的分析理解高通芯片手机是市面上比较流行的手机系列,例如:小米系列大部分机型,三星系列部分高端机型,中兴努比亚系列,联想手机高端机型,一加手机全部机型,还有华为手机一小部分等等吧. ...

  6. 【高通SDM660平台 Android 10.0】(13) --- Camera ISP 之 数字成像系统介绍

    [高通SDM660平台 Android 10.0] --- Camera ISP 之 数字成像系统介绍 一.成像系统的组成 1.1 视角 1.2 曝光 1.3 感光度 ISO 1.4 光源 1.5 光 ...

  7. 【高通SDM660平台 Android 10.0】(14) --- Camera ISP

    [高通SDM660平台 Android 10.0]--- Camera ISP 一.Camera ISP 与 DSP 区别 1.1 名词解释 1.2 功能解释 1.3 手机摄像头ISP是独立好还是内置 ...

  8. 高通平台(Qualcomm) Android 10 /11/12 user版本默认打开adb 调试小结

    1.流程 USB插入接收广播授权->建立adb连接服务->执行adb 命令 2.adb相关属性 ro.secure = 0 开启root权限 ro.adb.secure = 1 1开启ad ...

  9. 高通 虚拟化 linux android,RAITE Hypervisor介绍

    RAITE Hypervisor介绍 Raite Hypervisr 软件架构 中瓴智行自主开发的RAITE Hypervisor是基于微内核的高性能.强实时Type-1型嵌入式Hypervisor, ...

最新文章

  1. Fabric动态增加组织【资料】
  2. 企业主要财务指标有哪些
  3. caffe使用过程+digits在windows下的安装和运行
  4. java实验报告13答案_(完整版)Java程序设计实验报告
  5. 百行征信大揭秘,字段中间找关系
  6. DEV CPP中使用Clang
  7. nginx的介绍和安装
  8. 高效能人士的七个习惯读后感与总结概括-(第一章)
  9. java 读取485_java通信 485
  10. 电子电路学习笔记(15)——晶振
  11. 硬石类山水盆景的制造技法
  12. 域名已注册好,如何做网站?
  13. 将一个对象转换成数组
  14. kinit 某个账户,提示 Clients credentials have been revoked
  15. 古希腊数学家把数1,3,6,10,15,21,...叫做三角形数,它有一定的规律性。若把第一个三角形数记为a1,第二个三角形数记为a2,...,第n个三角形数记为an,计算a1+a2,a2+a3
  16. 深度丨年终盘点:2015年人工智能的五大关键词
  17. ios 不能触发click事件
  18. DVWA 不跳转_利用url跳转漏洞冒充公安局官网的骚操作
  19. 使用virtualenv搭建Python下的Flask开发环境,ubu测试有效
  20. 制作gltf动态夜景模型

热门文章

  1. 053_Unicode字符官方标准四
  2. Android Studio 小技巧/快捷键 合集
  3. Photoshop CC2018软件安装资料及教程
  4. java比较运算_Java比较运算符
  5. 线程安全的map_ThreadLocal | 线程本地存储
  6. 用css如何写正方体,css正方体实现--(transform练习)
  7. taro引入f2图表_Package - taro-f2
  8. java规则计算_java实现的霍纳规则的多项式计算
  9. 读取ppt并存入数据库_[导入]实时数据库理论与技术演讲PPT
  10. jquery删除数组中的某个元素下标越界_Java数据结构和算法(二)—数组