• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

iOS崩溃日志符号化和崩溃

武飞扬头像
creazyxiao
帮助1

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
系列文章
更多 icon
同类精品
更多 icon
继续加载