[从基础学逆向] 9. 恢复符号表restore-symbol

868 阅读2分钟

MonkeyDev创建微信项目后,运行项目,发现直接命中了Assert。Assert原因暂且不论,lldb执行thread return即可正常运行。

查看堆栈,发现了一堆__lldb_unnamed_symbol438017这样子的栈,看样子要符号表恢复。

image.png

什么是符号表

符号表储存在 Mach-O 文件的 __LINKEDIT 段中,涉及其中的符号表(Symbol Table)和字符串表(String Table)。

符号表的结构是一个连续的列表,其中的每一项都是一个 struct nlist

image.png

这里重点关注第一项和最后一项,第一项是符号名在字符串表中的偏移量,用于表示函数名,最后一项是符号在内存中的地址,类似于函数指针(这里只说明大概的结构,详细的信息请参考官方Mach O文件格式的文档)。

也就是说如果我们知道了符号名和内存地址的对应关系,我们是可以根据这个结构来逆向构造出符号表数据的。

参考:blog.imjun.net/posts/resto…

restore-symbol

前置条件:

待恢复符号表的可执行文件,必须是单架构。

lipo -info ./Payload/WeChat.app/WeChat

发现通过class-dump出来的砸壳应用,已经是arm64单架构,看样子不用执行lipo -thin了。

安装restore-symbol,参考:github.com/tobefuturer…

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

恢复符号表:

./restore-symbol ~/frida-dump-apps/微信/Payload/WeChat.app/WeChat -o symbolWeChat

擦,报错了

image.png

犹记得class-dump好像更新过,弄上新的试下,下载class-dump,解压,将class-dump-master下内容替换到restore-symbol目录下的class-dump目录下,重新make

重试命令:

./restore-symbol ~/frida-dump-apps/微信/Payload/WeChat.app/WeChat -o symbolWeChat

ok,成功了,restore-symbol目录下得到了symbolWeChat文件,比原WeChat文件大出28m。更名为WeChat,粘贴替换到MonkeyDev下的WeChat.app目录下,clean项目,并重新运行。

block符号表

运行App后,发现仍有一些符号表为___lldb_unnamed_xxx,这些属于block符号表,其需要另外恢复,OC方法基本足够分析App,block符号表恢复就不再详细介绍。

详情参考:blog.imjun.net/posts/resto…

仅用于学习交流,如侵犯到您的隐私,请联系我删除