arm64e符号翻译与PAC问题

arm64e由于引入了PAC机制,导致符号地址发生了巨大变化。也给堆栈回溯带来了问题。

背景

从去年新iphone发布后,我们陆陆续续发现crash上报组件上报的crash总很奇怪,堆栈里要么只有栈帧0,要么就只有几个栈帧,而丢失了绝大部分的栈,起初我们没有在意,只是怀疑crash上报组件又引入了什么奇怪的bug,但因为量比较低,并不影响我们解决主要的crash问题(毕竟XS/XR设备还不是主流)。但是后来又遇到了一次QAPM上报的内存监控堆栈,发现也很奇怪堆栈还是丢失了很多,只有栈帧0或者main函数等信息,其它都只是符号地址,如下:

Thread 1 :
1 libsystem_kernel.dylib 0x1ab941000 0x1ab959c60
2 libsystem_kernel.dylib 0x1ab941000 0x1ab9590e8
3 unkonwn 0x57fe81ab7f7154
4 unkonwn 0x7dc001ab7f75f0
5 unkonwn 0x668381aba151f4
6 unkonwn 0x797701ac975b68
7 unkonwn 0x656881ac748400
8 unkonwn 0x56b181ac756554
9 unkonwn 0x26eb01ac97b9a8
10 unkonwn 0x73d081ac86a820
11 unkonwn 0x1c4d01ab7e1884
12 unkonwn 0xfc01ab7ee404
13 unkonwn 0x49f081ac7db250
14 unkonwn 0xce101ac84915c
15 unkonwn 0x7edd01abd40acc
16 unkonwn 0x2cad81abd40a8c
17 unkonwn 0x53ff01abd3ff30
18 unkonwn 0x661501abd3fbbc
19 unkonwn 0x5aeb81abcb6768
20 unkonwn 0x404001abd3f664
21 unkonwn 0x2ffd81ac73a7c4
22 unkonwn 0x476581d9099cd8
23 unkonwn 0x509081d89383c8
24 unkonwn 0x659f81d8938e5c
25 unkonwn 0x26c181d8937eb8
26 unkonwn 0x1ab581d893cea8
27 unkonwn 0x56c481d8c83904
28 unkonwn 0x563b81ae794c58
29 unkonwn 0x4dd581ab7e1884
30 unkonwn 0x4e4901ab7e4e5c
31 unkonwn 0x697381ae7d118c
32 unkonwn 0x1ca181ae7d0e08
33 unkonwn 0x204381ae7d1404
34 unkonwn 0x42a001abd62444
35 unkonwn 0x7ca881abd623c0
36 unkonwn 0x7e8c81abd61c7c
37 unkonwn 0x626881abd5c950
38 unkonwn 0x199c01abd5c254
39 unkonwn 0x209801adf9bd8c
40 unkonwn 0x458381d90a44c0
41 unkonwn 0x62f78102b5047c
42 libdyld.dylib 0x1ab818000 0x1ab818fd8

地址明显有问题,而导致翻译失败。

PAC

偶然间看到内网有人解决了最近某个版本的一个top 2的crash,提到了一个堆栈回溯失败的问题和原因,豁然开朗。
果然是PAC问题,虽然新iphone刚发布时就知道有PAC的特性,但我们一直没重视。而且本身我们的crash问题堆栈的量又特别特别少,导致我们也没认真对待。
正好结合最近和以前遇到的问题,发现问题系统设备都是arm64e设备和12系统,才意识到我们的堆栈回溯失败的根因也都是PAC问题,索性就再研究下了PAC。

什么是PAC

PAC即Pointer Authentication,它的目的即检测和保护地址不被意外或恶意修改,使得应用执行更加安全。
比如如果当前pc指向了PAC后的值0x00691e8104c560d4,而我们应用强制将其改为其他地址,则会导致内存访问错误或PAC校验失败而crash。
PAC特性是由硬件提供的,保护了函数调用期间,栈空间和地址的安全。
它利用VA的高位来实现,当执行该VA时,会有专门的指令解码VA并读取指令。任何导致该VA在读与写之间不一致的行为,都会触发PAC校验失败。PAC校验失败会触发内存崩溃而crash;

PAC的结构如下:

image.png

在iphone上,由于VA值的上限只用到36bits,所以会利用VA的高28位来作为PAC存储使用。

备注:xnu规定的iOS的VA最大值为#define MACH_VM_MAX_ADDRESS 0x0000000FC0000000,即只需要36bits即可。

处理PAC

根据Apple的文档Preparing Your App to Work with Pointer Authentication ,处理PAC的地址问题我们直接使用ptrauth_strip宏(#include <ptrauth.h>)即可,但该死的苹果限制了该宏仅在arm64e下才生效,所以此路不通。

但很庆幸,PAC的本质是在arm64e上它把VA无用的高28bits拿来用作PAC了,所以我们只要取低36bits即为实际的VA了。

备注:准确点是arm64e中PAC只用到了第62bit到36bit共27bits,最高位第63bit在arm64中是tag pointer标记位.

所以我们只要直接取低36bits就能愉快的玩耍了。

va = va & 0x0fffffffff;//得到PAC strip后的原始VA值.

结语

果然任何小问题都不要因为量不多而不重视它,很可能每个小问题的背后都隐藏了一个未知的新问题。
iOS正向开发果然越来越难了。

参考

Preparing Your App to Work with Pointer Authentication

ARMv8.3 Pointer Authentication

MACH_VM_MAX_ADDRESS

iOS Address Space Limitations

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,839评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,543评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,116评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,371评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,384评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,111评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,416评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,053评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,558评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,007评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,117评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,756评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,324评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,315评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,539评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,578评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,877评论 2 345

推荐阅读更多精彩内容