一、安装签名⼯工具ldid
- 先确保安装了了brew。
$ /usr/bin/ruby -e "$(curl -fsSL
https://raw.githubusercontent.com/Homebrew/install/master/install)"
- 利用brew安装ldid
$ brew install ldid
二、修改环境变量
- 编辑用户的配置⽂文件
$ vim ~/.bash_profile
- 在.bash_profie⽂件后面加入以下2⾏
export THEOS=~/theos
export PATH=$THEOS/bin:$PATH
- 让.bash_profiel配置的环境变量立即生效(或者重新打开终端)
$ source ~/.bash_profile
三、下载theos
建议在$THEOS目录下载代码(也就是刚才配置的~/theos目录)
$ git clone --recursive https://github.com/theos/theos.git $THEOS
四、新建tweak项⽬
- cd到⼀一个存放项⽬代码的⽂件夹(⽐如桌⾯)
$ cd ~/Desktop
$ nic.pl
- 选择[13.] iphone/tweak
- 填写项⽬信息
- Project Name
项⽬名称 - Package Name
项⽬ID(随便写) Author/Maintainer Name - 作者
直接敲回⻋按照默认做法就行(默认是Mac上的⽤户名) - [iphone/tweak] MobileSubstrate Bundle filter
需要修改的APP的Bundle Identifier(喜⻢拉雅FM的是com.gemd.iting)
可以通过Cycript查看APP的Bundle Identifier - [iphone/tweak] List of applications to terminate upon installation
直接敲回⻋按照默认做法就⾏
五、编辑Makefile
- 在前⾯加⼊环境变量,写清楚通过哪个IP和端⼝访问⼿机
export THEOS_DEVICE_IP=127.0.0.1
export THEOS_DEVICE_PORT=10010
include $(THEOS)/makefiles/common.mk
TWEAK_NAME = ting_tweak
ting_tweak_FILES = Tweak.xm
include $(THEOS_MAKE_PATH)/tweak.mk
after-install::
install.exec "killall -9 SpringBoard"
- 如果不希望每个项目的Makefile都编写IP和端口环境变量,也可以添加到用户配置⽂件中
编辑完毕后,$ 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
六、编写代码
打开Tweak.xm⽂件
%hook XMAdAnimationView
- (id)initWithImageUrl:(id)arg1 title:(id)arg2 iconType:(long long)arg3
jumpType:(long long)arg4{
return nil;
}
%end
%hook XMSoundPatchPosterView
- (id)initWithFrame:(struct CGRect)arg1{
return nil;
}
%end
%hook XMSoundPatchPosterViewTwo
- (id)initWithFrame:(struct CGRect)arg1{
return nil;
}
%end
七、编译-打包-安装
- 编译
make
- 打包
make package
//release版本
make package debug=0
- 安装(默认会⾃动重启SpringBoard)
make install
八、可能遇到的问题
1、make package的错误
$ make package
Can't locate IO/Compress/Lzma.pm in @INC (you may need to install the
IO::Compress::Lzma module) (@INC contains: /Library/Perl/5.18/darwin-
thread-multi-2level /Library/Perl/5.18 /Network/Library/Perl/5.18/darwin-
thread-multi-2level /Network/Library/Perl/5.18 /Library/Perl/Updates/5.18.2
/System/Library/Perl/5.18/darwin-thread-multi-2level
/System/Library/Perl/5.18 /System/Library/Perl/Extras/5.18/darwin-thread-
multi-2level /System/Library/Perl/Extras/5.18 .) at
/Users/admin/theos/bin/dm.pl line 12.
BEGIN failed--compilation aborted at /Users/admin/theos/bin/dm.pl line 12.
make: *** [internal-package] Error 2
是因为打包压缩方式有问题,改成gzip压缩就⾏
- 修改dm.pl⽂件,用#号注释掉下⾯两句
$ vim $THEOS/vendor/dm.pl/dm.pl
#use IO::Compress::Lzma;
#use IO::Compress::Xz;
- 修改deb.mk⽂件第6⾏的压缩⽅式为gzip
$ vim $THEOS/makefiles/package/deb.mk
_THEOS_PLATFORM_DPKG_DEB_COMPRESSION ?= gzip
2、 make的错误
- 第一种错误
$ make
Error: You do not have an SDK in
/Library/Developer/CommandLineTools/Platforms/iPhoneOS.platform/Developer/S
DKs
是因为多个xcode导致路径(有可能安装了了好几个Xcode),需要指定一下Xcode。
$ sudo xcode-select --switch
/Applications/Xcode.app/Contents/Developer/
- 第二种错误
$ make
> Making all for tweak xxx...
make[2]: Nothing to be done for `internal-library-compile'.
是因为之前已经编译过,有缓存导致的,clean⼀一下即可
$ make clean
$ make
九、theos资料查询
- %hook、%end :hook一个类的开始和结束
- %log :打印方法调用详情
可以通过Xcode -> Window -> Devices and Simulators查看日志 - HBDebugLog :跟NSLog类似
- %new :添加一个新的⽅法
- %c(className) :⽣成⼀个Class对象,⽐如%c(NSObject),类似于
NSStringFromClass()、objc_getClass() - %orig :函数原来的代码逻辑
- %ctor:在加载动态库时调⽤
- %dtor:在程序退出时调⽤
- logify.pl :可以将⼀个头文件快速转换成已经包含打印信息的xm文件
logify.pl xx.h > xx.xm
- 如果有额外的资源文件(⽐如图片),放在项目的layout文件夹中,对应着手机的根路径/。最好放到项目的layout/Library/PreferenceLoader/Preferences/myDirectory/xxx.png下面。
⼗、theos-tweak的实现过程
- 编写Tweak代码
- $ make :编译Tweak代码为动态库(*.dylib)
- $ make package :将dylib打包为deb文件
- $ make install :将deb⽂件传送到手机上,通过Cydia安装deb
- 插件将会安装在/Library/MobileSubstrate/DynamicLibraries文件夹中
*.dylib:编译后的Tweak代码
*.plist:存放着需要hook的APP ID - 当打开APP时
Cydia Substrate(Cydia已⾃自动安装的插件)会让APP去加载对应的dylib
修改APP内存中的代码逻辑,去执⾏dylib中的函数代码 - 所以,theos的tweak并不会对APP原来的可执⾏⽂件进⾏修改,仅仅是修改了了内存中的代码逻辑
- 疑问
未脱壳的APP是否⽀持tweak?
支持,因为tweak是在内存中实现的,并没有修改.app包中的可执⾏文件 tweak效果是否永久性的?
取决于tweak中⽤到的APP代码是否被修改过
如果一旦更新APP,tweak会不会失效?
取决于tweak中⽤到的APP代码是否被修改过
未越狱的⼿机是否支持tweak?
不支持
能不能对Swift\C函数进行tweak?
可以,⽅式跟OC不⼀样
能不能对游戏项⽬进⾏tweak?
可以
但是游戏大多数是通过C++\C#编写的,⽽且类名、函数名会进行混淆操作
⼗一、logify.pl注意点
logify.pl⽣成的xm文件,有很多时候是编译不通过的,需要进⾏一些处理
- 删掉__weak
- 删掉inout
- 删掉协议,或者声明⼀下协议信息@protocol XXTestDelegate;
- 删掉- (void).cxx_destruct { %log; %orig; }
- 替换HBLogDebug(@" = 0x%x", (unsigned int)r);为HBLogDebug(@" = 0x%@", r);
- 替换类名为void,⽐如将XXPerson *替换为void *,或者声明⼀下类信息@class XXPerson;