一、介紹及安裝
1.簡介
Theos是一個越獄開發(fā)包脓豪。與其它工具相比巷帝,它的特點(diǎn)就是簡單:下載安裝簡單、Logos語法簡單扫夜、編譯發(fā)布簡單楞泼。
2.安裝
2.1 安裝Xcode與Command Line Tools
需要注意的是,如果Mac上有安裝多個版本的Xcode笤闯,則需要使用xcode-select命令指定一個活動Xcode堕阔,即Theos默認(rèn)使用的Xcode。假設(shè)安裝了2個Xcode颗味,并將它們分別命名為Xcode1.app印蔬、Xcode2.app,若要指定Xcode2.app為活動Xcode脱衙,則運(yùn)行如下命令即可:
sudo xcode-select - s /Applications/Xcode2.app/Contents/Developer
2.2 安裝dpkg和ldid
ldid是一款二進(jìn)制授權(quán)管理軟件侥猬,可以對越獄應(yīng)用進(jìn)行SHA1運(yùn)算生成授權(quán),讓軟件包可以在iPhone上執(zhí)行捐韩。我們使用Homebrew來安裝它們退唠。Homebrew是一款Mac上基于Ruby的包管理器。使用如下命令:
brew install dpkg ldid
如果沒有安裝Homebrew荤胁,那么需要先安裝Homebrew瞧预,使用如下命令即可(可能需要VPN環(huán)境):
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
2.3 安裝Theos
將Theos安裝在/opt/theos,使用如下命令:
sudo Git clone --recursive https://github.com/theos/theos.git /opt/theos
然后把/opt/theos的權(quán)限改成你自己:
sudo chown $(id -u):$(id -g) /opt/theos
最后把theos的執(zhí)行路徑加入到環(huán)境變量中仅政,在~/.bash_profile中加上:
export THEOS="/opt/theos"
2.4 測試
在任意目錄下(不能是/opt/theos下垢油,否則將創(chuàng)建不成功),輸入如下命令創(chuàng)建Theos項(xiàng)目:
/opt/theos/bin/nic.pl NIC 2.0 - New Instance Creator
可以看到這里共有12種模板可供選擇圆丹,這里我們選擇tweak -> 輸入Package Name(deb包的名字滩愁,類似于bundle identifier)-> tweak的名字 -> 輸入”MobileSubstrate Bundel filter“,也就是tweak作用對象的bundle identifier辫封,如:com.apple.springboard -> Done完成硝枉。
二廉丽、工程文件說明
在上一步安裝完成Theos并測試通過后,在指定目錄會看到一個創(chuàng)建好的新目錄妻味,里面會有四個文件正压。分別是:Makefile、control责球、NIC.plist焦履、Tweak.xm,正面將一一對其進(jìn)行說明雏逾。
1.Makefile
Makefile文件指定工程用到的文件裁良、框架、庫等信息校套,將整個過程自動化价脾。其內(nèi)容說明如下(NIC表示項(xiàng)目名稱)
include $(THEOS)/makefiles/common.mk?
#固定寫法,不要更改笛匙。TWEAK_NAME = NIC #Tweak名稱跟control文件中的”Name“字段對應(yīng)侨把,一般不要更改(但我注意到,在創(chuàng)建Tweak的時候并沒有提示要輸入Project Name就默認(rèn)生成了NIC)妹孙。
NIC_FILES = Tweak.xm?
#Tweak包含的源文件(不包括頭文件)秋柄,多個文件間以空格分隔,可以按需要更改蠢正。
export ARCHS = armv7 arm64?
#默認(rèn)文件未提供骇笔。支持的處理器架構(gòu),多個以空格分隔嚣崭。需要注意的是笨触,采用arm64架構(gòu)的App不兼容armv7/armv7s架構(gòu),必須適配arm64架構(gòu)的dylib雹舀。在絕大多數(shù)情況下芦劣,這里固定填寫”arm7 arm64“就可以了。
TARGET = iphone:Base SDK:Deployment Target?
#指定SDK版本说榆。如:iphone:8.1:8.0表示指定彩8.1版本的SDK虚吟,且發(fā)布對象為iOS8.0及以上版本。也可以把”Base SDK“設(shè)置為”latest“签财,指定以Xcode附帶的最新版本SDK編譯串慰。
export NIC_FRAMEWORKS = framework name?
#默認(rèn)文件未提供。導(dǎo)入framework唱蒸。如:NIC_FRAMEWORKS = UIKit CoreAudio
export NIC_PRIVATE_FRAMEWORKS = private framework name
#默認(rèn)文件未提供邦鲫。導(dǎo)入private framework。如:NIC_FRAMEWORKS = AppSupport ChatKit油宜。需要注意的是:在導(dǎo)入之前一定要確定導(dǎo)入的private framework確實(shí)存在掂碱,因?yàn)閜rivate framework是AppStore開發(fā)所不允許使用的怜姿,它的內(nèi)容在每個iOS版本之間可能發(fā)生變化慎冤。如:BaseBoard框架在iOS8以上存在疼燥,在iOS7就沒有。這種情況通過弱鏈接或dlopen()蚁堤、dlsym()和dlclose()系列函數(shù)動態(tài)調(diào)用private framework來解決醉者。
export NIC_LDFLAGS = -lx?
#默認(rèn)文件未提供。鏈接Mach-O對象披诗。Theos采用GNU Linker來鏈接Mack-O對象撬即,包括.dylib、.a和.o呈队。-lx代表鏈接libx.a或libx.dylib剥槐,即給”x“加上”lib“的前綴,以及“.a”或“.dylib”的后綴宪摧;如果x是“y.o”的形式粒竖,則直接鏈接y.o,不加任何前綴或后綴几于。如要鏈接libsqlite3.0.dylib蕊苗、libz.dylib和dylib1.o,這樣寫就行:NIC_LDFLAGS = -lz -lsqlite3.0 -dylib1.o
include $(THEOS_MAKE_PATH)/tweak.mk?
#根據(jù)不同的Theos工程類型沿彭,指定不同的.mk文件朽砰。可以按需更改喉刘。
after-install::install.exec "killall -9 SpringBoard"?
#表示在Tweak安裝之后殺掉SpringBoard進(jìn)程瞧柔,好讓CydiaSubstrate在進(jìn)程啟動時加載對應(yīng)的dylib。
2.Tweak.xm
用Theos創(chuàng)建tweak工程睦裳,默認(rèn)生成的源文件是Tweak.xm非剃。“xm”中的“x”代表這個文件支持Logos語法推沸,如果后綴名是單獨(dú)一個“x”备绽,說明源文件支持Logos和C語法;如果后綴名是“xm”鬓催,說明源文件支持Logos和C/C++語法肺素。(Logos語法在這里不贅述)
3.control
control文件記錄了deb包管理系統(tǒng)所需的基本信息,會被打包進(jìn)deb包里宇驾”睹遥基本字段說明:
Package:用于描述這個deb包的名字,采用的命名方式同bundle identifier類似课舍,均為反向DNS格式塌西∷妫可以按需更改。Name:用于描述這個工程的名字捡需,可以按需更改办桨。
Depends:用于描述這個deb包的“依賴”≌净裕“依賴”指的是這個程序運(yùn)行的基本條件呢撞,可以填寫固件版本或其它程序,如果當(dāng)前iOS不滿足“依賴”中定義的條件饰剥,則此tweak無法正常運(yùn)行殊霞。如:Depends:mobilesubstrate,firmware(>=8.0)表示當(dāng)前iOS版本必須在8.0以上,且必須安裝CydiaSubstrate才能正常運(yùn)行這個tweak汰蓉,可以按需更改绷蹲。
Version:用于描述這個deb包的版本號,可以按需更改顾孽。
Architecture:用于描述deb包安裝的目標(biāo)設(shè)備架構(gòu)祝钢,不要更改。
Description:是deb包的簡介岩齿,可以更改太颤。
Maintainter:用于描述deb包的維護(hù)人,可以按需更改盹沈。
Author:用于描述tweak的作者龄章,可以按需更改。
Section:用于描述deb包所屬的程序類別乞封,不要更改做裙。
4.NIC.plist
該plist文件的作用和App中的Info.plist類似,它記錄了一些配置信息肃晚,描述了tweak的作用范圍锚贱。通過Xcode打開該文件,我們可以看到它的最外層是一個Dictionary关串,只有一個名為“Filter”的鍵拧廊。Filter下是一系列Array,可以分為三類:
Bundle:指定若干bundle為tweak的作用對象晋修。如:com.apple.springboard
Classes:指定若干class為tweak的作用對象吧碾。如:NSString
Executables:指定若干可執(zhí)行文件為tweak的作用對象。如:callservicesd
這三類Array可以混合使用墓卦,但當(dāng)Filter下有不同類的Array時倦春,需要添加一個“Mode: Any”鍵值對。當(dāng)Filter下的Array只有一類時,不需要添加睁本。
三尿庐、編譯、打包呢堰、安裝
1.編譯
Theos采用“make”命令來編譯Theos工程抄瑟。在Theos目錄下運(yùn)行make命令。(需要注意:xm文件語法不要有錯誤暮胧,支持c,oc語法)執(zhí)行“make”命令后會在工程目錄下生成/obj/debug文件(沒錯誤的話)锐借,但里面都是空的问麸。(這里與其它資料上不一樣)這里先不用管這些往衷,繼續(xù)執(zhí)行后面的命令。
2.打包
使用“make package”命令來打包严卖,這里其它是先執(zhí)行make命令再執(zhí)行dpkg-deb命令席舍。執(zhí)行完成后會在工程目錄下生成/packages/xxx.deb文件。該文件就是可以直接安裝在iOS上的安裝包哮笆。
3.安裝
3.1 圖形界面安裝
即先將打包好的deb文件通過iFunBox導(dǎo)入手機(jī)目錄来颤,然后在iPhone手機(jī)上通過iFile工具安裝。(安裝成功后可能需要重啟手機(jī)稠肘,視tweak功能而定福铅,未親測)。
3.2 命令行安裝
3.2.1 安裝OpenSSH
在越獄手機(jī)上OpenSSH工具项阴,通過命令行安裝deb需要用到其中的scp功能滑黔。
3.2.2 添加配置行
在Makefile的最上一行(也就是第一行,也必須是第一行环揽,不然會出錯)加上手機(jī)的IP地址略荡,如:
export THEOS_DEVICE_IP = 10.200.201.22 (手機(jī)本地IP)
3.2.3 執(zhí)行安裝命令
在確保Mac與iPhone在同一局域網(wǎng)的前提下,執(zhí)行以下命令:
make package install
在整個安裝過程中會輸入兩次手機(jī)的root密碼歉胶,如果想在安裝過程中實(shí)現(xiàn)一次性安裝汛兜,即不需要輸入密碼的話,需要設(shè)置iOS的authorized_keys通今。步驟如下:
3.2.3.1 刪除Host數(shù)據(jù)?
刪除Mac上”/Users/hjs<本機(jī)用戶名>/.ssh/known_hosts“文件中iOSIP對應(yīng)的條目粥谬。如果你的iPhone's IP是10.112.12.30,那么在該文件對應(yīng)的數(shù)據(jù)則是:10.112.12.30=xxxxx<很長一串密鑰>辫塌,將這一段數(shù)據(jù)刪掉漏策。
3.2.3.2 生成authorized_keys
在Mac終端執(zhí)行如下命令:
ssh-keygen -t rsa <遇到提示直接回車>
...
cp /Users/hjs<本機(jī)用戶名>/.ssh/id_rsa.pub ~/authorized_keys
3.2.3.3 配置iOS
在Mac終端通過ssh命令以root用戶連接上iPhone(如:ssh root@10.112.12.30),連接上之后執(zhí)行如下命令:
ssh-keygen <遇到提示直接回車>
...
logout <退出ssh>
scp ~/authorized_keys root@10.112.12.30<手機(jī)IP>:/var/root/.ssh
3.2.3.4 清理
在上一步驟中配置好后璃氢,再次執(zhí)行make package install之前需要清理之前生成的文件哟玷,否則將安裝不成功。執(zhí)行以下命令達(dá)到清理的目的:
make clean
rm -rf ./obj ./packages
再次執(zhí)行安裝命令將不會再要求輸入密碼,達(dá)到一鍵安裝的目的巢寡。
4.可能出現(xiàn)的錯誤
clang: warning: libstdc++ is deprecated; move to libc++ with a minimum deployment target of iOS 7
檢查.xm文件中是否有語法錯誤喉脖,注釋位置是否正確,也有可能是某個框架未導(dǎo)入抑月。
dpkg-deb: error: obsolete compression type 'lzma'; use xz instead
修改opt/theos/makefiles/package/deb.mk中第六行:THEOSPLATFORM_DPKG_DEB_COMPRESSION ?= lzma 將最后的lzma 改成 xz树叽,這樣改固然暫時不會報(bào)錯了,但后面可能還是會出錯谦絮,所以這里建議直接將lzma 改成 gzip题诵。
Error: /Applications/Xcode.app/Contents/Developer/usr/bin/make install requires that you set THEOS_DEVICE_IP in your environment.
出現(xiàn)這個錯誤說明沒有把3.2中的 export THEOS_DEVICE_IP = 10.200.201.22 (手機(jī)本地IP)寫在第一行所致。
dpkg-deb (subprocess): unable to execute decompressing archive member (xz): No such file or directorydpkg-deb (subprocess): subprocess decompressing archive member returned error exit status 2dpkg-deb: error: subprocessreturned error exit status 2
dpkg: error processing archive /tmp/_theos_install.deb (--install):
subprocess dpkg-deb --fsys-tarfile returned error exit status 2
Errors were encountered while processing:
/tmp/_theos_install.deb
make: *** [internal-install] Error 1
如果在出現(xiàn)上面第2個錯誤時是將lzma->xz的話层皱,后面可能會出現(xiàn)此錯誤性锭,解決方法是將lzma->gzip即可。
/* 本文參考《iOS應(yīng)用逆向工程》一書所進(jìn)行的總結(jié)叫胖,所有步驟也是經(jīng)過親自驗(yàn)證草冈,可能與書中有微小的出入 */