在MAC與IOS平臺(tái)上也拜,動(dòng)態(tài)庫(kù)的后綴一般是dylid坛善,而加載這些動(dòng)態(tài)庫(kù)的程序叫做dynamic linker(dyld)。這個(gè)程序有很多的環(huán)境變量來(lái)設(shè)置程序的一些行為吧史,最為常用的一個(gè)環(huán)境變量叫做"DYLD_INSERT_LIBRARIES"鼓鲁。它是一個(gè)使用冒號(hào)分隔的動(dòng)態(tài)庫(kù)路徑字符串蕴轨,表示一個(gè)將要加載運(yùn)行的動(dòng)態(tài)庫(kù)額外依賴的其它動(dòng)態(tài)庫(kù)。通過(guò)這個(gè)環(huán)境變量骇吭,我們就可以向應(yīng)用中注入自己的動(dòng)態(tài)庫(kù)橙弱,進(jìn)而改變應(yīng)用運(yùn)行時(shí)的特定行為。而這種方式,也正是mobileSubstrate所使用的最基本方法膘螟。
MobileSubstrate又叫Cydia Substrate成福,它是由Saurik開(kāi)發(fā)的一個(gè)框架碾局。第三方開(kāi)發(fā)者調(diào)用其API荆残,可以實(shí)現(xiàn)給IOS系統(tǒng)打補(bǔ)丁,改變系統(tǒng)或者應(yīng)用的運(yùn)行行為净当。隨著時(shí)間的發(fā)展内斯,Mobilesubstrate也不再僅僅局限于IOS平臺(tái),同樣提供了對(duì)Android平臺(tái)的支持像啼,同時(shí)也支持了c/c++俘闯。Mobile Substrate由MobileHooker/MobileLoader/SafeMode三部分組成。
MobileHooker是對(duì)外的API部分忽冻,它們主要用來(lái)替換系統(tǒng)的函數(shù)實(shí)現(xiàn)真朗。最主要的二個(gè)API見(jiàn)下圖:
MSHookMessage是非線程安全的,用于替換原函數(shù)實(shí)現(xiàn)僧诚。而MSHookMessageEx則是線程安全遮婶,二者主要是在OC的Runtime機(jī)制上實(shí)現(xiàn)的。MSHookFunction功能與上面兩個(gè)類似湖笨,但主要用于C/C++函數(shù)旗扑,與OC不同,它另有一套自己的實(shí)現(xiàn)方式慈省,有興趣的同學(xué)可以到其wiki上查閱臀防。
MobileLoader的主要功能是將指定目錄下的補(bǔ)丁文件(動(dòng)態(tài)庫(kù)文件)加載到指定的程序中。MobileLoader首先會(huì)將自己通過(guò)DYLD_INSERT_LIBRARIES加載到目錄程序中边败,然后它會(huì)在/Library/MobileSubstrate/DynamicLibraries/目錄下尋找需要加載的第三方補(bǔ)丁文件并使用dlopen加載它們袱衷。是否加載是通過(guò)一個(gè)plist文件來(lái)控制的,該文件中可以指定目標(biāo)程序的bundle id等笑窜。如下圖:
其中CoreFoundationVersion表示該庫(kù)的版本致燥,第一個(gè)值表示大于或等于,第二個(gè)值表示小于怖侦,具體的值見(jiàn)wiki篡悟。
Executables表示目標(biāo)程序可執(zhí)行文件的名稱。Bundles表示目標(biāo)程序的bundle id匾寝,Mode表示以上條件之間的邏輯關(guān)系搬葬,Any表示與運(yùn)算。
SafeMode的主要功能是容錯(cuò)處理艳悔。第三方開(kāi)發(fā)者通過(guò)MobileSubstrate向系統(tǒng)注入自定義代碼時(shí)急凰,如果考慮不周就可能導(dǎo)致終端設(shè)備處于崩潰的狀態(tài)。MobileLoader會(huì)捕獲這個(gè)崩潰異常,然后讓設(shè)備進(jìn)入SafeMode狀態(tài)抡锈,在這個(gè)狀態(tài)下疾忍,所有的第三方補(bǔ)丁都將被禁用,開(kāi)發(fā)者可以比較從容的恢復(fù)設(shè)備床三。
MobileSubstrate是cydia實(shí)現(xiàn)的基礎(chǔ)一罩,現(xiàn)有的越獄開(kāi)發(fā)環(huán)境一般使用的是THEOS或者iosopendev,這兩者h(yuǎn)ook功能都是對(duì)MobileSubstrate API的封裝撇簿。而MobileSubstrate又是基于DYLD_INSERT_LIBRARIES方式實(shí)現(xiàn)的聂渊,因此有些應(yīng)用(如美團(tuán))為了阻止他人的破解,采用了一些措施阻止了DYLD_INSERT_LIBRARIES這種注入方式四瘫,基本原理參見(jiàn)鏈接https://pewpewthespells.com/blog/blocking_code_injection_on_ios_and_os_x.html汉嗽。方法是在應(yīng)用編譯時(shí)加入下圖的編譯參數(shù):
參考資料:
1.https://wizardforcel.gitbooks.io/ios-sec-wiki/content/chapter7/issue7-1.html
2.http://www.cydiasubstrate.com/inject/darwin/
3.http://blog.timac.org/?p=761
4.https://pewpewthespells.com/blog/blocking_code_injection_on_ios_and_os_x.html