在使用theos hook第一個越獄ios系統的app一文的基礎上進行延伸 進行私有API的調用 本例是打電話函數
有兩種hook的方式
1:在APP調用私有API的函數中進行hook
即對這個函數進行hook。
這個當然可用做到 如下
但是這樣做的弊端有如下
a:對于每一個使用過此私有函數的函數 都要進行單獨hook 這樣就需要動態的在tweak腳本里編寫每一個函數 相對很麻煩
b:對于獲取打電話的參數也十分麻煩
因此 我采取了第二種hook的方式 去私有框架中hook 私有API
2:去私有框架中hook 私有API
通過class-dump 可以dump出所有不同版本的IOS私有公有框架的頭文件https://github.com/nst/iOS-Runtime-Headers/releases
找到?UIApplication 的頭文件 ?UIApplication.h
找到openURL的方法如下
于是在這個層面進行hook
得到結果
這種方式明顯比上一種的方案要好得多,彌補了第一種方式的不足。
但這種hook的方式仍然不夠優化,問題有如下
1:對于每一個app都只能產生指定的插件,如果換了bundle ID的話,又需要重新生成插件。當然重新生成也不是非常麻煩的事情,但如果能做到即便換了bundle ID也無需重新生成插件的話,是最完美的。這是即將研究的問題一。
2:每次安裝完插件,系統都將重新啟動一次,即Spring Board要重新啟動。這個可能會給自動化測試帶來一定的阻力。也是鑒于此,實現1成為了自動化實現的關鍵一步。
3:如果這個方案可行的話,還需要在hook的函數過程中加以判斷,系統當前存在的進程,是哪一個進程調用這個API。
4:如果這個方案可行的話,當對每一種私有API的每一個IOS版本分別進行研究匯總。
問題2的研究比較簡單,對Spring Board進程啟動注入一個tweak即可。
對問題1的研究過程如下
當在同一個APP的基礎之上 更改bundle ID的話 之前是(com.antiy.chendan)
重新運行,發現插件無效
bundle ID改回來,刪掉APP,又重新裝入APP 這個時候插件hook仍然有效
結論如下
創建每一個hook的插件,與bundle ID有關,即與app的標識有關。簡而言之,不管這個app是否安裝,只要關于與這個app關聯的插件已經存在ios系統中,即是存在cydia中,則無論這個app是否安裝,一旦它安裝,hook一定存在。
為了解決這個問題 有三種思路
1:在app安裝之前,通過靜態分析 把app的bundle ID改成指定的ID,如此可不必每次啟動更新插件來進行hook。但這樣有可能會傷及樣本本身。
2:theos的tweak每次hook的時候,勢必要對bundle ID進行判斷,找到這個判斷條件,取消即可。
3:或者搞清楚tweak的每一步的具體是怎樣操作的 或許其中有辦法解決這個問題
bundle ID的判別過程:http://security.ios-wiki.com/issue-7-1/
可知bundle ID的判別過程是由cydia來操作的 跟theos無關··
這個階段的研究可告一段落 看看后面兩個工具如何使用的 再綜合考慮吧··