Theos是一個(gè)越獄開(kāi)發(fā)包, 也是逆向中比較重要也是最有意思的工具, 它可以讓你的想法變成現(xiàn)實(shí), 編寫(xiě)自己的tweak對(duì)有開(kāi)發(fā)熱情的人來(lái)說(shuō)是一件非常有趣的事情!
網(wǎng)上大多數(shù)還都是上古版本的theos教程, 都已經(jīng)過(guò)時(shí)了, 可能越獄開(kāi)發(fā)或者iOS逆向已經(jīng)大不如從前了, 也沒(méi)找到適合現(xiàn)在的, 好在開(kāi)發(fā)者還一直維護(hù), 現(xiàn)在整理一份當(dāng)前最新的安裝和基本使用教程.
安裝和部署
先決條件
macOS環(huán)境
- 安裝xcode
- 安裝Command Line Tools
xcode-select --install
$brew install ldid
- 安裝Perl module
$brew install xz
$sudo cpan IO::Compress::Lzma
安裝
- 設(shè)置環(huán)境變量, 你也可以把這句話加入到.base_profile, 詳見(jiàn)在當(dāng)前用戶新建一個(gè)bash_profile.
export THEOS=~/theos
- 從GitHub克隆項(xiàng)目
$git clone --recursive https://github.com/theos/theos.git $THEOS
不要忘記--recursive, 因?yàn)槔锩孢€包含了一些別的git庫(kù)
如果你已經(jīng)clone下來(lái)了, 那么使用這個(gè)命令來(lái)更新就可以了
$ $THEOS/bin/update-theos
至此最基本的配置和安裝就搞定了, 再也沒(méi)有其它上古教程的復(fù)雜配置.
新建項(xiàng)目
$ $THEOS/bin/nic.pl
NIC 2.0 - New Instance Creator
------------------------------
[1.] iphone/activator_event
[2.] iphone/application_modern
[3.] iphone/cydget
[4.] iphone/flipswitch_switch
[5.] iphone/framework
[6.] iphone/ios7_notification_center_widget
[7.] iphone/library
[8.] iphone/notification_center_widget
[9.] iphone/preference_bundle_modern
[10.] iphone/tool
[11.] iphone/tweak
[12.] iphone/xpc_service
Choose a Template (required): 11
Project Name (required): testreproject
Package Name [com.yourcompany.testreproject]:
Author/Maintainer Name [wangyu]: wangyu
[iphone/tweak] MobileSubstrate Bundle filter [com.apple.springboard]:
[iphone/tweak] List of applications to terminate upon installation (space-separated, '-' for none) [SpringBoard]:
Instantiating iphone/tweak in testreproject/...
Done.
很簡(jiǎn)單的過(guò)程, 一個(gè)tweak就新建完成了!
下面我們來(lái)逐行了解一下這些東西
模板
很簡(jiǎn)單的1-12是一對(duì)模板, 我們選擇11 iphone/tweak
Project Name
項(xiàng)目名, 按你心意
Package Name
這個(gè)想必大家都熟悉, 是一個(gè)倒敘的唯一標(biāo)示
Author/Maintainer Name
你的大名!
[iphone/tweak] MobileSubstrate Bundle filter [com.apple.springboard]
作用的APP包, 這個(gè)很重要, 這里默認(rèn)是com.apple.springboard, 就是iOS的桌面程序, 那么就說(shuō)明這個(gè)tweak對(duì)springboard起作用, 這是一個(gè)數(shù)組, 可以輸入若干個(gè).
至于這個(gè)包名從哪找, 在XXX.app中, 查看里面的plist文件就可以了.
[iphone/tweak] List of applications to terminate upon installation
字面意思很明顯了, 程序安裝完成后要kill的進(jìn)程, 這里既然我們要改springboard, 自然安裝后會(huì)殺掉springboard讓其重啟, 好檢驗(yàn)我們的程序是否已經(jīng)運(yùn)行.
Done
關(guān)于Theos更詳細(xì)的信息可以參考wiki
項(xiàng)目目錄詳解
$ cd testreproject
$ ls
Makefile Tweak.xm control testreproject.plist
Makefile
默認(rèn)的內(nèi)容為:
include $(THEOS)/makefiles/common.mk
TWEAK_NAME = testreproject
testreproject_FILES = Tweak.xm
include $(THEOS_MAKE_PATH)/tweak.mk
after-install::
install.exec "killall -9 SpringBoard"
下面我們來(lái)逐行了解
include $(THEOS)/makefiles/common.mk
固定寫(xiě)法
TWEAK_NAME = testreproject
你剛剛輸入的Project Name
testreproject_FILES = Tweak.xm
tweak包含的源文件, 不包括庫(kù)頭文件什么的, 多個(gè)文件以空格分割.
include $(THEOS_MAKE_PATH)/tweak.mk
不同的工程類型, 指定不同的mk文件, 一般會(huì)用到的有Application, Tweak, Tool三種類型的程序, 那么就是對(duì)應(yīng)的application.mk, tweak.mk, tool.mk三個(gè), 按需更改.
after-install::
install.exec "killall -9 SpringBoard"
這個(gè)更簡(jiǎn)單了, 安裝之后要干的事情, 這里是殺掉SpringBoard進(jìn)程.
下面介紹一下其它的常用配置:
- ARCHS = armv7 armv7s arm64 //指定對(duì)應(yīng)的處理器架構(gòu)
- TARGET = iphone:latest:8.0 //指定版本
- testreproject_FRAMEWORKS = UIKit CoreAudio //導(dǎo)入framework
- testreproject_PRIVATE_FRAMEWORKS = AppSupport ChatKit //導(dǎo)入私有庫(kù)
- testreproject_LDFLAGS = -lz -lsqlite3.0 -dylib1.o // 鏈接libsqlite3.0.dylib, libz.dylib和dylib1.o.
Theos采用GNU Linker來(lái)鏈接Mack-O對(duì)象, 包括.dylib, .a和.o.
-lx代表鏈接libx.a或libx.dylib, 即給”x“加上”lib“的前綴, 以及".a"或".dylib"的后綴, 如果x是"y.o"的形式, 則直接鏈接y.o, 不加任何前綴或后綴.
Tweak.xm
默認(rèn)文件如下:
/* How to Hook with Logos
Hooks are written with syntax similar to that of an Objective-C @implementation.
You don't need to #include <substrate.h>, it will be done automatically, as will
the generation of a class list and an automatic constructor.
%hook ClassName
// Hooking a class method
+ (id)sharedInstance {
return %orig;
}
// Hooking an instance method with an argument.
- (void)messageName:(int)argument {
%log; // Write a message about this call, including its class, name and arguments, to the system log.
%orig; // Call through to the original function with its original arguments.
%orig(nil); // Call through to the original function with a custom argument.
// If you use %orig(), you MUST supply all arguments (except for self and _cmd, the automatically generated ones.)
}
// Hooking an instance method with no arguments.
- (id)noArguments {
%log;
id awesome = %orig;
[awesome doSomethingElse];
return awesome;
}
// Always make sure you clean up after yourself; Not doing so could have grave consequences!
%end
*/
文檔里寫(xiě)的很明白了, 如何hook和調(diào)用函數(shù)之類的, 下面只簡(jiǎn)單介紹幾個(gè)主要的語(yǔ)法, 更詳細(xì)的關(guān)于LOGO的詳見(jiàn)這里
%hook ClassName 和 %end
這個(gè)是作為一個(gè)結(jié)構(gòu)存在的, 表示開(kāi)始和結(jié)束
%orig
執(zhí)行原始函數(shù)
%orig(nil, nil);
執(zhí)行原始函數(shù), 并自定義參數(shù)值, 如果用這種函數(shù), 必須寫(xiě)明所有的參數(shù).
control
control文件記錄了deb包管理系統(tǒng)所需的基本信息, 會(huì)被打包進(jìn)deb包里.
Package: com.yourcompany.testreproject
Name: testreproject
Depends: mobilesubstrate
Version: 0.0.1
Architecture: iphoneos-arm
Description: An awesome MobileSubstrate tweak!
Maintainer: wangyu
Author: wangyu
Section: Tweaks
Package
用于描述這個(gè)deb包的名字, 采用的命名方式同bundle identifier類似, 均為反向DNS格式. 可以按需更改.
Name
用于描述這個(gè)工程的名字, 可以按需更改.
Depends
用于描述這個(gè)deb包的依賴.
依賴指的是這個(gè)程序運(yùn)行的基本條件, 可以填寫(xiě)固件版本或其它程序, 如果當(dāng)前iOS不滿足依賴中定義的條件, 則此tweak無(wú)法正常運(yùn)行.
如: Depends:mobilesubstrate,firmware(>=8.0)表示當(dāng)前iOS版本必須在8.0以上, 且必須安裝CydiaSubstrate才能正常運(yùn)行這個(gè)tweak, 可以按需更改.
Version
用于描述這個(gè)deb包的版本號(hào), 可以按需更改.
Architecture
用于描述deb包安裝的目標(biāo)設(shè)備架構(gòu), 不要更改.
Description
是deb包的簡(jiǎn)介, 可以更改.
#######Maintainter
用于描述deb包的維護(hù)人, 可以按需更改.
Author
用于描述tweak的作者, 可以按需更改.
Section
用于描述deb包所屬的程序類別, 不要更改.
Done
關(guān)于control文件的更多信息可以訪問(wèn)這里
testreproject.plist
{ Filter = { Bundles = ( "com.apple.springboard" ); }; }
該plist文件的作用和App中的Info.plist類似, 它記錄了一些配置信息, 描述了tweak的作用范圍.
通過(guò)Xcode打開(kāi)該文件, 我們可以看到它的最外層是一個(gè)Dictionary, 只有一個(gè)名為"Filter"的鍵. Filter下是一系列Array, 可以分為三類:
Bundle
指定若干bundle為tweak的作用對(duì)象. 如:com.apple.springboard
Classes
指定若干class為tweak的作用對(duì)象. 如:NSString
Executables:
指定若干可執(zhí)行文件為tweak的作用對(duì)象. 如:callservicesd
這三類Array可以混合使用, 但當(dāng)Filter下有不同類的Array時(shí), 需要添加一個(gè)"Mode: Any"鍵值對(duì). 當(dāng)Filter下的Array只有一類時(shí), 不需要添加.
編譯, 打包, 安裝
編譯
在根目錄下使用make命令就編譯了, 生成/obj/debug目錄
打包
使用"make package"命令來(lái)打包.
執(zhí)行完成后會(huì)在工程目錄下生成/packages/xxx.deb文件.該文件就是可以直接安裝在iOS上的安裝包.
安裝
- 可以利用其它工具導(dǎo)入手機(jī)目錄, 進(jìn)行安裝, 這里不做贅述
- 使用SSH進(jìn)行安裝
首先在手機(jī)里安裝openSSH.
在Makefile中加入以下
export THEOS_DEVICE_IP = 192.168.6.55 (手機(jī)IP)
然后make后執(zhí)行
make package install
輸入密碼, 安裝成功!
其它常見(jiàn)錯(cuò)誤
==> Error:/Applications/Xcode.app/Contents/Developer/usr/bin/make install requires that you set THEOS_DEVICE_IP in your environment.
==> Notice:It is also recommended that you have public-key authentication set up for root over SSH, or you will be entering your password a lot.
make: *** [internal-install] Error 1
如果出現(xiàn)這個(gè)錯(cuò)誤, 那么
export THEOS_DEVICE_IP=127.0.0.1
也可以將其加入到之前提到的base_profile里, 一勞永逸!.