iOS崩溃日志符号化和崩溃
1. 写在前面
1.1 名词解释
-
模块基地址: 模块在内存中的起始地址
-
ASLR偏移: 虚拟内存起始地址与模块基地址的偏移量
ASLR(地址随机化)是一种针对缓冲区溢出的安全保护技术,通过对堆、栈、共享库映射等线性区布局的随机化,通过增加攻击者预测目的地址的难度,防止攻击者直接定位攻击代码位置,达到阻止溢出攻击的目的
-
虚拟内存地址 = 模块基地址 ASLR偏移
1.2 静态库与动态库
静态库: 静态库本质上类似于编译文件(*.o)的压缩包, 只是在链接过程中, 被合并到app的二进制,所以静态库具备"被吸附性"
动态库: 动态库是一个链接号的二进制文件, 会被整体载入内存, 而且不能被宿主App吸附. 和静态库不同, 动态库实在app启动的时候载入内存, 此时, 会将动态库的代码段载入到App虚拟内存中, 并且拥有独立的内存空间(动态库的数据段会在宿主App链接时提前做备份), 其基地址有别于宿主程序和其他动态库 所以使用hopper进行反汇编时, 如果是宿主程序, 需要使用宿主程序的基地地址, 相应的, 动态库需要使用动态库的基地址
在.crash文件的最下边, 可以找到宿主app和动态库的基地址:
-
宿主程序: ZQMusic, 基地址: 0x102a7c000
-
动态库: AgoraCore , 基地址: 0x1054d0000
-
动态库: ZegoExpressEngine , 基地址:0x10709c000
参见
[iOS动态库、静态库及使用场景、方式](https://www.jianshu.com/p/4e0fd0214152)
[iOS程序员的自我修养](https://juejin.cn/post/6844903912143585288)
2. Hopper反汇编
2.1 前提
在使用[hopper](https://www.hopperapp.com/download.html?)反汇编之前, 需要知道基地址(宿主app,者动态库), crash的调用函数虚拟内存地址, 以及发生crash对应的原版二进制文件(最好是原版文件, 源码细微的差距都会导致编译的二进制虚拟地址发生变化)
2.2 反汇编
2.2.1 样本文件
-
样本文件, crash 地址 0x1045fd750:
-
宿主程序基地址 0x104560000:
2.2.2 打开文件
用hopper打开原版二进制文件, 选择对应的架构
2.2.3 修改基地址
点击菜单"Modify", 在下拉菜单中, 选中"Change File Base Address....", 输入基地址后点击"Rebase"
2.2.4 定位问题
在hopper页面上, 点击按键"G", 输入出问题的内存地址, 点击"Go"按钮跳转
内存地址定位:
2.2.5 问题分析
(1) 对应原函数代码
(2) 汇编代码分析:
第1步: 向一个对象发送"conversationDataRepository"方法
第2步: 向一个对象发送"row"方法
第3步: 向一个对象发送"objectAtIndex:"方法, 之后程序crash
由此, 我们可以定位 发生crash的位置是
` RCMessageModel *model = [self.conversationDataRepository objectAtIndex:indexPath.row];
`
由此得出结论, conversationDataRepository 数组越界, 或者conversationDataRepository 类型不是NSArray
2.2.6 汇编补充
出问题指令:
(1) 00000001045fd73c mov x2, x0
将x0寄存器的内容移动到x2寄存器(arm64 cpu, 执行函数调用时, 会用x0-x7寄存器存放前八个参数, 通常第一个放instance, 第二个放cmd, 此处x2是滴三个参数, 即index.row的结果 )
(2) 00000001045fd740 adrp x8, #0x1054c5000
开始内存跨页寻址, 定位到对应函数(objectAtIndex)的所处的内存页面首地址, 此处定位到了 @selector(setAccessoryType:) 函数所在内存的地址 #0x1054c5000
(3) 00000001045fd744 ldr x1, [x8, #0x360]
内存页内偏移0x360, 定位到"objectAtIndex:",@selector(objectAtIndex:)函数所在的地址 #0x1054c5360 , 放入x1(即cmd)
(4) 00000001045fd748 mov x0, x24
将instance放入x0寄存器
(5) 00000001045fd74c bl imp___stubs__objc_msgSend
调用objc_msgSend 方法
2.2.7 其他
以上是针对存在符号化的log的追溯过程, 对于无符号化的log的追溯步骤是一样的
2.2.8 相关资料
[利用Hopper进行基于汇编的iOSCrash栈分析](https://lrdcq.com/me/read.php/72.htm)
[iOS汇编之ARM64基础介绍](https://juejin.cn/post/7038523392395313183)
[“杀死” App 上的疑难崩溃](https://juejin.cn/post/7037308047382806565)
[hopper disassembler定位crash](https://www.jianshu.com/p/41a7b1cfa816)
[ARM 指令](http://www.iosrun.com/2022/04/ARM/)
3. 获取ipa的方式
3.1 爱思助手
部分ipa可以在爱思助手上直接获取, 搜索下载解包即可
3.2 Apple Configurator 2
(1) 在Mac 上安装Apple Configurator 2, 并登入对应账号
(2) 连接手机, 先安装一下想好获取的app, 之后删除, 办证AppleID购买过app
(3) 点击"添加按钮"
(4) 在弹出菜单中, 点击"App"
(5) 选中要安装的App, 并点击添加
(6) 在Finder中打开文件存放目录 :
~/Library/Group Containers/K36BKF7T3D.group.com.apple.configurator/Library/Caches/Assets/TemporaryItems/MobileApps
(7) 文件下载完成后, 需要快速拷贝ipa文件, 因为Apple Configurator 2在iPhone安装完ipad后立刻清空该目录
这篇好文章是转载于:学新通技术网
- 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
- 本站站名: 学新通技术网
- 本文地址: /boutique/detail/tanhgcbkba
-
photoshop保存的图片太大微信发不了怎么办
PHP中文网 06-15 -
Android 11 保存文件到外部存储,并分享文件
Luke 10-12 -
《学习通》视频自动暂停处理方法
HelloWorld317 07-05 -
word里面弄一个表格后上面的标题会跑到下面怎么办
PHP中文网 06-20 -
photoshop扩展功能面板显示灰色怎么办
PHP中文网 06-14 -
微信公众号没有声音提示怎么办
PHP中文网 03-31 -
excel下划线不显示怎么办
PHP中文网 06-23 -
excel打印预览压线压字怎么办
PHP中文网 06-22 -
怎样阻止微信小程序自动打开
PHP中文网 06-13 -
TikTok加速器哪个好免费的TK加速器推荐
TK小达人 10-01