在通过逆向分析竞品过程中,经常需要分析其实现逻辑。但由于没有符号,我们会遇到一些阻碍。

一、符号恢复

我们经常 hook 一个方法并加断点可快速获得参数值,但是使用 bt 命令打印堆栈信息时,只能看到 ___lldb_unnamed_symbol279180$$TikTok 的信息,原因是 Objective-C 在打包时会被 stripped out,导致无法看到具体符号。

image-20220106175647663

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. 错误处理

image-20220106180745368

image-20220106181010510

image-20220106181518223

在运行时会报错: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 即可)。

image-20220106182141938

在断点处使用 bt 命令打印堆栈信息:

image-20220106174114404

可以看到大部分 ___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)

image-20220106174139508

3. 定位到基地址

在 IDA 中使用快捷键 g,可跳转到地址

image-20220106174743933

image-20220106174800988

4. 反汇编

使用快捷键 F5,反汇编对应代码。至此,我们已经可以大致看到 -[LSGLPreviewView newFrameReadyAtTime:atIndex:] 这个方法的实现逻辑了。

image-20220106174837906

三、暂未解决问题

  1. Swift、C/C++ 的无法恢复符号问题;
  2. 恢复符号后,Instruments 依然无法显示符号;