本文的部分理論支持,節選自這裏:iOS符號表恢復。
前言
符號表歷來是逆向工程中的“必爭之地”,而iOS應用在上線前要裁去符號表,以避免被逆向分析。
這些可以通過配置xcode的編譯選項來達到效果。具體操作請看這:Xcode中和symbols有關的幾個設置。
Xcode顯示調用堆棧中符號時,只會顯示符號表中有的符號。爲了我們調試過程的順利,我們有必要把可執行文件中的符號表恢復回來。
先來看一眼無符號表和有符號表的可執行文件調試區別:
符號表有多好用,一目瞭然。
什麼是符號表?
我們要恢復符號表,首先要知道符號表是什麼,他是怎麼存在於 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就停不下了。
哦對了,附上別人的符號表還原效果圖:
我們斷點到stopLoading
以後,也是這種效果。
至此,調試三方app就跟調試自己的app一樣了。
這篇可能有點爛尾,實在是符號表還原的理論知識太多,而且作者講的我無法超越,只能虛心引用了。
那麼,加油吧!