前言

日系机因为其畸形的运营商主导加拉帕戈斯制度,导致一般消费者要更新换代手机要付出的金钱并不是很多,很多二手手机流入日本本土中古市场以及回收商。又由于日本离我国很近,这些机子大多流入了国内。在x鱼上,因其良好的性价比,销量还算不错。但因为其差强人意的系统,很多人购买后都想root来提升易用度,可是日系机的防护一概很严格,有些人滥用方法,导致变砖。同时,也避免高谈阔论的伪大神的出现,所以作为倒腾过日系御三家各种平台的root的人类,必须得站出来解释一下!
不管怎么说,夏普京瓷富士通这三家公司都非常热衷于加强手机的安全性,这虽然对一般用户的确是好事,但是对于开发者以及爱倒腾的人来说,这便是个很严重以及很恶心的问题
直接关于日系设备的root的资料其实并不多,主要在2ch以及国内和东欧的付费维修商手上,但是可用的exploit其实有非常多(日系机更ASPL频率不算特别高),只要加以利用并且加上自己的改动,即可拿来使用
另外,在夏普京瓷富士通三家公司中,夏普的有效ROOT资料最多,同时夏普的LSM以及eMMC写保护也是御三家最复杂的,如果你可以自行ROOT掉夏普,则其他两家的ROOT也会变得简单,毕竟大同小异。

Root的基本概要

这个指南大概是给小白们看的普及文章,所以我尽可能从最基本的部分开始写起。Android设备的root,简单来说就是在/system/xbin目录下放一个叫做su的可执行文件,或者修改内核里面的init。就像在Windows中,改动C:\WINDOWS\System32一个道理。
当然你想普通的把文件复制进/system/xbin,那是不可能的,因为/system在正常情况下,是只读的。但是我们可以通过临时ROOT,来让System挂载为可写。
但是厂商的程序员也不是傻子,肯定老早想到了有人会用临时ROOT来往重要分区写数据,所以他们很早就在设备上有了应对方案。比如夏普的miyabi内核安全模块,富士通的fjsec内核安全模块,京瓷的kclsm和selinux_kc内核安全模块。更有甚者,直接在eMMC控制器做写保护,甚至加入厂商自定义的eMMC控制器解除写保护指令。
这样的话,一般的提权顶多给个#,接下来就没有任何操作可以执行了,由于不能写入System,现在的设备也都强制开启安全启动以及内核签名校验,也不能对bootloader或内核动手脚,重启后连#都会消失,这时候,你可能会感觉各种方面好像被完全给堵死了。接下来就来谈谈绕过以及各大LSM的坑。
在我个人的经验来说,御三家的ROOT难度依次为夏普(7.1之前)>富士通>京瓷(7.1之前)>京瓷(7.1之后)>夏普(7.1之后)

各大厂商的坑

SHARP
1.miyabi导致mount和insmod不可使用
2.夏普改动的insmod对于ko的二次检查
3.miyabi限制对/system的写入
4.eMMC控制器对于/system的所在区块的写保护
5.标准eMMC的CLEAR_WRITE_PROT(即CMD_29)指令需要前置OEM指令才可启用
6.setsockopt被miyabi额外保护

KYOCERA
4.4之前
1.kclsm导致mount,insmod不可用
2.insmod硬编码了白名单,仅可insmod白名单中的ko且必须位于init时启动
3.eMMC控制器对于/system的所在区块的写保护
4.实时检查su存在和system的挂载状态,检测到则锁定NFC
4.4之后
1.selinux_kc导致mount,insmod不可用
2.insmod硬编码了白名单,仅可insmod白名单中的ko且必须位于init时启动
3.selinux_kc完全移除了setenforce功能
4.eMMC控制器对于/system的所在区块的写保护
5.实时检查su存在和system的挂载状态,检测到则锁定NFC

FUJITSU
1.fjsec导致mount,insmod,chroot,dd等全系列指令不可用
2.fjsec用户版不具备关闭功能
3.fjsec的全面保护贯穿recovery等
4.Bootloader绕过签名验证后官方系统开机则立即重启

Qualcomm的MSM8k以及SDM平台的启动过程其实比较复杂,但是如果想改动其实并不能改很多,有一部分高通甚至只给了BIN并没有SRC。所以今天就选继PBL后最重要也是能改动的最底层部分,即SBL来做一些分析以及介绍。由于NDA的缘故,其中仅能挑选公开部分代码片段。可能有疏漏,请尽情指正!

启动过程

由于我并不涉及到BP部分的开发,那全程就只从AP的角度做分析以及介绍。
MSM8k_Way_to_Boot_CN.png

SBL的功能

初始化DDR/硬件/加载RPM/加载TrustZone/加载ABL以继续引导

SBL入口

此部分源码位于boot_images/core/boot/secboot3/hw/<MSM_Platform_ID>/sbl1/sbl1.s

IMPORT |Image$$SBL1_SVC_STACK$$ZI$$Limit|
IMPORT |Image$$SBL1_UND_STACK$$ZI$$Limit|
IMPORT |Image$$SBL1_ABT_STACK$$ZI$$Limit|
IMPORT boot_undefined_instruction_c_handler ;导入了外部Symbol
IMPORT boot_swi_c_handler
IMPORT boot_prefetch_abort_c_handler
IMPORT boot_data_abort_c_handler
IMPORT boot_reserved_c_handler
IMPORT boot_irq_c_handler ;PBL传递来的中断请求参数
IMPORT boot_fiq_c_handler ;PBL传递来的快速中断请求参数
IMPORT boot_nested_exception_c_handler
IMPORT sbl1_main_ctl ;!注意此处!此处导入SBL1主要功能
IMPORT boot_crash_dump_regs_ptr

SBL1_MAIN_CTL

此部分主要做初始化DDR的工作
此部分源码位于boot_images/core/boot/secboot3/hw/<MSM_Platform_ID>/sbl1/sbl1_mc.c

/* 初始化DDR部分 */
static boot_ram_init_data_type sbl1_ram_init_data_ddr =
{
  NULL,   //load_rw_base;
  NULL,  //image_rw_base;
  0,        //image_rw_len;
  (uint8*)&Image$$SBL1_DDR_ZI$$Base,  //image_zi_base;
  &Image$$SBL1_DDR_ZI$$ZI$$Length     //image_zi_len;
};
/* 初始化Logger部分,数据传送到SERIAL */
static uint32 sbl_start_time = 0;
static boot_log_init_data boot_log_data =
{
  (void *)SBL1_LOG_BUF_START,
  SBL1_LOG_BUF_SIZE,
  (void *)SBL1_LOG_META_INFO_START,
  SBL1_LOG_META_INFO_SIZE,
  NULL
};
/* 加载SBL1_Config_Table */
#define CPSR_EA_BIT     (1<<8)

extern boot_configuration_table_entry sbl1_config_table[];

SBL1_CONFIG_TABLE

此部分存储了ABL\TrustZone\RPM等Image的相关参数
此部分源码位于boot_images/core/boot/secboot3/hw/<MSM_Platform_ID>/sbl1/sbl1_config.c

extern uint8 qsee_partition_id[]; //QSEE分区ID
extern uint8 rpm_partition_id[]; //Resource Power Manager分区ID
extern uint8 appsbl_partition_id[]; //Application Secondaty BootLoader分区ID
extern uint8 apdp_partition_id[]; //Debug Policy分区ID
extern uint8 devcfg_partition_id[]; //Trust Zone Config分区ID

boot_configuration_table_entry sbl1_config_table[];

此文就是一篇概览,也就是大概阅读了一下源码写下的随笔,同时由于惧怕高通的NDA,源码也不能放出太多,到此为止吧!

设备INFO

项目参数
CPU4 x Cortex-A7 1.3Ghz
芯片组Mediatek MT6580
GPUMali-400MP
ROM8GB
RAM1GB
Android版本6.0
内核版本3.18.19
电池2000mAh
显示960x480 5寸 IPS-TFT

感谢
GitHub - TeamWin/Team-Win-Recovery-Project

更新日志
首次发布

截图
P7_TWRP_Screenshoot.png

下载
数据丢失

Bug

Bug代号Bug详情发现时间
TWRP-P7-BUG-00exFAT访问时不支持UTF-8字符集2019/11/29

设备信息

项目参数
CPU2 x Kryo 2.2Ghz + 2 x Kryo-LP 1.6Ghz
芯片组Qualcomm Snapdragon 820 (MSM8996)
GPUAdreno 530
ROM32GB
RAM3GB
Android版本6.0.1->7.0->8.0.0
内核版本3.18.20->3.18.31->3.18.71
电池3000mAh
显示1920x1080 5.3寸 IGZO
主相机22.60MP
副相机5MP
运营商日本-au/SoftBank 中国-开放

感谢
Qualcomm CodeAurora:Code Aurora
Team Win Recovery Project:GitHub - TeamWin/Team-Win-Recovery-Project
SHARP OSS:SHV34|オープンソースソフトウェア|開発者向け情報|AQUOS:シャープ

开源
saga0324/android_device_sharp_xx3

更新日志
首次发布

截图
SHV34_TWRP_Screenshot.png

下载
(不公表,如果需要请E-Mail联系)

BUG跟踪

Bug代号Bug详情发现时间
TWRP-XX3-BUG-00仅通过USB充电时才更新电池百分比2018/11/09
TWRP-XX3-BUG-01MTP服务易crash2018/11/09