在iphone越獄機器中使用Hook
由於有不少朋友http://www.cnblogs.com/ydhliphonedev/archive/2011/12/01/2270020.html需要該文章的Demo,一個個發送比較麻煩,我寫了個類似的Demo,放在csdn上,無需積分,如有需要可直接下載。工程文件等都是按照文章描述的方式進行創建的。另libsubstrate.dylib非i386架構的,故必須使用真機編譯,真機調試。
下載地址:http://download.csdn.net/detail/pp1pp1pp2/5253930
在iphone越獄機器中使用Hook
- 下載libsubstrate.dylib動態庫及substrate.h頭文件,加入項目中。該動態庫由越獄團隊提供,使用該動態庫,可以動態更換內存的代碼。關於MobileSubstrate wiki上有篇文章說得很好。
- 確定需要進行hook的對象。
例如:我打算在系統每次傳遞消息之前,都進行一些定製的處理,那麼就可以Hook UIWindow的sendEvent函數。
新建一個工程普通base view普通工程項目,項目名稱爲Hook2
MessageHook.h
#import
<UIKit/UIKit.h> #ifndef
__MESSAGE_HOOK_H__ #define
__MESSAGE_HOOK_H__ extern "C" { extern IMP
original_UIWindow_sendEvent; extern void replace_UIWindow_sendEvent(UIWindow
* self ,
SEL cmd,
UIEvent *event); } #endif
// __MESSAGE_HOOK_H__ |
MessageHook.mm
#import
"MessageHook.h" //
定義需要被hook的函數 IMP
original_UIWindow_sendEvent; //
定義hook函數 void replace_UIWindow_sendEvent(UIWindow
* self ,
SEL cmd,
UIEvent *event) { NSLog (@ "replease_UIWindow_sendEvent
is call In Hook2" ); original_UIWindow_sendEvent( self ,
cmd, event); } |
注意該實現函數的文件名稱後綴爲.mm,也即支持C++混合編譯,否則在導入C/C++類型的頭文件或相關代碼時,編譯會報錯。
MessageHook.h包括被hook函數的聲明以及hook函數的聲明。
- 在XCode中配置OTHER_LDFLAGS爲-init _$(PROJECT_NAME)Initialize –lsubstrate –dynamiclib
(OTHER_LDFLAGS 在Build Settings----Linking-----Other Linker Flags)
表示在連接階段需要subsrate以及dynaliclib動態庫。而-init $(PROJECT_NAME)Initialize則是定義工程所編譯出來的動態庫加載過後的初始化函數。
由於我們的工程項目名稱爲Hook2,所以我們需要新建一個文件爲Hook2Initialize.mm,在運行時,系統會根據聲稱的dylib來尋找初始化函數,該函數是$(PROJECT_NAME)文件中的$(PROJECT_NAME)Initialize函數。
故在Hook2Initialize.mm中包含Hook2Initialize的函數實現.
#import
"substrate.h" #import
"MessageHook.h" extern "C" void Hook2Initialize() { NSLog (@ "Hook2Initialize
Start." ); NSAutoreleasePool *pool
= [[ NSAutoreleasePool alloc]
init]; //
配置被hook的函數以及hook函數以及指向被hook函數的函數指針(IMP)之間的關聯 MSHookMessageEx([UIWindow
class ],
@selector (sendEvent:),
(IMP)replace_UIWindow_sendEvent, (IMP *)&original_UIWindow_sendEvent); [pool
release]; NSLog (@ "Hook2Initialize
End." ); } |
編譯成功之後生成的Hook2文件夾,顯示包內容,更改其中的Hook2文件爲Hook2.dylib, 即可通過iphone explorer來將Hook2.dylib放置到/Library/MobileSubstate/DynamicLibraries文件夾中,ReSpring,就看以看到任何一次拖動界面等操作,都會打印出replease_UIWindow_sendEvent is call In Hook2,說明我們的事件截獲成功了。
這邊我不知道怎麼上傳附件,所以每辦法去上傳示例工程。有知道的可以告訴我,不甚感激
大家可以加入QQ羣:3078698,進行討論。