iOS逆向学习四:符号表还原

本文的部分理论支持,节选自这里:iOS符号表恢复。

前言

符号表历来是逆向工程中的“必争之地”,而iOS应用在上线前要裁去符号表,以避免被逆向分析。

这些可以通过配置xcode的编译选项来达到效果。具体操作请看这:Xcode中和symbols有关的几个设置。

Xcode显示调用堆栈中符号时,只会显示符号表中有的符号。为了我们调试过程的顺利,我们有必要把可执行文件中的符号表恢复回来。

先来看一眼无符号表和有符号表的可执行文件调试区别:
iOS逆向学习四:符号表还原_第1张图片
iOS逆向学习四:符号表还原_第2张图片
符号表有多好用,一目了然。

什么是符号表?

我们要恢复符号表,首先要知道符号表是什么,他是怎么存在于 Mach-O 文件中的?由于这块涉及到的知识较多,还原符号表的作者讲解的很好,所以希望大家认真研究一下这篇文章。对 就是开篇提到的链接。

这里是:项目开源地址。
工具的配置和使用说明,也在作者的博客中。

有了这些工具,再回过头来研究一下,为什么我们在第二篇文章中重写了doSearch方法,却没有生效的原因。

doSearch打断点的时候,showLoading函数已经被执行了,但我们点击搜索没有反应,所以应该是后面调用了stopLoading函数。这个函数正好在FindContactSearchViewCellInfo类里实现了(在class-dump导出的头文件里看到的)。所以我们就大胆尝试一下,通过br -n "[FindContactSearchViewCellInfo stopLoading]"命令,断点该函数。
再次在输入框输入0921,bingo,断点执行了。

从函数堆栈调用顺序(图片出了点问题,就不贴图了,后面我会附上其他app的函数调用栈效果截图),我们可以看到doSearch之后,执行了另一个函数:
- (void)MessageReturn:(id)arg1 Event:(unsigned int)arg2
该函数也是FindContactSearchViewCellInfo类中的。
移步IDA工具,看该函数实现:

惊不惊喜,怪不得重写了网络请求的创建,依然搜不到想要的结果。而且我也曾试着重写过wx的getSearchBarText方法,仍然不起作用。
原来是消息回来之后,wx拿searchBar.text 跟 request的请求参数(userName就是)做了比对,最终丢掉了这次的请求包。最后又stopLoading了。

我怀疑这是wx来了一个新人,不知道该类有getSearchBarText方法,所以直接自己手动取值了。导致正常的微信用起来会有一个bug:点击搜索的瞬间,删除一位搜索框的内容。loading就停不下了。

哦对了,附上别人的符号表还原效果图:
iOS逆向学习四:符号表还原_第3张图片
我们断点到stopLoading以后,也是这种效果。

至此,调试三方app就跟调试自己的app一样了。

这篇可能有点烂尾,实在是符号表还原的理论知识太多,而且作者讲的我无法超越,只能虚心引用了。

那么,加油吧!

你可能感兴趣的:(iOS逆向)