在iphone越獄機器中使用Hook

在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

  1. 下載libsubstrate.dylib動態庫及substrate.h頭文件,加入項目中。該動態庫由越獄團隊提供,使用該動態庫,可以動態更換內存的代碼。關於MobileSubstrate wiki上有篇文章說得很好。
  2. 確定需要進行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函數的聲明。

  1. 在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,進行討論。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章