一、恢复方法符号表
符号表(Symbol Table)是一种用于语言翻译器(例如编译器和解释器)中的数据结构。在符号表中,程序源代码中的每个标识符都和它的声明或使用信息绑定在一起,比如其数据类型、作用域以及内存地址 [1]
- 瘦身可执行文件
恢复符号表需要可执行文件为单一架构, 这里使用如下命令
查看是否是fat的文件:
lipo -info WeChat
如果是fat的文件,那么执行下方命令进行瘦身, 这里使用微信为例, 得到arm64架构的可执行文件:
lipo WeChat -thin arm64 -output WeChat_arm64
- 想要恢复符号表, 需要使用工具: 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.
- 在 IDA 中运行 ida_search_block.py 脚本得到一个block_symbol.json文件

- 使用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
网友评论