在IOS逆向工具大全里 總結(jié)了四種運行時工具:cycript、InspectiveC、introspy、Snoop-it。這幾種工具功能大體相同(包含與被包含的關(guān)系)。
這些基本原理都是源自于ios的runtime特性,也稱為運行時特性。
本文首先科普ios的runtime特性。
何為運行時呢。普通的語言,如C語言,一旦經(jīng)過編譯,則馬上轉(zhuǎn)換成可目標(biāo)語言(匯編語言或機(jī)器語言),比如此時想要調(diào)用某個函數(shù),則實際在內(nèi)存中
就調(diào)用了某個函數(shù)。
然而OC語言卻不是這樣:OC語言除了編譯器之外,還多了個運行時系統(tǒng),經(jīng)過編譯之后,此時的函數(shù)在內(nèi)存里并沒有實際的地址,也即是此時無法調(diào)用該
函數(shù),而只有等到實際運行的時候,這個函數(shù)或者類才在內(nèi)存中實例化,被調(diào)用。
也正是因為如此,app每次運行的時候?qū)嶋H在內(nèi)存中產(chǎn)生的地址都是不同的,這就給反匯編的代碼閱讀增加了困難,這個又稱之為ios的app的ASLR特性。在
IOS逆向工具大全里有一種removePIE的工具,可以增加匯編代碼的可讀性,詳見http://www.cocoachina.com/industry/20140310/7940.html。
這個就稱之為運行時機(jī)制。
OC語言在運行的時候都會被轉(zhuǎn)換成runtime語言,蘋果本身對runtime是完全開源的,換言之,蘋果是允許去窺探已有app的內(nèi)部結(jié)構(gòu)的。通過runtime機(jī)制,
完全可以實現(xiàn)在app運行的時候,了解app實現(xiàn)的內(nèi)部結(jié)構(gòu):某個界面的組成,某個類有什么屬性方法,runtime甚至允許改變已有類的屬性方法值,亦可以增加
一個類,這就使得hook成為可能。
然后依次介紹每個工具的各自特性。
1:cycript
關(guān)于cycript的介紹在Cycript 研發(fā)_陳旦中已經(jīng)有了很詳細(xì)的介紹。但是cyript還有另外一種特性:cyript允許OC代碼和JS代碼混合編寫。
這種機(jī)制的原理源自于Objective-C與JavaScript交互。
2:Snoop-it:https://wizardforcel.gitbooks.io/ios-sec-wiki/content/chapter4/issue4-6.html
Snoop-it有兩個功能:運行時分析、對iOS應(yīng)用進(jìn)行黑盒安全評估。它有自己進(jìn)行操作的web界面,這是它優(yōu)于cycript的一個地方。
它還可用來分析網(wǎng)絡(luò)流量:https://wizardforcel.gitbooks.io/ios-sec-wiki/content/chapter6/issue6-1.html
Snoop-it官網(wǎng)地址:https://code.google.com/archive/p/snoop-it/.值得注意的是,這個工具作者并沒有放出源代碼。
3:InspectiveC
InspectiveC是一個基于OC的庫,它可以幫助查看類的詳細(xì)信息:
某個類的所有方法調(diào)用情況、某個類的某個方法的調(diào)用情況、某個類的實例對象的所有方法的調(diào)用情況、某個類的實例對象的某個方法的調(diào)用情況、某個方法簽名的調(diào)用情況
嚴(yán)格來說 它的功能很有限:http://iphonedevwiki.net/index.php/InspectiveC
4:introspy:http://wufawei.com/2013/11/ios-application-security-17/、http://www.blogfshare.com/ioss-introspy.html、http://ios.jobbole.com/58889/
Introspy由兩個模塊組成, 一個追蹤器,一個分析器。我們可以用追蹤器來對應(yīng)用執(zhí)行運行時分析。追蹤器會把信息保存到sqlite文件中以便后續(xù)用分析器分析,
追蹤器也可以把所有信息都輸出到設(shè)備的控制臺上。分析器可以用這個數(shù)據(jù)庫文件生成一個詳盡的HTML報告。
Introspy源碼:https://github.com/iSECPartners/Introspy-Analyzer
因此在本次調(diào)研中 只有1、4兩種工具,即cycript、introspy是開源的,而關(guān)于introspy的功能我有一個思路:通過動態(tài)運行工具對app進(jìn)行追蹤,可以對這些追蹤行為進(jìn)行
定義規(guī)則,而后,可以將這些追蹤信息輸出成靜態(tài)文本,類似introspy那樣,從而將動態(tài)分析轉(zhuǎn)換成靜態(tài)的文本分析。