iOS和iPadOS设备启动到打开App

一、设备启动过程

启动过程每个步骤包含的组件都经 Apple 加密签名以启用完整性检查,因此只有在验证信任链后,启动才能继续;
这些组件包括引导载入程序、内核、内核扩展项和蜂窝网络基带固件;
这一安全启动链的设计旨在验证软件的最底层不被篡改;
iOS 或 iPadOS 设备开机后,其应用程序处理器会立即执行只读内存(称为 Boot ROM)中的代码;
BootROM是设备的处理器在首次启动时所执行的第一个代码;
作为处理器不可分割的一部分,Apple 或攻击者均无法修改;
这些不可更改的代码(称为硬件信任根)是在制造芯片时设定的隐式受信任代码;
Boot ROM 代码包含 Apple 根证书颁发机构 (CA) 公钥,该公钥用于验证 iBoot 引导载入程序是否经过 Apple 签名,以决定是否允许其载入;
这是信任链中的第一步,信任链中的每个步骤都会检查下一步骤是否已经过 Apple 的签名;
iBoot适用于所有 Apple 设备的 2 级启动载入程序;
载入 XNU 以作为安全启动链一部分的代码;
iBoot 可由底层引导载入程序载入或直接由 Boot ROM 载入,具体取决于片上系统 (SoC) 的版本;
iBoot 完成任务后,会验证和运行 iOS 或 iPadOS 内核;
对于搭载 A9 或更早 A 系列处理器的设备,Boot ROM 还会载入和验证底层引导载入程序 (LLB),之后会依次载入和验证 iBoot;
LLB在具有两步启动架构的 Mac 电脑上,LLB 包含由 Boot ROM 调用的代码,该代码随后会载入 iBoot,成为安全启动链的一环;
无法载入或验证以下阶段时,处理方式因硬件而异:
Boot ROM 无法载入 LLB(较旧的设备):设备固件升级 (DFU) 模式,即设备的 Boot ROM 代码在等待通过 USB 进行恢复时所处的模式;
在 DFU 模式下,设备为黑屏,但在连接到运行 iTunes 或“访达”的电脑时,会出现以下提示:“iTunes(或‘访达’)检测到一个处于恢复模式的(iPad、iPhone 或 iPod touch)。用户必须先恢复此(iPad、iPhone 或 iPod touch),然后才能将它与 iTunes(或‘访达’)配合使用;
LLB 或 iBoot:恢复模式,该模式用于在无法识别用户设备的情况下恢复许多 Apple 设备,使用户可以重新安装操作系统;
出现任一情况时,设备都必须通过 USB 连接到“访达”(macOS 10.15 或更高版本)或 iTunes(macOS 10.14 或更低版本),并恢复为出厂默认设置;
安全隔区使用启动进程寄存器 (BPR) 来限制不同模式中对用户数据的访问,在进入以下模式前会对 BPR 进行更新:
BPR是一组片上系统 (SoC) 硬件旗标,软件可使用其跟踪设备进入的启动模式,如设备固件更新 (DFU) 模式和恢复模式;
启动进程寄存器旗标经设定后就不可清除;
这样就允许后续软件获得系统状态的可信指示;
DFU 模式:由搭载 Apple A12 或后续型号 SoC 的设备上的 Boot ROM 设定;
恢复模式:由搭载 Apple A10、S2 或后续型号 SoC 的设备上的 iBoot 设定;
对于可接入蜂窝网络的设备,蜂窝网络基带子系统使用已签名的软件以及由基带处理器验证的密钥来执行额外的安全启动过程;
安全隔区还会执行安全启动过程来检查其软件 (sepOS) 是否已经过 Apple 验证和签名。

二、App代码签名过程

在 iOS 和 iPadOS 中,Apple 会通过强制性代码签名和严格的开发者签名等方式确保 App 安全性。

强制性代码签名

iOS 或 iPadOS 内核启动后,它将控制哪些用户进程和 App 可以运行;
为帮助确保所有 App 均来自批准的已知来源并且未被篡改,iOS 和 iPadOS 要求所有可执行代码均使用 Apple 颁发的证书进行签名;
设备附带的 App(如“邮件”和 Safari 浏览器)由 Apple 签名;
第三方 App 也必须使用 Apple 颁发的证书进行验证和签名;
强制性代码签名将信任链的概念从操作系统扩展至 App,并帮助防止第三方 App 载入未签名的代码资源或使用经 App 自身修改代码。

开发者如何给其 App 签名

开发者可通过证书验证(通过 Apple 开发者计划)给其 App 签名;
他们还可以在其 App 中嵌入框架,并使用 Apple 颁发的证书(通过团队标识符字符串)对代码进行验证;
证书验证:若要在 iOS 或 iPadOS 设备上开发并安装 App,开发者必须向 Apple 注册并加入 Apple Developer Program(Apple 开发者计划);
Apple 首先验证每个开发者(无论是个人还是企业)的真实身份,然后再颁发证书;
开发者可使用该证书对 App 进行签名,并将其提交至 App Store 进行分发;
因此,App Store 中的所有 App 都是由身份可识别的个人或组织提交的,由此防止恶意 App 的创建;
此外,这些应用程序都经过 Apple 的严格审核,帮助确保它们通常可以按照所述的方式运行,并且没有明显的错误或其他明显的问题;
除了已经讨论过的技术,这一处理过程还会让用户对所购 App 的品质更加放心;
代码签名验证:iOS 和 iPadOS 允许开发者将框架嵌入其 App 中,使它可被 App 本身使用,也可被 App 中嵌入的扩展项使用;
为保护系统并防止其他 App 在其地址空间中载入第三方代码,系统将为启动时所有链接到进程的动态资源库执行代码签名验证;
此验证过程通过团队标识符 (Team ID) 完成;
团队标识符提取自 Apple 颁发的证书,是由 10 个字符组成的字母数字串,例如 1A2B3C4D5F;
程序可链接到系统自带的任何平台资源库,也可以链接到代码签名中具有与主可执行文件相同团队标识符的资源库;
因为作为系统一部分发布的可执行文件不具有团队标识符,所以它们只能链接到随系统本身发布的资源库。

验证企业内部专有 App

符合条件的企业也可以编写供组织内部使用的企业内部专有 App,并将其分发给员工;
企业和组织可以申请加入 Apple Developer Enterprise Program(ADEP,Apple 开发者企业计划);
有关更多信息以及若要检查资格要求,请参阅 Apple Developer Enterprise Program(Apple 开发者企业计划)网站;
组织成为 ADEP 的成员后,便可以注册以获得一个预置描述文件,该描述文件允许企业内部专有 App 在其授权的设备上运行;
用户必须安装预置描述文件才能运行这些 App;
这有助于确保只有组织的目标用户能够将 App 载入到其 iOS 和 iPadOS 设备上;
通过移动设备管理 (MDM) 安装的 App 为隐式受信任 App,因为组织与设备之间的关系已经确立;
否则,用户必须在“设置”中批准 App 的预置描述文件;
组织还可以限制用户批准来自未知开发者的 App;
任何企业内部专有 App 首次启动时,设备必须收到 Apple 的肯定询证,表明允许该 App 运行。

App Store中的App签名验证

开发者将App上传到Apple服务器后,Apple会使用私钥对App进行数字签名;
用户从App Store下载到设备后,设备会使用Boot ROM中的公钥验证签名确定App是否经过Apple认证且未篡改。

Xcode安装的App签名验证

可以通过钥匙串从CA生成一对公私钥,申请为Apple developer后,可以在开发者后台上传CertificateSigningRequest文件(Mac本地生成的公钥文件),Apple会使用私钥对Mac公钥进行签名并生成一个证书(Mac公钥和签名信息),在开发阶段,App安装到设备上时,Xcode使用Mac私钥对App进行签名,App包内的数据包括App原始数据、Mac私钥对App的签名信息、包含Mac公钥的证书,设备会使用Boot ROM中的公钥会解密包含Mac公钥的证书获得Mac公钥,再通过Mac公钥验证App签名,两次验证通过则通过Apple的允许。

二、App启动过程

解析Info.plist

加载相关信息,例如如闪屏;
沙箱建立(内存欺骗)、权限检查。

Mach-O(可执行文件)加载

寻找合适当前CPU架构的部分;
加载所有依赖的Mach-O文件(递归调用Mach-O加载的方法);
定位内部、外部指针引用,如字符串、函数等;
执行声明为__attribute__((constructor))的C函数;
加载类拓展Category中的方法;
C++静态对象加载、调用ObjC的+load函数。

程序执行

调用main();
调用UIApplicationMain();
调用applicationWillFinishLaunching。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/593177.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python数据挖掘与机器学习实践技术应用

近年来,Python编程语言受到越来越多科研人员的喜爱,在多个编程语言排行榜中持续夺冠。同时,伴随着深度学习的快速发展,人工智能技术在各个领域中的应用越来越广泛。机器学习是人工智能的基础,因此,掌握常用…

qt .pro工程转vs工程

1. 新建vs空项目或者Qt Console Application; 2. 扩展 -》Qt VS Tools -》Open Qt Project (.pro) 打开对应的pro文件即可将.pro工程转成vs工程; 注意: (1)转成的vs工程在pro文件同级目录下,双击打开vcx…

网络通信(7)-TCP协议解析

目录 一、定义 二、主要特点 三、报文格式 四、工作方式

科兴未来|中国北京 · HICOOL 2024全球创业大赛招募启动

HICOOL 2024全球创业大赛正式启动,我们诚挚地邀请来自世界各地的创业项目报名参赛,在全球舞台上展示自己,加速成长。 一、参赛收获 大赛将为获奖项目提供包括人才落户、子女教育、医疗保障等在内的创业政策支持。此外,参赛项目将…

桶式移位器

前言 本篇文章介绍CPU的核心部件之一:桶式移位器,简称BS,英文全称为Barrel Shifter 桶式移位器最大的特点就是能在单周期内完成多种方式,各种位数的移位操作 常见的移位操作 常见的移位操作种类如下: 算术右移 是指…

实验笔记之——基于windows复现Instant-NGP

之前博客对NeRF-SLAM进行了调研,本博文先复现一下Intant-NGP。 学习笔记之——NeRF SLAM(基于神经辐射场的SLAM)-CSDN博客文章浏览阅读851次,点赞22次,收藏21次。NeRF 所做的任务是 Novel View Synthesis(…

在前端开发中,如何优化网站的加载速度?

在前端开发中,网站的加载速度是一个至关重要的因素,它直接影响着用户体验和搜索引擎优化(SEO)。一个快速、响应迅速的网站不仅能让用户更加满意,还能提高网站的排名和流量。那么,如何优化网站的加载速度呢&…

计算机网络面试题总结

总结自Network | JavaGuide(Java面试 学习指南) 什么是OSI7层模型? 什么是TCP/IP 四层模型? 为什么网络要分层? 应用层有哪些常见的协议? 传输层有哪些常见的协议? 网络层有哪些常见的协议? 从输入…

python 基础教程一(序列的基础知识)

#为单行注释 多行注释为三个‘开头和结尾 常用内置函数 pow函数 pow(x,y,[z])求x的y次幂 如果z不省略对z进行%运算 abs函数求绝对值 divmod(x,y) 同时输出商和余数 **round(x,[d])**函数会把浮点数变为最接近的整数值,会四舍五入。x为浮点数,d为保留几…

el-radio-button自适应充满盒子的写法

业务场景&#xff1a;当盒子较宽时&#xff0c;希望 el-radio-button 自适应充满盒子。 el-radio-button 自适应充满盒子的写法 <el-form :inline"true" :model"searchForm"><el-form-item style"display: flex; align-items: center;"…

python moviepy 图文批量合成带字幕口播视频

最近在研究将图片和文本批量合成为带字幕口播视频 主要是基于python的moviepy库 from generator import audio, pics, subs, videodef main():texts_input examplepics_input example# 图片分辨率预处理pics.adjust(pics_input)# 文字转语音audio.text_to_audio(texts_inpu…

【Java EE初阶七】多线程案例(阻塞队列与生产者消费者模型)

1. 阻塞队列 队列是先进先出的一种数据结构&#xff1b; 阻塞队列&#xff0c;是基于队列&#xff0c;做了一些扩展&#xff0c;适用于多线程编程中&#xff1b; 阻塞队列特点如下&#xff1a; 1、是线程安全的 2、具有阻塞的特性 2.1、当队列满了时&#xff0c;就不能往队列里…

算法分析与设计 第七次理论作业

算法分析与设计 第七次理论作业 文章目录 算法分析与设计 第七次理论作业一. 单选题&#xff08;共2题&#xff0c;20分&#xff09;二. 填空题&#xff08;共8题&#xff0c;80分&#xff09; 一. 单选题&#xff08;共2题&#xff0c;20分&#xff09; (单选题) 回溯法在搜索…

串口通信要点解析

目录 简介&#xff1a; UART 协议解析&#xff1a; 串口协议工作过程&#xff1a; 简介&#xff1a; 串行通信协议包括&#xff1a; UART通用异步收发传输器 (Universal Asynchronous ReceiverTransmitter) 是一种串行异步收发协议 (异步是指通信双方使用各自的时钟控制数据…

fineBI web组件传参

1、fineBI web组件传参 1.1、 Web组件- FineBI帮助文档 FineBI帮助文档1. 概述1.1 版本FineBI 版本HTML5移动端展现功能变动6.0--V11.0.83web组件适配移动端效果优化6.0.13-web组件支持传递参数 ${过滤组件https://help.fanruan.com/finebi/doc-view-143.html 1.2、自己做的例…

异常、反射、注解面试题

1. throw 和 throws 的区别&#xff1f; 参考答案 位置不同1. throws 用在函数上&#xff0c;后面跟的是异常类&#xff0c;可以跟多个&#xff1b;而 throw 用在函数内&#xff0c;后面跟的是异常对象。 功能不同&#xff1a;1. throws 用来声明异常&#xff0c;让调用者只知…

分布式(6)

目录 26.雪花算法如何实现的&#xff1f; 27.雪花算法有什么问题&#xff1f;有哪些解决思路&#xff1f; 28.有哪些方案实现分布式锁&#xff1f; 29.基于数据库如何实现分布式锁&#xff1f;有什么缺陷&#xff1f; 30.基于Redis如何实现分布式锁&#xff1f;有什么缺陷&…

Linux---all

Linux常用命令&#xff1a; Linux常用命令-CSDN博客 Linux命令大全(超详细版)_linux命令行大全-CSDN博客Linux常用命令大全&#xff08;非常全面&#xff09;-CSDN博客Linux 命令大全&#xff08;看这一篇就足够&#xff09;_linux命令-CSDN博客Linux常用命令大全——赶紧收藏…

如何开发属于自己的小程序?

随着移动互联网的快速发展&#xff0c;小程序已成为一种不可忽视的力量。对于许多企业和个人而言&#xff0c;拥有一个属于自己的小程序不仅能提高品牌曝光度&#xff0c;还能带来实实在在的收益。那么&#xff0c;如何开发属于自己的小程序呢&#xff1f;本文将为你揭秘这一过…

ACWing--寒假每日一题代码笔记(1.1)

4993. FEB--&#xff08;python) 4993. FEB - AcWing题库 n int(input()) # print(n) slist(input()) # print(n) # 情况一&#xff1a; # xxxxxx# 合并两个公差为2的等差数列 公差仍为 2 # 合并公差分别为1和2 的等差数列 公差为1 if (s.count(F)n):print(n)for i in range…