MonkeyDev创建微信项目后,运行项目,发现直接命中了Assert。Assert原因暂且不论,lldb执行thread return即可正常运行。
查看堆栈,发现了一堆__lldb_unnamed_symbol438017这样子的栈,看样子要符号表恢复。
什么是符号表
符号表储存在 Mach-O 文件的 __LINKEDIT 段中,涉及其中的符号表(Symbol Table)和字符串表(String Table)。
符号表的结构是一个连续的列表,其中的每一项都是一个 struct nlist。
这里重点关注第一项和最后一项,第一项是符号名在字符串表中的偏移量,用于表示函数名,最后一项是符号在内存中的地址,类似于函数指针(这里只说明大概的结构,详细的信息请参考官方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
擦,报错了
犹记得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…
仅用于学习交流,如侵犯到您的隐私,请联系我删除