今天使用theos 進行了一個簡單的hook。下面介紹具體過程,和踩過的一些坑。
一:物理環境
mac os x: 10.11.5
xcode:xcode7.3.1
xcode sdk:ios9.3
越獄手機:iphone4,ios7
有幾點需要注意的地方:
1;mac系統的升級和xcode的安裝頗費周折 具體解決的過程見Xcode編譯器安裝過程說明
2;mac os x系統和越獄手機一定要保證在同一局域網內
3;ios手機上要已經越獄并安裝過openssh。
如上截圖 則安裝了本次試驗的兩個重要的源:Cydia Substrate和openssh。
其中Cydia Substrate則是包含了theos工具,而openssh則使得計算機可以遠程操控ios設備。
openssh默認登錄密碼是:alpine。通常為了設備安全都建議更改密碼。
ssh-keygen?-R?伺服器端的IP或網址 清除舊的ssh登錄證書
二:theos 安裝使用流程
手動下載配置theos十分麻煩,這里有大神做好了準備:去https://github.com/DaSens/Theos-Script下載腳本。
1:將腳本放置在桌面 文件夾內容是
進入文件夾 運行TheosScript.sh腳本文件 一路跑下去 theos安裝配置完成
發現多了個文件opt
在opt里則是我們需要的工具 theos。同時這也是我們工具的路徑,后文中會講到。
2:在創建theos工程之前,我們先來創建目標hook app。
介紹下這個app
a;這個app即是在viewController界面上創建一個紅色button,點擊這個button,這個button上即會出現you are ok的字樣。
b;這個app的bundle ID是com.antiy.chendan
c;這個app的名字叫做test1
之所以沒有hook app的私有函數發短信這個接口,是因為測試機iphone sim卡失效
下面是運行這個app的結果
目標app已有,現在要做的事情就是hook 它的- (void)buttonClick:(id)sender函數,使得按鈕按下去顯示you are under control。
3:創建theos工程
a:在桌面上創建test_hook的文件夾,這個文件夾作為工程文件夾
b:cd 進入這個文件夾 終端執行/opt/theos/bin/nic.pl
將會啟動theos工程的創建過程,這過程中會一一配置工程參數
首先會出現
選擇11
然后會要求輸入Project Name:(輸入創建的theos工程的名字,本例 test1)
再要求輸入Package Name:(輸入hook app的bundle ID,本例com.antiy.chendan)
再要求輸入Author/Maintainer Name:(輸入作者的名字,這個跟工程關系不大,但最后在Cydia源中會顯示這些信息,本例chendan)
再要求輸入hook app的bundle ID:(本例com.antiy.chendan)
最后輸入SpringBoard啟動項:為空(不填,直接回車)
經過這個過程theos的工程就創建完畢 如下圖
下面分別來介紹一下這個四個文件的意義
control:控制文件,本demo不會用到。
test1.plist:目標hook app的bundle ID存儲在這里,可隨時更改
Makefile:重新打包配置文件
Tweak.xm:hook的具體細節在這里編碼,主要采用logos標識符來hook操作
下面給出Makefile的最終文件形式
Makefile文件最開始的時候 這里大部分項都沒有 都是需要配置的
export THEOS=/opt/theos:配置文件執行路徑(如果沒有這個,是找不到tweak.mk文件的,終端會報錯)
THEOS_DEVICE_IP = 192.168.202.232:hook的越獄設備的IP地址,上文提過,必須mac電腦和越獄設備在同一局域網內,不然無法用openssh登錄進行操作
ARCHS = armv7 arm64:不同的iphone機型配置不同的,本例iphone4,使用的是armv7,如不放心,可把armv7,armv7s,arm64全帶上
TARGET = iphone:latest:9.3:xcode使用的sdk
TWEAK_NAME = test1:teak工程的名字,這個在工程創建的時候就已經有配置過,不能更改
test1_FILES = Tweak.xm:目標hook文件,就在那四個文件之一
test1_FRAMEWORKS = UIKit:hook操作中使用到的ios框架,如使用了私有函數則還需要添加test1_PRIVATE_FRAMEWORKS =
剩下的就不用介紹了,安裝完成,終止進程,重新啟動SpringBoard。
接下來給出Tweak.xm的hook細節
接下來諸事準備完畢,可以開始hook。
利用終端cd進入你創建的tweak項目目錄,然后執行make package install,然后輸入兩次ssh的連接密碼(ssh 默認密碼alpine),
然后設備就會重啟SpringBoard,然后我們再次打開HOOK的APP發現按鈕的點擊方法已經被替換了。
三:Cydia源
在Cydia源里查看如下
可知這個app被順利的hook住了。此后無論xcode運行多少次,這個函數仍然是被hook住的,原來的此處代碼無效。
要想恢復之前的app,可進入這個test1
然后卸載即可。
而且我發現 通過theos創建application然后給iphone安裝的應用是具有最高權限的,刪不掉。不得不說越獄開發真的有點變態。
這也就是那些基于系統的定制化開發,安卓上比比皆是,蘋果上只有越獄了應用才能取得這種權限,一旦系統更新,不再越獄,則IOS對這個應用收回這個權限。
四:原理淺探
1,Cydia Substrate 和 Mobile Substrate
Cydia Substrate 原名為 Mobile Substrate 已經正式更名為 Cydia Substrate。
它是越獄后cydia插件/軟件運行的一個基礎依賴包。提供軟件運行的公共庫,可以用來動態替換
內存中的代碼、數據等所以iOS系統越獄環境下安裝絕大部分插件,必須首先安裝Cydia Substrate。
Cydia Substrate主要由3部分組成:MobileHooker,MobileLoader 和 safe mode。
2,MobileHooker、Logos
MobileHooker用于替換覆蓋系統的方法,這個過程被稱為Hooking(掛鉤)它主要包含兩個函數:voidMSHookMessageEx(Classclass, SEL selector, IMP replacement, IMP *result);voidMSHookFunction(void*function,void* replacement,void** p_original);MSHookMessageEx 主要作用于Objective-C函數MSHookFunction 主要作用于C和C++函數Logos語法就是對此函數做了一層封裝,讓編寫hook代碼變的更直觀,上面的例子用的就是logos語法。MSHookMessageEx 和MSHookFunction 使用方法這里就不介紹了,大家可去看書籍或者查詢相關資料。
3,MobileLoader
MobileLoader用于加載第三方dylib在運行的應用程序中。
啟動時MobileLoader會根據dylib的同名plist文件指定的作用范圍,有選擇的在不同進程里通過dlopen函數打開目錄/Library/MobileSubstrate/DynamicLibraries/ 下的所有dylib。
4,safe mode
因為APP程序質量參差不齊崩潰再所難免,tweak本質是dylib,寄生在別人進程里,如果注入Springboard等。系統進程一旦出錯,可能導致整個進程崩潰,崩潰后就會造成iOS癱瘓。
所以CydiaSubstrate引入了安全模式,在安全模式下所有基于CydiaSubstratede 的三方dylib都會被禁用,便于查錯與修復。
建議自己測試的時候如果HOOK Springboard的時候一定要注意!如果出錯,進入安全模式刪除插件即可。
參考資料:http://www.lxweimin.com/p/8982e9670fc6,http://www.lxweimin.com/p/2d2c492a283c