在通过逆向分析竞品过程中,经常需要分析其实现逻辑。但由于没有符号,我们会遇到一些阻碍。
一、符号恢复
我们经常 hook 一个方法并加断点可快速获得参数值,但是使用 bt 命令打印堆栈信息时,只能看到 ___lldb_unnamed_symbol279180$$TikTok
的信息,原因是 Objective-C 在打包时会被 stripped out,导致无法看到具体符号。
1. restore-symbol 使用
可以利用 restore-symbol 工具恢复符号(只能恢复 Objective-C 符号,无法恢复 C/C++ 符号),具体使用如下:
# git clone --recursive https://github.com/tobefuturer/restore-symbol.git
# cd restore-symbol
# make
# ./restore-symbol TikTok -o TikTok_symbol
2. 错误处理
在运行时会报错:2022-01-06 18:07:15.103 restore-symbol[17534:7647405] *** Assertion failure in -[CDObjectiveC2Processor loadClassAtAddress:], CDObjectiveC2Processor.m:258
,原因是使用了 Swift 语言,而解析 Swift 的方法已过期。我们可以简单粗暴地把抛出异常的代码注释掉,重新 make 即可成功恢复符号。
3. 验证
把 ipa 包里的 MachO 文件替换为恢复符号后的 MachO 文件,重签名后运行到手机上(MonkeyDev 工具已经集成重签名的功能,这里只需要替换 TargetApp 里面的 MachO 文件,clean 后 rebuild 即可)。
在断点处使用 bt 命令打印堆栈信息:
可以看到大部分 ___lldb_unnamed_symbol279180$$TikTok
都被恢复符号了,还有部分未被恢复的猜测是使用 Swift 语言编写的代码。
二、IDA Pro 反汇编工具
下面通过反编译上面输出的堆栈:frame #3: 0x000000010650cdac TikTok -[LSGLPreviewView newFrameReadyAtTime:atIndex:] + 512
简单介绍 IDA 的使用。
1. 使用 IDA 打开 MachO 文件
IDA 分析 MachO 文件时间较长,需要耐心等待。
2. 计算对应方法在 MachO 文件中的偏移地址
在断点处,输入 image list -o -f
,可获得 ASLR 偏移地址,运行时基地址(0x000000010650cdac) = ASLR 偏移地址(0x0000000002a00000) + 基地址(0x103B0CDAC)
3. 定位到基地址
在 IDA 中使用快捷键 g
,可跳转到地址
4. 反汇编
使用快捷键 F5
,反汇编对应代码。至此,我们已经可以大致看到 -[LSGLPreviewView newFrameReadyAtTime:atIndex:]
这个方法的实现逻辑了。
三、暂未解决问题
- Swift、C/C++ 的无法恢复符号问题;
- 恢复符号后,Instruments 依然无法显示符号;