Theos是一個越獄開發(fā)工具包,與其他越獄開發(fā)工具相比洲炊,最大的特點就是簡單:下載安裝簡單飘哨、Logos語法簡單胚想、編譯發(fā)布簡單,可以讓使用者把精力都放在開發(fā)工作上去芽隆。
1.安裝Xcode與Command Line Tools
一般來說浊服,iOS開發(fā)者都會安裝Xcode统屈,其中附帶 了Command Line Tools。
2.下載Theos
從GitHub上下載Theos牙躺,操作如下:
export THEOS=/opt/theos
sudo git clone git://github.com/DHowett/theos.git $THEOS
3.配置ldid
ldid是專門用來簽名iOS可執(zhí)行文件的工具愁憔,用以在越獄iOS中取代Xcode自帶的codesign。從該網(wǎng)站下載ldid孽拷,把它放在“/opt/theos/bin/”下吨掌,然后用以下命令賦予它可執(zhí)行權限:
sudo chmod 777 /opt/theos/bin/ldid
4.配置CydiaSubstrate
首先運行Theos的自動化配置腳本,新版本Theos請直接跳過乓搬。
5.配置dpkg-deb
deb是越獄開發(fā)安裝包的標準格式思犁,dpkg-deb是一個用于操作deb文件的工具,有了這個工具进肯,Theos才能正確地把工程打包成為deb文件激蹲。
從該網(wǎng)站下載dm.pl,將其重命名為dpkg-deb后江掩,放到“/opt/theos/bin/”目錄下学辱,然后用以下命令賦予其可執(zhí)行權限:
sudo chmod 777 /opt/theos/bin/dpkg-deb
6.配置Theos NIC templates
Theos NIC templates內(nèi)置了5種Theos工程類型的 模板,方便創(chuàng)建多樣的Theos工程环形。除此以外策泣,還可 113 以從這里獲取額外的5種模板,下載 后將解壓得到的5個.tar文件復制 到“/opt/theos/templates/iphone/”下即可抬吟。
7.Theos用法介紹
- 1.創(chuàng)建工程
1)更改工作目錄至常用的iOS工程目錄(如筆者的是“/Users/liu/1/Code/”)萨咕,然后輸 入“/opt/theos/bin/nic.pl” ,啟動NIC(New Instance Creator)火本。在逆向工程初級階段危队,所開發(fā)程序的主要類型是tweak。
2)選擇“12”钙畔,即創(chuàng)建一個tweak工程茫陆。
3)輸入tweak的工程名稱。
4)輸入deb包的名字(類似于bundleidentifier)擎析。
5)輸入tweak作者的名字簿盅。
6)輸入“MobileSubstrate Bundle filter” ,也就是 tweak作用對象的bundle identifier揍魂。
7)輸入tweak安裝完成后需要重啟的應用桨醋,以進程名表示。
簡單的7步完成之后现斋,一個名為iosreproject的文件夾就在當前目錄生成了喜最,該文件夾里就是剛創(chuàng)建的tweak工程。 - 2.定制工程文件
先來看看剛剛生成的工程目錄步责,只有4個文件返顺。
(1)Makefile
Makefile文件指定工程用到的文件、框架蔓肯、庫等信息遂鹊,將整個過程自動化。內(nèi)容如下:
include theos/makefiles/common.mk
TWEAK_NAME = iOSREProject
iOSREProject_FILES = Tweak.xm
include $(THEOS_MAKE_PATH)/tweak.mk
after-install::
install.exec "killall -9 SpringBoard"
逐行解讀:
include theos/makefiles/common.mk
固定寫法蔗包,不需更改秉扑。
TWEAK_NAME = iOSREProject
tweak的名字,即用Theos創(chuàng)建工程時指定 的“Project Name” 调限,跟control文件中的“Name”字段對 應舟陆,不要更改。
iOSREProject_FILES = Tweak.xm
tweak包含的源文件(不包括頭文件)耻矮,多個文件間以空格分隔秦躯,可以按需更改。
include $(THEOS_MAKE_PATH)/tweak.mk
根據(jù)不同的Theos工程類型裆装,通過include命令指定不同的.mk文件踱承;在逆向工程初級階段,我們開發(fā)的一般是Application哨免、Tweak和Tool三種類型的程序茎活,它們對應的.mk文件分別是application.mk、tweak.mk和tool.mk琢唾,可以按需更改载荔。
after-install::(回車)install.exec "killall -9 SpringBoard"
在tweak安裝之后殺掉SpringBoard進程,好讓CydiaSubstrate在進程啟動時加載對應的dylib采桃。
Makefile里的默認內(nèi)容確實非常簡單懒熙,但有點簡單過頭了。如何指定SDK版本芍碧?怎么導入framework煌珊?lib文件在哪里鏈接?作為iOS開發(fā)者的你一定會提出這些問題泌豆。
指定處理器架構
ARCHS = armv7 arm64
值得注意的是定庵,采用arm64架構的App不兼容armv7/armv7s架構,必須適配arm64架構的dylib踪危。在絕大多數(shù)情況下蔬浙,這里固定填寫“arm7 arm64”就行了。
指定SDK版本
TARGET = iphone:Base SDK:Deployment Target
TARGET = iphone:8.1:8.0
TARGET = iphone:latest:8.0
導入framework
iOSREProject_FRAMEWORKS = framework name
iOSREProject_FRAMEWORKS = UIKit CoreTelephony CoreAudio
iOSREProject_PRIVATE_FRAMEWORKS = private framework name
iOSREProject_PRIVATE_FRAMEWORKS = AppSupport ChatKit IMCore
鏈接Mach-O對象
iOSREProject_LDFLAGS = -lx
iOSREProject_LDFLAGS = -lz –lsqlite3.0 –dylib1.o
libsqlite3.0.dylib贞远、libz.dylib和dylib1.o
(2)Tweak.xm
用Theos創(chuàng)建tweak工程畴博,默認生成的源文件是Tweak.xm±吨伲“xm”中的“x”代表這個文件支持Logos語法俱病,如果后綴名是單獨一個“x”官疲,說明源文件支持Logos和C語法;如果后綴名是“xm”亮隙,說明源文件支持Logos和C/C++語法途凫,與“m”和“mm”的區(qū)別類似。最基本的Logos語法溢吻,包含%hook维费、%log、%orig這3個預處理指令促王,它們的作用如下犀盟。
%hook
指定需要hook的class,必須以%end結尾蝇狼,如下:
%hook SpringBoard
- (void)_menuButtonDown:(id)down
{
NSLog(@"You've pressed home button.");
%orig; // call the original _menuButtonDown:
}
%end
這段代碼的意思是鉤自某搿(hook)SpringBoard類里的_menuButtonDown:函數(shù),先將一句話寫入syslog迅耘,再執(zhí)行函數(shù)的原始操作恶阴。
%log
該指令在%hook內(nèi)部使用,將函數(shù)的類名豹障、參數(shù)等信息寫入syslog冯事,可以以%log([(<type>)<expr>,...])的格式追加其他打印信息,如下:
%hook SpringBoard
- (void)_menuButtonDown:(id)down
{
%log((NSString *)@"iOSRE", (NSString *)@"Debug");
%orig; // call the original _menuButtonDown:
}
%end
%orig
該指令在%hook內(nèi)部使用血公,執(zhí)行被鉤钻墙觥(hook)的函數(shù)的原始代碼,如下:
%hook SpringBoard
- (void)_menuButtonDown:(id)down
{
NSLog(@"You've pressed home button.");
%orig; // call the original _menuButtonDown:
}
%end
(3)control
control文件記錄了deb包管理系統(tǒng)所需的基本信息累魔,會被打包進deb包里摔笤。
(4)iOSREProject.plist
這個plist文件的作用和App中的Info.plist類似,它記錄了一些配置信息垦写,描述了tweak的作用范圍吕世。我們可以用plutil,也可以用Xcode來編輯它梯投。
-
3.編譯+打包+安裝
(1)編譯
Theos采用“make”命令來編譯Theos工程命辖。在Theos工程目錄下運行make命令,如下: