確定需要進行hook的物件。
例如:我打算在系統每次傳遞訊息之前,都進行一些定製的處理,那麼就可以hook uiwindow的sendevent函式。
新建乙個工程普通base view普通工程專案,專案名稱為hook2
messagehook.h
#import #ifndef __message_hook_h__
#define __message_hook_h__
extern "c"
#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)
注意該實現函式的檔名稱字尾為.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()
編譯成功之後生成的hook2資料夾,顯示包內容,更改其中的hook2檔案為hook2.dylib, 即可通過iphone explorer來將hook2.dylib放置到/library/mobilesubstate/dynamiclibraries資料夾中,respring,就看以看到任何一次拖動介面等操作,都會列印出replease_uiwindow_sendevent is call in hook2,說明我們的事件截獲成功了。
**:
在iphone越獄機器中使用Hook
在iphone越獄機器中使用hook 確定需要進行hook的物件。例如 我打算在系統每次傳遞訊息之前,都進行一些定製的處理,那麼就可以hook uiwindow的sendevent函式。新建乙個工程普通base view普通工程專案,專案名稱為hook2 messagehook.h import i...
在iphone越獄機器中使用Hook
在iphone越獄機器中使用hook 確定需要進行hook的物件。例如 我打算在系統每次傳遞訊息之前,都進行一些定製的處理,那麼就可以hook uiwindow的sendevent函式。新建乙個工程普通base view普通工程專案,專案名稱為hook2 messagehook.h import i...
在iPhone應用中使用自定義字型
iphone系統的字型數量有限,並且多數對中文沒有效果,下面介紹兩種解決辦法 方法1 新增對應的字型 ttf或.odf 到工程的resurce,使用cocos2d中的fontlabel庫,fontlabel繼承於uilabel,象uilabel一樣使用就好了 fontname直接使用新增的資源名字即...