iOS 恢复符号表

一、恢复方法符号表

符号表(Symbol Table)是一种用于语言翻译器(例如编译器和解释器)中的数据结构。在符号表中,程序源代码中的每个标识符都和它的声明或使用信息绑定在一起,比如其数据类型、作用域以及内存地址 [1]

  1. 瘦身可执行文件

恢复符号表需要可执行文件为单一架构, 这里使用如下命令
查看是否是fat的文件:

lipo -info WeChat

如果是fat的文件,那么执行下方命令进行瘦身, 这里使用微信为例, 得到arm64架构的可执行文件:

lipo WeChat -thin arm64 -output WeChat_arm64
  1. 想要恢复符号表, 需要使用工具: restore-symbol

克隆restore-symbol并编译得到可执行文件restore-symbol
单一架构的可执行文件

git clone --recursive https://github.com/tobefuturer/restore-symbol.git
cd restore-symbol && make
./restore-symbol

执行命令恢复符号表

./restore-symbol WeChat_arm64 -o WeChat_s

其中 WeChat_s为恢复了符号表的可执行文件

恢复符号表成功

二、恢复block符号表

restore-symbol还可以恢复block符号表, 这里使用到了ida_search_block.py文件和ida.

  1. 在 IDA 中运行 ida_search_block.py 脚本得到一个block_symbol.json文件
运行脚本
  1. 使用block_symbol.json恢复block符号表, 将block_symbol.json放在restore-symbol工具所在文件, 执行如下命令:
./restore-symbol WeiChat_s -o WeChat_block -j block_symbol.json

WeChat_block 即为恢复了block符号表的Mach-O文件

恢复前
恢复后

注意: 因为恢复符号表只能是单一架构恢复, 如果你要适配多个架构就需要将mach-o拆分, 分别进行恢复, 再合并mach-o文件. 这样得到的Mach-O文件重签名后才能在不同架构运行.

参考:
https://www.jianshu.com/p/967ff5740bd7
https://www.jianshu.com/p/aa39daafa316

你可能感兴趣的:(iOS 恢复符号表)