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。
相关文章:
iOS和iPadOS设备启动到打开App
一、设备启动过程 启动过程每个步骤包含的组件都经 Apple 加密签名以启用完整性检查,因此只有在验证信任链后,启动才能继续; 这些组件包括引导载入程序、内核、内核扩展项和蜂窝网络基带固件; 这一安全启动链的设计旨在验证软件的…...
【INTEL(ALTERA)】如何使用 Quartus命令行导入 .qud 文件?
说明 英特尔 Quartus Prime 软件用户定义的设备文件 (.qud) 包含允许在安装 英特尔 Quartus Prime 软件之间传输设备的设备信息。 要导入 .qud 文件中定义的设备,请使用 英特尔 Quartus Prime 软件中的 quartus_cpf 命令行工具,…...
js创建服务器,以及对接口的理解和创建
// 创建服务 const app http.createServer((req, res)>{ // 设置给前端返回信息的字符编码 res.setHeader(content-type, text/html; charsetutf-8) let address req.url.split(?)[0] //首先创建一个数组,后面把它的数据放在JSON文件 let…...
【Bootstrap学习 day7】
Bootstrap按钮 按钮样式 使用.btn相关类实现 <button type"button" class"btn">基本按钮</button> <button type"button" class"btn btn-primary">主要按钮</button> <button type"button" cl…...
Zookeeper无法启动,报“Unable to load database on disk”
转载说明:如果您喜欢这篇文章并打算转载它,请私信作者取得授权。感谢您喜爱本文,请文明转载,谢谢。 问题描述: 测试环境部署zookeeper的服务器磁盘满了,引起服务异常,将zookeeper进程杀掉之后&…...
【Web2D/3D】CSS3的2D/3D转换、过渡、动画(第一篇)
1. 前言 本篇开始介绍Web2D和3D相关基础知识,会从CSS3的2D/3D转换、过渡、动画,讲到Canvas 2D图形绘制,再到SVG,最后到WebGL。 坐标系:左上点是坐标原点(0,0),x轴正方向向右,y轴正方向向下&…...
uView NumberBox 步进器
该组件一般用于商城购物选择物品数量的场景 注意:该输入框只能输入大于或等于0的整数 #平台差异说明 App(vue)App(nvue)H5小程序√√√√ #基本使用 通过v-model绑定value初始值,此值是双向绑定的&…...
三菱plc的点动控制循环(小灯闪烁,单控气缸循环)
以为前一段时间小编做了一个气缸定时循环的程序,根据程序有不足之处,所以小编写下这篇文章,将网络上的plc小灯控制进行总结!如果对你有帮助,不要忘了点赞收藏!如果有更加好的梯形图,欢迎评论&am…...
学习Go语言Web框架Gee总结--http.Handler(一)
学习Go语言Web框架Gee总结--http.Handler http-base/go.modhttp-base/main.gohttp-base/gee/gee.gohttp-base/gee/go.mod 网站学习来源:Gee 代码目录结构: http-base/go.mod //指定当前模块的名称为 "example" module example//指定当前模…...
react+redux+antd-mobile 之 记账本案例
1.环境搭建 //使用CRA创建项目,并安装必要依赖,包括下列基础包 //1. Redux状态管理 - reduxjs/toolkit 、 react-redux //2. 路由 - react-router-dom //3. 时间处理 - dayjs //4. class类名处理 - classnames //5. 移动端组件库 - antd-mobile //6. 请…...
Day22
Day22 一,生产者消费者模型 1.1,单个生产者单个消费者 public class Test01 {/*** 知识点:生产者消费者模型 - 单个生产者单个消费者* * 分析:* 产品类 - Phone:属性(brand,price)* 生产者线程 - Producer* 消费者线程 - Consumer* …...
Windows下linux 子系统 WSL2怎样使用usb串口(USBIPD-win4.0.0)
Windows下linux 子系统 WSL2怎样使用usb串口(USBIPD-win4.0.0) 一、widows安装二、ubuntu安装三、widows配置四、wsl配置 一、widows安装 https://github.com/dorssel/usbipd-win 直接下载最新版本的msi文件安装 二、ubuntu安装 sudo apt install lin…...
飞腾Ubantu22.04.3安装OpenNebula测试
1.概述 因OpenneBula官方镜像源只有AMD架构的镜像包不存在ARM的镜像包,借此用源码编译进行测试。 2.官网github地址 下载解压存放在服务器上: https://github.com/OpenNebula/minione/blob/master文件目录: 3.安装依赖包 sudo apt -y …...
gookit/color - Go语言命令行色彩使用库教程
gookit/color - Go语言命令行色彩使用库教程 1.安装2.基础颜色(16-color)3.256色彩/RGB风格 1.安装 go get github.com/gookit/color2.基础颜色(16-color) 提供通用的API方法:Print Printf Println Sprint Sprintf 1、例如: color.Yellow.Println(&q…...
python弹奏《起风了》
代码是很大的! 其实就是python用ctypes调用Win API import ctypes import threading import time winmm = ctypes.windll.winmmclass Scale:Rest = 0C8 = 108B7 = 107A7s = 106A7 = 105G7s = 104G7 = 103F7s = 102F7 = 101E7 = 100D7s = 99D7 = 98C7s = 97C7 = 96B6 = 95A6s…...
Linux---all
Linux常用命令: Linux常用命令-CSDN博客 Linux命令大全(超详细版)_linux命令行大全-CSDN博客Linux常用命令大全(非常全面)-CSDN博客Linux 命令大全(看这一篇就足够)_linux命令-CSDN博客Linux常用命令大全——赶紧收藏…...
前端中级算法题
前端中级算法题 反转字符串 编写一个函数,接受一个字符串作为输入,并返回反转后的字符串。 示例: function reverseString(str) {return str.split().reverse().join(); }reverseString(hello); // 输出: olleh 找出数组中的最大值 编写一个函…...
Ant Design Vue 编译后的网页特点是什么,怎么确认他是用的前端 Ant Design Vue 技术栈的呢?
Ant Design Vue 是一个前端 UI 框架,使用 Vue.js 构建。它包含了大量的预设样式和组件,如按钮、表单、表格等,可以帮助开发者快速构建出优雅且功能丰富的网页。但是,要确定一个编译后的网页是否使用了 Ant Design Vue,…...
python | PYTHON正则表达式
操作符说明实例.表示任何单个字符[]字符集,对单个字符给出取值范围[abc]表示a、b、c,[a-z]表示a到z单个字符[^ ]非字符集,对单个字符给出排除范围[^abc]表示非a或b或c的单个字符*前一个字符0次或无限次扩充abc* 表示ab,abc&#x…...
为什么大学c语言课不顺便教一下Linux,Makefile
为什么大学c语言课不顺便教一下Linux,Makefile,git,gdb等配套工具链呢? 在开始前我有一些资料,是我根据自己从业十年经验,熬夜搞了几个通宵,精心整理了一份「Linux的资料从专业入门到高级教程工具包」&…...
Go后端开发 -- main函数 变量 常量 函数
Go后端开发 – main函数 & 变量 & 常量 & 函数 文章目录 Go后端开发 -- main函数 & 变量 & 常量 & 函数一、第一个main函数1.创建工程2.main函数解析 二、变量声明1.单变量声明2.多变量声明 三、常量1.常量的定义2.优雅的常量 iota 四、函数1.函数返回…...
2023/12/30 c++ work
定义一个Person类,私有成员int age,string &name,定义一个Stu类,包含私有成员double *score,写出两个类的构造函数、析构函数、拷贝构造和拷贝赋值函数,完成对Person的运算符重载(算术运算符、条件运算…...
ctfshow——文件上传
文章目录 文件上传思路web 151web 152web 153知识点解题 web 154web 155web 156web 157web 158web 159web160web 161 文件上传思路 web 151 打开页面显示:前台校验不可靠。说明这题是前端验证。 右键查看源代码,找到与上传点有关的前端代码:…...
【RocketMQ每日一问】RocketMQ SQL92过滤用法以及原理?
1.生产端 public class SQLProducer {public static int count 10;public static String topic "xiao-zou-topic";public static void main(String[] args) {DefaultMQProducer producer MQUtils.createLocalProducer();IntStream.range(0, count).forEach(i -&g…...
Go语言中的包管理工具之Go Path的使用
GoLang 中常用的包管理的方式 1 )概述 常用的有三种 Go PathGo VendorGo Modules 2 )发展历程 早期go的包管理存在很大缺陷,甚至可以说没有官方统一的包管理工具 一方面官方在努力发布一些实验性的包管理工具。同时也出现了很多社区开发…...
cocos creator(2.4.7版本) webview 可以在上层添加UI控件
实现原理:cocos本身在平台中属于view,所以可以把webview放在底层,以达到目标。 实现过程:参考 cocos creator(2.4.7版本) videoplayer 可以在上层添加UI控件() 需要增加以下过程: …...
2023 年四川省职业院校技能大赛“信息安全管理与评估”样题
2023 年四川省职业院校技能大赛(高等职业教育) “信息安全管理与评估”样题 竞赛需要完成三个阶段的任务,分别完成三个模块,总分共计 1000分。三个模块内容和分值分别是: 第一阶段:模块一 网络平台搭建与设…...
ubuntu2204,mysql8.x安装
ubuntu 2204, MySQL8.x安装 sudo apt-get update sudo apt-get upgrade# 习惯性的先设置一下时区,这里我使用东八区 date -R # 若发现时间正常则无需设置tzselect# 依次选择 4 -> 10 -> 1 -> 1cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtimedate -R# 同步时间…...
CG Magic分享云渲染和本地渲染之间的区别有什么?
无论是效果图渲染还是影视渲染,对于3D设计师来说都是常见的渲染方式就是云渲染和本地渲染。 本地电脑渲染是指将渲染任务分配给本地计算机进行处理,而云渲染是指将渲染任务上传至云端服务器进行处理。 对于一些初入行业的新手朋友来说,会在想…...
【算法与数据结构】763、LeetCode划分字母区间
文章目录 一、题目二、解法三、完整代码 所有的LeetCode题解索引,可以看这篇文章——【算法和数据结构】LeetCode题解。 一、题目 二、解法 思路分析:本题要求为: 1.尽可能多的划分片段2.字母只能出现在一个片段中3.片段连接起来仍然是s&…...
软件定制和开发/安卓神级系统优化工具
转自:mysql有关权限的表都有哪几个一、关于MySQL权限的几点常识:1、MySQL的权限系统主要用来验证用户的操作权限。2、在MySQL内部,权限信息存放在MySQL数据库的granttable里。当mysql启动后,granttabhttps://www.pinlue.com/artic…...
国外域名注册商网站/查询网站相关网址
题目如下: (1) 将代码写在.asm中,然后打开boxdos即可生成t1.exe. (2) 首先来分析一下,代码完成的功能。 assum cs:codesg codesg segmentmov ax,2000 // ax 2000mov ss,ax // ss 2000 mov sp,0 // sp 0add…...
成都企业模版网站建设/网络服务商主要包括
浅谈计算机辅助工程(CAE)摘要计算机辅助工程(CAE)是一种迅速发展的信息技术,是实现重大工程和工业产品的计算分析、模拟仿真与优化设计的工程软件,是支持工程科学家进行创新研究和工程师进行创新设计的、最重要的工具和手段。本文针对某微波通讯芯片的散…...
用wordpress做视频网站/郑州全域静态管理
sql是声明性语言:首先要把这个概念记在脑中:“声明”。 SQL 语言是为计算机声明了一个你想从原始数据中获得什么样的结果的一个范例,而不是告诉计算机如何能够得到结果。 SQL 语言声明的是结果集的属性,计算机会根据 SQL 所声明的…...
网页制作工具的选择与网站整体风格没有关系/软文写作是什么
全国计算机等级考试四级计算机组成与接口考试大纲考试大纲是考生在备考复习的一个指引方向,以下就是小编分享全国计算机等级考试四级计算机组成与接口考试大纲,我们一起来看一看吧!全国计算机等级考试四级计算机组成与接口考试大纲(2013年版)…...
wordpress 防火墙/百度百科词条
a转载于:https://www.cnblogs.com/menggucaoyuan/archive/2013/04/23/3036903.html...