一、theos 安裝
1程储、安裝簽名工具ldid
首先先確保安裝了Homebrew 。如未安裝章鲤,可通過下面指令安裝
$ /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
使用Homebrew
安裝ldid
brew install ldid
2败徊、修改環(huán)境變量
1)編輯用戶的配置文件
vim ~/.bash_profile
2)在.bash_profile
文件后面加入以下2行
export THEOS=~/theos
export PATH=$THEOS/bin:$PATH
提示
export THEOS=~/theos
配置 theos 的主路徑,將來下載到哪個(gè)地方煤杀,下面 2.2 我們可以看到
export PATH=$THEOS/bin:$PATH
的目的是為了在任何路徑下都可以找到~/theos/bin
下面的命令沪哺,如下面用到的nic.pl
$PATH
就是引用環(huán)境變量的值
3)讓.bash_profile
配置的環(huán)境變量立即生效(或者重新打開終端)
source ~/.bash_profile
注意
可能不起作用,原因是 mac下采用zsh代替bash酥泛,而zsh加載的是 ~/.zshrc文件嫌拣,而 ‘.zshrc’ 文件中并沒有定義任務(wù)環(huán)境變量。
解決辦法捶索,在~/.zshrc文件最后灰瞻,增加一行:source ~/.bash_profile
。這樣加載/.zshrc的同時(shí)也能加載/.bash_profile文件
查看系統(tǒng)有幾個(gè)shell:cat /etc/shells
燎竖。切換到zsh:chsh -s /bin/zsh
要销。查看默認(rèn)shell:echo $SHELL
3疏咐、下載theos
建議在$PATH
目錄下載代碼(也就是上一步配置的~/theos
目錄)
git clone --recursive https://github.com/theos/theos.git $THEOS
二、theos 的使用
1借跪、新建tweak項(xiàng)目
1)cd到一個(gè)存放項(xiàng)目代碼的文件(比如桌面)酌壕,使用nic.pl
新建
$ cd ~/Desktop
$ nic.pl
2)選擇 iphone/tweak
3)填寫項(xiàng)目信息
- Project Name:項(xiàng)目名稱
- Package Name:項(xiàng)目id(隨便寫)
- Author/Maintainer Name:作者名稱,直接敲回車按默認(rèn)做法就行(默認(rèn)是mac上的用戶名)
- [iphone/tweak] MobileSubstrate Bundle filter:需要修改的APP的Bundle Identifier(如豆瓣:com.douban.frodo)托猩,可以通過Cycript查看APP的Bundle Identifier
- [iphone/tweak] List of applications to terminate upon installation:直接敲回車按默認(rèn)做法就行
2京腥、編輯Makefile
1)在前面加入環(huán)境變量溅蛉,寫清楚通過哪個(gè)IP和端口訪問手機(jī)
# 調(diào)試設(shè)備的IP地址和端口
export THEOS_DEVICE_IP=127.0.0.1
export THEOS_DEVICE_PORT=10010
TARGET := iphone:clang:latest:7.0
INSTALL_TARGET_PROCESSES = SpringBoard
# 引入常用的一般模板
include $(THEOS)/makefiles/common.mk
# 工程名稱
TWEAK_NAME = douban_tweak
# sdk中的framework
douban_tweak_FRAMEWORKS = UIKit, Foundation
douban_tweak_FILES = Tweak.x
douban_tweak_CFLAGS = -fobjc-arc
include $(THEOS_MAKE_PATH)/tweak.mk
2)環(huán)境變量配置
如果不希望每個(gè)項(xiàng)目的Makefile都編寫IP和端口環(huán)境變量船侧,也可以添加到用戶配置文件中。如上文中的THEOS
文件目錄配置镜撩。編輯完畢后袁梗,$ source ~/.bash_profile
讓配置生效(或者重啟終端)
$ vim ~/.bash_profile
export THEOS=~/theos
export PATH=$THEOS/bin:$PATH
export THEOS_DEVICE_IP=127.0.0.1
export THEOS_DEVICE_PORT=10010
$ source ~/.bash_profile
3、編寫代碼
打開 Tweak.x
并編寫遮怜,目的是在“豆瓣”登錄頁面锯梁,添加彈框和一個(gè)紅色視圖
// 需要引入對(duì)應(yīng)的庫
#import <UIKit/UIKit.h>
// 需要定義一下需要hook的類,避免找不到“self”
@interface FRDNormalLoginViewController : UIViewController
@end
%hook FRDNormalLoginViewController
- (void)viewDidLoad {
%orig;
// 添加彈框
UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"我是標(biāo)題" message:@"Hook測試內(nèi)容" preferredStyle:UIAlertControllerStyleAlert];
[alert addAction:[UIAlertAction actionWithTitle:@"確定" style:UIAlertActionStyleCancel handler:nil]];
[self presentViewController:alert animated:YES completion:nil];
// 添加紅色view
UIView *view = [[UIView alloc] init];
view.frame = CGRectMake(100, 100, 100, 100);
view.backgroundColor = [UIColor redColor];
[[self view] addSubview:view];
}
%end
4剥懒、編譯-打包-安裝
1)編譯
make
該步驟合敦,主要是將Tweak代碼編譯成動(dòng)態(tài)庫(*.dylib)蛤肌,編譯的過程中可能會(huì)有錯(cuò)誤,有錯(cuò)誤不用怕裸准,根據(jù)錯(cuò)誤提示信息修改下就好了炒俱,也可以完成搜搜爪膊≡彝酰可能會(huì)出現(xiàn)以下錯(cuò)誤:
- 錯(cuò)誤1:
Building for iOS, but linking in .tbd file (/opt/theos/vendor/lib/CydiaSubstrate.framework/CydiaSubstrate.tbd) built for iOS Simulator, file '/opt/theos/vendor/lib/CydiaSubstrate.framework/CydiaSubstrate.tbd' for architecture arm64
解決方案:把/opt/theos/vendor/lib/CydiaSubstrate.framework/CydiaSubstrate.tbd
文件用文本打開,用Sublime Text3耘成,刪除archs后面的兩項(xiàng)(, i386, x86_64)
驹闰,就可以編譯成功了。
參考鏈接:http://www.reibang.com/p/060be025eb13
- 錯(cuò)誤2:
cannot find interface declaration for 'UIView'
解決方案:需要引入 UIKit师妙,如 #import <UIKit/UIKit.h>
參考鏈接:http://www.reibang.com/p/6fa6dd6276f7
- 錯(cuò)誤3:
receiver type 'MMTableView' for instance message is a forward declaration
解決方案:
// 需要定義一下需要hook的類屹培,避免找不到“self”
@interface FRDNormalLoginViewController : UIViewController
@end
參考鏈接:http://www.reibang.com/p/899faeb834eb
- 錯(cuò)誤4:
Undefined symbols for architecture armv7: "_OBJC_CLASS_$_UIAlertAction", referenced from:
解決方案:在 Makefile
文件中添加 douban_tweak_FRAMEWORKS = UIKit, Foundation
參考鏈接:https://iosre.com/t/theos-make/8193
2)打包成deb
make package
make package
是將dylib打包為deb文件
- 錯(cuò)誤1:
exec of lzma -c0 failed at /Users/yinyongzhen/theos/bin/dm.pl line 11
解決方案褪秀,安裝一下 xz
及可,brew install xz
參考鏈接:https://stackoverflow.com/questions/53500472/open2-exec-of-lzma-c0-failed-a-internal-package-error-2-while-building-in-theo
3)安裝(默認(rèn)會(huì)自動(dòng)重啟SpringBoard)
make install
將deb文件傳送到手機(jī)上若专,通過Cydia安裝deb蝴猪。注意連接的地址和端口號(hào)是否正確,及plist文件中的bundlId是否正確嚎莉。
插件將會(huì)安裝在/Library/MobileSubstrate/DynamicLibraries
文件夾中沛豌。 *.dylib
:編譯后的Tweak代碼;*.plist
:存放著需要hook的APP ID叫确。
當(dāng)打開app時(shí)芍锦,Cydia Substrate (Cydia已自動(dòng)安裝的插件)會(huì)讓APP去加載對(duì)應(yīng)的dylib;修改APP內(nèi)存中的代碼邏輯次乓,去執(zhí)行dylib中的函數(shù)代碼。所以theos的tweak并不會(huì)對(duì)APP原來的可執(zhí)行文件進(jìn)行修改城看,僅僅是修改內(nèi)存中的代碼邏輯杏慰。
三逃默、theos拓展學(xué)習(xí)
1、theos- tweak的開發(fā)過程
2、theos資料查詢
- 目錄結(jié)構(gòu):https://github.com/theos/theos/wiki/Structure
- 環(huán)境變量:http://iphonedevwiki.net/index.php/Theos
- Logos語法:http://iphonedevwiki.net/index.php/Logos
- %hook瘩将、%end:hook一個(gè)類的開始和結(jié)束
- %log:打印方法調(diào)用詳情姿现。可以通過
Xcode -> Window -> Devices and Simulators
查看日志 - HBDebugLog:根NSLog類似
- %new:添加一個(gè)新的方法
- %c(className) :生成一個(gè)
Class
對(duì)象异旧,比如%c(NSObject)
提佣,類似于NSStringFromClass()
、objc_getClass()
- %orig:函數(shù)原來的代碼邏輯
- %ctor:在加載動(dòng)態(tài)庫時(shí)調(diào)用
- %dtor:在程序退出時(shí)調(diào)用
- logify.pl:可以將一個(gè)頭文件快速轉(zhuǎn)換成已經(jīng)包含打印信息的xm文件潮针。
logify.pl xx.h > xx.xm
- 如果有額外的資源文件倚喂,比如圖片,放在項(xiàng)目中的
layout
文件夾中焦读,對(duì)應(yīng)著手機(jī)的根路徑/