Cydia的基石:MobileSubstrate

在MAC與IOS平臺上,動態庫的後綴通常是dylid,而加載這些動態庫的程序叫作dynamic linker(dyld)。這個程序有不少的環境變量來設置程序的一些行爲,最爲經常使用的一個環境變量叫作"DYLD_INSERT_LIBRARIES"。它是一個使用冒號分隔的動態庫路徑字符串,表示一個將要加載運行的動態庫額外依賴的其它動態庫。經過這個環境變量,咱們就能夠嚮應用中注入本身的動態庫,進而改變應用運行時的特定行爲。而這種方式,也正是mobileSubstrate所使用的最基本方法。html

MobileSubstrate又叫Cydia Substrate,它是由Saurik開發的一個框架。第三方開發者調用其API,能夠實現給IOS系統打補丁,改變系統或者應用的運行行爲。隨着時間的發展,Mobilesubstrate也再也不僅僅侷限於IOS平臺,一樣提供了對Android平臺的支持,同時也支持了c/c++。Mobile Substrate由MobileHooker/MobileLoader/SafeMode三部分組成。ios

MobileHooker是對外的API部分,它們主要用來替換系統的函數實現。最主要的二個API見下圖:c++

MSHookMessage是非線程安全的,用於替換原函數實現。而MSHookMessageEx則是線程安全,兩者主要是在OC的Runtime機制上實現的。MSHookFunction功能與上面兩個相似,但主要用於C/C++函數,與OC不一樣,它另有一套本身的實現方式,有興趣的同窗能夠到其wiki上查閱。git

MobileLoader的主要功能是將指定目錄下的補丁文件(動態庫文件)加載到指定的程序中。MobileLoader首先會將本身經過DYLD_INSERT_LIBRARIES加載到目錄程序中,而後它會在/Library/MobileSubstrate/DynamicLibraries/目錄下尋找須要加載的第三方補丁文件並使用dlopen加載它們。是否加載是經過一個plist文件來控制的,該文件中能夠指定目標程序的bundle id等。以下圖:安全

其中CoreFoundationVersion表示該庫的版本,第一個值表示大於或等於,第二個值表示小於,具體的值見wiki。app

Executables表示目標程序可執行文件的名稱。Bundles表示目標程序的bundle id,Mode表示以上條件之間的邏輯關係,Any表示與運算。框架

SafeMode的主要功能是容錯處理。第三方開發者經過MobileSubstrate向系統注入自定義代碼時,若是考慮不周就可能致使終端設備處於崩潰的狀態。MobileLoader會捕獲這個崩潰異常,而後讓設備進入SafeMode狀態,在這個狀態下,全部的第三方補丁都將被禁用,開發者能夠比較從容的恢復設備。函數

MobileSubstrate是cydia實現的基礎,現有的越獄開發環境通常使用的是THEOS或者iosopendev,這二者hook功能都是對MobileSubstrate API的封裝。而MobileSubstrate又是基於DYLD_INSERT_LIBRARIES方式實現的,所以有些應用(如美團)爲了阻止他人的破解,採用了一些措施阻止了DYLD_INSERT_LIBRARIES這種注入方式,基本原理參見連接線程

https://pewpewthespells.com/blog/blocking_code_injection_on_ios_and_os_x.html3d

方法是在應用編譯時加入下圖的編譯參數:

參考資料:

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

5.http://bbs.iosre.com/t/tweak-app-app-tweak/438

相關文章
相關標籤/搜索