使用PongoOS读取苹果ARM64 CPU功能支持寄存器
前言
苹果自A6开始采用定制CPU核心,A7是全球第一款使用64位ARM的处理器。苹果CPU性能一直领先高通,必有一定的原因。通过读取ARM64 ID registers,或许能侧面揭晓一些答案。
PongoOS
自2019年checkm8漏洞公开以来,很快有大神们利用该漏洞制作了checkra1n越狱工具,为了方便地支持A7-A11多个硬件平台,多个iOS版本,checkra1n实现了一个Preboot environment,名为PongoOS,一个简易的操作系统。
checkra1n运行时利用checkm8将PongoOS注入iBoot,PongoOS通过内存Hook劫持iBoot,利用iBoot初始化平台,并在iBoot执行末尾启动自身,Pongo启动后加载KPF(Kernel Patch Finder)内核模块,KPF会patch掉内存中的iOS内核。
PongoOS目前已经开源,可以当作苹果硬件的实验环境使用。
编译启动PongoOS
在修改PongoOS之前,需要能够编译PongoOS,能够使用checkra1n启动iPhone。
PongoOS源码:
https://github.com/checkra1n/pongoOS
支持macOS和Linux编译,根据官方readme,macOS下编译会简单一些:
- Install Xcode + command-line utilities
- Run
make all
需要安装Xcode及其命令行工具。(命令行工具只需要在终端里运行git等命令就会自动弹出来)
先跑一遍make all,build下应该生成Pongo.bin,安装checkra1n后可通过以下命令启动:
/Applications/checkra1n.app/Contents/MacOS/checkra1n -c -p -k ./build/Pongo.bin
接下来
cd scripts/
make
会生成pongoterm工具,通过它就可以通过USB和iPhone上的PongoOS shell交互了。
一切准备就绪以后,可以修改Pongo源码,在pongo shell里添加读取ARM64寄存器的命令了。
读取ARM64功能支持寄存器
打开 src/shell/main.c, 在shell_main函数以前加入读寄存器的命令:
void read_aa64_ids_cmd(const char* cmd, char* args) {
//PongoOS有一个command handler,用户输入的命令和参数会以char*传递给相应命令处理函数
//也就是说,需要自己解析args(不过这里并不需要)uint64_t id; //要读的寄存器是64位的__asm__("mrs %0, ID_AA64ISAR0_EL1" : "=r" (id) : : );//通过内联asm读取寄存器iprintf("ID_AA64ISAR0_EL1 is %llx\n", id);__asm__("mrs %0, ID_AA64ISAR1_EL1" : "=r" (id) : : );iprintf("ID_AA64ISAR1_EL1 is %llx\n", id);__asm__("mrs %0, ID_AA64MMFR0_EL1" : "=r" (id) : : );iprintf("ID_AA64MMFR0_EL1 is %llx\n", id);__asm__("mrs %0, ID_AA64MMFR1_EL1" : "=r" (id) : : );iprintf("ID_AA64MMFR1_EL1 is %llx\n", id);__asm__("mrs %0, ID_AA64MMFR2_EL1" : "=r" (id) : : );iprintf("ID_AA64MMFR2_EL1 is %llx\n", id);__asm__("mrs %0, ID_AA64PFR0_EL1" : "=r" (id) : : );iprintf("ID_AA64PFR0_EL1 is %llx\n", id);
}
然后在shell_main函数里注册刚添加的命令:
void shell_main() {/*Load command handler*/extern void task_list(const char *, char*);//注册read_aa64_ids_cmd函数,命令名aa64idcommand_register("aa64id", "Read AArch64 ID registers", read_aa64_ids_cmd);command_register("panic", "calls panic()", panic_cmd);
保存main.c,再次make all 生成Pongo.bin,再次通过checkra1n命令启动。
结果
在PongoOS shell中执行我们新添加的命令,即可读取苹果CPU的支持状态了。
我在A7(iPhone 5S)和A10(iPhone 7)上测试了读取:
A7:
pongoOS> aa64id
ID_AA64ISAR0_EL1 is 1110 //支持基本AES, SHA2, SHA1
ID_AA64ISAR1_EL1 is 0 //无支持
ID_AA64MMFR0_EL1 is 11021 //36 bits, 64GB物理地址 16 bits.ASID , EL3/1不支持BigEnd, EL0支持BigEnd, 支持SNSMem, 支持4KB和64KB内存页表
ID_AA64MMFR1_EL1 is 0 //无支持
ID_AA64MMFR2_EL1 is 0 //无支持
ID_AA64PFR0_EL1 is 1012 //EL3,EL1仅AArch64, EL0可AArch64或AArch32, 未实现EL2
A10:
pongoOS> aa64id
ID_AA64ISAR0_EL1 is 10011120 //支持AES(PMULL/PMULL2), SHA2, SHA1, CRC32, FEAT_RDM , 不支持原子操作指令(违反Armv8.1规范)
ID_AA64ISAR1_EL1 is 0 //无支持
ID_AA64MMFR0_EL1 is f0100001//36 bits, 64GB物理地址 8 bits.ASID, 不支持SNSMem, 不支持BigEnd,支持16KB和64KB内存页表
ID_AA64MMFR1_EL1 is 111000 //支持Hierarchical Permission Disables,LORegions,Privileged Access Never(均Armv8.1强制要求)
ID_AA64MMFR2_EL1 is 0 //无支持
ID_AA64PFR0_EL1 is 12 //EL1仅AArch64, EL0可AArch64或AArch32, 未实现EL3,EL2
其中A7兼容Armv8.0-A,A10 Armv8.1-A。(真的完全兼容吗?)
通过上面的读取结果,可以看到:
1.苹果的ARM64处理器A7开始就不支持EL2(虚拟化),最近的M1/A14X因为要在mac上用才开始支持(且仅支持VHE模式,因为macOS只用这个模式)
2.苹果不使用ARM TrustZone实现加密敏感的操作,而是通过一个独立的SEP实现。但是在A7-A9上,为了实现KPP(Kernel Patch Protection),苹果使用了EL3。
而自A10开始,苹果使用了更加可靠的KTRR及其演进版本APRR代替KPP,于是苹果在A10里立刻砍掉了EL3支持。
3.A7和A10都使用了36bits物理地址。(已经完全够用了)
4.在A7中部分支持的大端模式已经在A10彻底砍掉。
5.因为不用EL3(TrustZone),A10没有SNSMem安全内存标识。
6.A7中的16bits ASID在A10变成了8bits(也够用了)
7.A10中砍掉了4KB内存页表支持,添加了16KB页表支持
这是iPhone7上很难运行安卓,(目前)不能运行Win10的原因之一。有很多人讨论4KB和16KB的优劣,苹果应该是测试发现16KB在iPhone场景效率更高一些。
8.A10的结果可以看到,其中有明显违反ARM规范的地方。事实上1中仅支持VHE也是违反ARM specs的。
9.A7开始就不支持32bit EL1(仅支持64位操作系统)
综合来看,苹果因为掌握App Store的控制权,很容易要求开发者按照相应的规范适配,更不用考虑运行macOS/iOS体系以外的软件,因此也就没有安卓/Windows那么重的历史包袱,想要放弃一些CPU功能很容易(例如32位支持)。
因此苹果的原则就是,仅保留需要用的CPU功能,多余的使劲砍,需要用的不断优化,自然开销更低,效率也会高一些。
还有一个疑问:从A10返回结果来看,EL0支持AArch32模式(32位),但是不知为何在Project Sandcastle的readme里写道iPhone 7上的安卓不支持32位apk。
参考
Arm Armv8-A Architecture Registers
https://developer.arm.com/documentation/ddi0595/2021-06/AArch64-Registers
使用PongoOS读取苹果ARM64 CPU功能支持寄存器相关推荐
- PebbleBee Card 防丢卡片,既可充电又支持苹果Find My功能
Pebblebee Card类似于信用卡,设备非常薄,可以很容易地放在钱包.大衣和护照等地方.它也使用磁性无线充电器,一次充电可提供长达12个月的使用时间.该卡使用专有的磁性充电器,其另一端有一个US ...
- 不仅仅是钥匙防丢器,Numy防丢器还支持苹果Find My功能
Numy最新发布了一款支持苹果Find My的防丢器,可用于钱包,行李,宠物等的物品查找器. Numy防丢器支持的功能 完美适合iOS系统:使用苹果Find My App,通过简单的设置,立即将物品定 ...
- qborn推出支持苹果Find My功能婴儿车,开启智能“遛娃”时代
母婴国货品牌qborn发布了一款名为鲲鹏Pro的高景观婴儿推车.该款婴儿车搭载智能芯片,可与苹果设备的iPhone.iPad和Apple Watch上的Find My应用程序兼容,支持苹果的查找网络, ...
- 精美如蝴蝶结,Coredy iTag 防丢器支持苹果 Find My 功能
Coredy 最发布了一款支持果 Find My 功能的 Coredy iTag 防丢器,该防丢器有精美的外观,可作为时尚配件佩戴. Coredy iTag 支持的功能 与苹果 Find My 配合使 ...
- ATUVOS Tracker支持苹果Find My功能,Find My将成为防丢器必备功能
国外防丢器品牌ATUVOS 发布了一款支持苹果Find My功能的Tracker. ATUVOS Tracker支持的功能 轻松查找您的重要事项:使用 Apple Find My 应用程序通过内置扬声 ...
- linux查看支持vt功能,怎样知道 CPU 是否支持虚拟化技术(VT) | Linux 中国
wx_fmt=png&wxfrom=5&wx_lazy=1" alt="640?wx_fmt=png&wxfrom=5&wx_lazy=1" ...
- 苹果ARM64移动处理器
原文链接:http://www.mikeash.com/pyblog /friday-qa-2013-09-27-arm64-and-you.html "64位" 我们先来谈谈&q ...
- 计算机组成原理(5)CPU功能 控制器/运算器/寄存器/操作控制器、时序发生器 指令周期 方框图 微程序 流水CPU 三种相关性
CPU功能 指令控制 程序执行顺序,程序时一个指令序列 操作控制 管理并产生控制信号 时间控制 取指周期,执行周期 数据加工 算术运算,逻辑运算处理 左边运算器,右边控制器,记住IR,PC,AR,DR ...
- 虚拟机中安装MAC OS X教程(适用所有电脑方法,特别是cpu不支持硬件虚拟化的电脑)...
前言 之前写了一篇在Windows上搭建Object-C开发环境,并且写了一个HelloWorld程序.但真正开发苹果软件是在MAC OS X系统中(以下简称OSX)中.买不起MacBook,也没有O ...
最新文章
- HDOJ-2062 :Subset sequence(DP)
- VUE的本地应用-V- html
- linux 学习总结
- fmt打印不显示 go_golang打印输出fmt和log
- jquery无法删除一级域名cookie
- 使用Ehcache+Redis实现分布式缓存
- AgileConfig 1.6.0 发布 - 支持服务注册与发现
- 车牌识别与计算机编程,基于计算机视觉的车牌字符识别技术的研究
- android 批量查找view,Android Recyclerview实现多选,单选,全选,反选,批量删除的功能
- angular ts 表格_Angular 2的表格控件
- 网易2018校园招聘编程题真题 合唱
- mysql转储表_Mysql导出表结构及表数据 mysqldump用法
- [Mac OS] Homebrew简介及安装wine
- SAS数据集随机抽样方法
- 圆的面积php,圆的面积教学活动方案
- Web缓存(代理服务器)
- 图形验证码空白如何处理
- linux从源码编译cairo,如何在windows下编译cairo
- react调试工具与调试方法
- 用java实现屏幕找图
热门文章
- 山东莱芜市民在省内91家医院就医可即时结算
- 关于split的用法与注意事项
- Python全栈工程师(4:函数)
- ALTIUM DESIGNER+KEYSHOT快速渲染电路板
- getenv()和环境变量
- python无法定位到table_爬虫无法定位到tbody下的tr求助!!!!
- 12306那些事-技术并没有想象中那么简单
- ios运行html时黑屏,iOS13 ,xcode11新建项目真机运行出现黑屏及新出现的SceneDelegate的作用...
- ITK 数据表达(图像)
- hp服务器g5 u盘装系统,hp 440g5怎么装系统