複製鏈接
請複製以下鏈接發送給好友

MobileSubstrate

鎖定
MobileSubstrate實際上是一個框架,允許第三方的開發者在系統的方法裏打一些運行時補丁以擴展一些方法,類似於OS X上的Application Enhancer。所以iOS系統越獄環境下安裝絕大部分插件,必須首先安裝MobileSubstrate。
中文名
MobileSubstrate
定    位
框架
人    物
第三方的開發者
分    類
網絡

MobileSubstrate組成部分

MobileSubstrate主要由3部分組成:MobileHooker,MobileLoader和safe mode。

MobileSubstrate組件功能

MobileHooker
MobileHooker用於替換覆蓋系統的方法,這個過程被稱為Hooking(掛鈎)。將使用到2個API:
IMP MSHookMessage(Class class, SEL selector, IMP replacement,constchar* prefix);// prefix should be NULL.
void MSHookMessageEx(Class class, SEL selector, IMP replacement, IMP *result);
void MSHookFunction(void*function,void* replacement,void** p_original);
MSHookMessage()在Objective-C中替換implementation。[class Selector] 通過替換並返回原來的執行。掛鈎一個類的方法,在MSHookemessage(EX)中調用Objc_getMetaClass得到提供的元數據和類檢索,例如下面的註釋。這種動態替換是Objective-C的一個功能,使用method_setImplementation。MSHookMmessage()是線程不安全的,不贊成使用,建議使用MSHookMessageEx函數。
MSHookFunction() 很像 MSHookMessage() 但是 適合於c/c++ 的函數。MSHookFunctin() 將寫入指令調入指定替換函數,並且會分配一些字節在內存地址,相當於原始切出指令並且跳入原始的掛鈎方法。由於iPhone系統默認的內存頁不能同時寫和執行,一個內核補丁必須申請MSHookFunction() 工作.
截止MobileSubstrate的最新版本,MSHookMessage() 也需要一個內核補丁調用關閉的掛鈎的所有正確方法。
MobileLoader
MobileLoader加載第三方補丁代碼在運行的應用程序中。
MobileLoader先加載它自己在運行的應用程序中時使用DYLD_INSERT_LIBRARIES環境變量。然後查看所有動態庫在目錄/Library/MobileSubstrate/DynamicLibraries/
並且 Dlopen 他們(Dlopen是供用户直接訪問(存取)動態鏈接庫的一類函數中的一個)。一個擴展將要使用構造函數代碼去完成一些工作.
...
// The attribute forces this function to be called on load.
__attribute__((constructor))
staticvoid initialize(){
NSLog(@"MyExt: Loaded");
MSHookFunction(CFShow, replaced_CFShow, &original_CFShow);
}
safe mode
當一個擴展在SpringBoard崩潰,MobileLoader 會進入設備的安全模式捕捉並且處理。在安全模式下,所有的第三放擴展將失效。
下列信號將調用的安全模式:
SIGTRAP
SIGABRT
SIGILL
SIGBUS
SIGSEGV
SIGSYS [1] 
參考資料