OC 中對某個對象的方法的調用並不像 C++ 同樣直接取得方法的實現的偏移值來調用,因此 C++ 方法與實現的關係在編譯時就可肯定。而 OC 中方法和實現的關係是在運行時決定的。在調用某個對象的方法時,其實是調用了 obj_msgsend 向對象發送一個名稱爲方法名的消息,而咱們能夠替換這個響應這個消息的實現內容。OC 中比較有力的動態特性 Method Swizzing 就是創建在這個基礎之上。segmentfault
參考文章app
MobieSubstrate 是現有越獄插件運行的基礎;它由3部分組成:函數
它的做用是替換函數實現插件
它的做用是加載第三方動態連接庫,也就是咱們開發的 tweak。在 iOS 啓動時,由 launchd 將 MobileLoader 載入內存,而後 MobileLoader 會 dlopen 全部 /Library/MobileSubstrate/DynamicLibraries/ 目錄下的動態連接庫。
另外咱們須要爲編寫的 tweak 同時編寫一個跟 tweak 同名的 plist 文件,指定 tweak 的做用範圍。code
這個咱們要從二進制文件的結構提及,從下面的圖來看,Mach-O文件的數據主體可分爲三大部分,分別是頭部(Header)、加載命令(Load commands)、和最終的數據(Data)。mobileloader會在目標程序啓動時,會根據指定的規則檢查指定目錄是否存在第三方庫,若是有,則會經過修改二進制的loadCommands,來把本身注入進全部的app當中,而後加載第三方庫。
使用cycript 開始分析對象