Theos

一、安装签名工具ldid

  • 先确保安装了brew
$ /usr/bin/ruby -e "$(curl -fsSL
https://raw.githubusercontent.com/Homebrew/install/master/install)"
  • 􏰌􏰍利用brew安装brew􏰂􏰃ldid
$ brew install ldid

二、修改环境变量

  • 编辑用户的配置文件
$ vim ~/.bash_profile
  • 在􏰝.bash_profie􏰛􏰜􏰞􏰟􏰠􏰡􏰢􏰣文件后面加入以下两行
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
  • 选择􏱋􏱌[11.] iphone/tweak

  • 填写项目信息

    • Project Name:项目名称
    • Package Name:项目ID(随便填)
    • Author/Maintainer Name:作者,直接敲回车按照默认就可以
    • [iphone/tweak] MobileSubstrate Bundle filter:需要修改的APP的Bundle Identifier ,可以通过􏱧􏰢􏱨􏱩Cycript􏱪􏱫查看APP􏰘Bundle Identifier
    • [iphone/tweak] List of applications to terminate upon installation:直接敲回车按照默认就可以
 
Project Name (required): ting_tweak
Package Name [com.yourcompany.ting_tweak]: com.mj.ting
Author/Maintainer Name [MJ Lee]:
[iphone/tweak] MobileSubstrate Bundle filter [com.apple.springboard]:
com.gemd.iting
[iphone/tweak] List of applications to terminate upon installation (space-
separated, '-' for none) [SpringBoard]:
Instantiating iphone/tweak in ting_tweak/...
Done.

􏱬􏰁􏰕􏰖## 五、编辑Makefile

  • 在前面加入环境变量,写清楚通过那个IP和端口号访问手机
    • THEOS_DEVICE_IP
    • THEOS_DEVICE_PORT
 
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

七、编译-打包-安装

  • 编译
make
  • 打包成deb
make package
  • 安装(默认会自动重启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/mj/theos/bin/dm.pl line 12.
BEGIN failed--compilation aborted at /Users/wlq/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􏳇􏳈􏱪􏳉资料

􏰸􏰹􏳊􏳋􏳌- 目录结构:https://github.com/theos/theos/wiki/Structure

  • 环境变量􏰑􏰒􏰓􏰔􏳌:http://iphonedevwiki.net/index.php/Theos
    • Logos语法:􏳍􏱟􏳌http://iphonedevwiki.net/index.php/Logos
    • %hook􏰁、%end :hook一个类的开始和结束
    • 􏰀􏱄􏳎􏰘􏰰􏳏􏱲􏳊􏳐 %log 􏳌􏰯􏳑􏲕􏱟􏳒􏰍􏳓􏳔:打印方法的调用详情
      • 可以通过􏱧􏰢􏱨􏱩Xcode -> Window -> Devices and Simulators􏱪􏱫􏳕􏳖查看日志
    • HBDebugLog 􏳌􏳗NSLog􏳎􏳘:和NSLog类似
    • %new 􏳌􏱾􏰠􏰀􏱄􏰮􏰘􏲕􏱟:添加一个新的方法
    • %c(className) :生成一个Class对象,比如􏳌􏰨􏲇􏰀􏱄􏳙􏳚􏱮􏱈􏱉%c(NSObject)􏱮􏳎􏳘􏳛 类似于NSStringFromClass()、􏰁objc_getClass()
    • %orig 􏳌􏳜􏲱􏳝􏳞􏰘􏰺􏰻􏳟􏰖 :函数原来的代码逻辑
    • %ctor􏳌􏰝􏰠􏰵􏲊􏳠􏳡􏳢􏳒􏰍:在加载动态库时调用
    • %dtor􏳌􏰝􏳣􏳤􏳥􏳦􏳢􏳒􏰍:在程序退出时调用
    • logify.pl 可以将一个头文件快速转换成已经包含打印信息的􏳌􏱧􏰢􏲯􏰀􏱄􏳧􏰛􏰜􏳨􏳩􏳪􏳫􏲇􏲩􏲪􏲆􏳬􏰯􏳑􏱏􏱐􏰘xm􏰛􏰜文件
  logify.pl xx.h > xx.xm
  • 如果有额外的资源文件(例如图片),放在项目的layout文件中,对应着手机的根路径/

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􏳝􏳞􏰘􏱧􏳺􏰤􏰛􏰜􏳽􏰤􏰏􏰐􏱮􏳾􏳾􏰾􏰏􏰐􏰋􏲻􏱅􏱿􏰘􏰺􏰻􏳟原来的可执行文件进行修改,仅仅是修改了内存中的代码逻辑

问题:
􏰖 􏳿􏱵

  1. 未脱壳的APP是否支持tweak?
    • 支持,因为􏴄􏴅􏱮􏲑􏲒tweak是在内存中实现的,并没有修改􏰾􏰝􏲻􏱅􏱿􏳵􏲷􏰘􏱮􏳼􏴇􏲗􏰏􏰐.app􏲆􏱿􏰘􏱧􏳺􏰤􏰛􏰜包中的可执行文件
  2. tweak效果是否永久?
  • 取决于􏰩􏱸􏰾􏴃􏴈􏴉􏴊􏰘􏴆 􏴋􏴌􏳛tweak􏱿􏰍􏱃􏰘中用到的APP􏰺􏰻􏰾􏴃􏴍􏰏􏰐􏱩代码是否被修改过
  1. 如果一旦更新APP,􏱮tweak􏲈􏱹􏲈􏴏􏰩􏴆 会不会失效?
  • 取决于􏴋􏴌􏳛tweak中用到的􏱿􏰍􏱃􏰘APP􏰺􏰻􏰾􏴃􏴍􏰏􏰐􏱩代码是否被修改过
  1. 未越狱的手机是否支持􏴀􏴐􏴑􏰘􏱶􏱷􏰾􏴃􏴄􏴅tweak􏴆 ?
  • 不支持􏱹􏴄􏴅
  1. 能不能对􏲌􏱹􏲌􏳙Swift\C􏳜􏲱􏳽􏰤函数进行tweak􏴆?
  • 可以,方式和 􏱧􏰢􏱮􏲕􏲖􏳗OC􏱹􏰀􏴒不一样
    6.能不能对游戏项目进行tweak􏴆 􏱧􏰢?
  • 可以,但是游戏大多数是通过􏴕􏰾􏴓􏴔􏴖􏲟􏲱􏰾􏱨􏱩C++\C#􏰕􏱎􏰘􏱮􏴗􏴘􏳎􏰅􏰁􏳜􏲱􏰅􏲈􏳽􏰤􏴙􏴚􏴛􏱔编写的,而且类名、函数名会进行混淆操作

logify.pl注意点

  • logify.pl生成的􏰨􏲇􏰘xm文件,有很多时候是编译不过的,需要进行一些处理􏰛􏰜􏱮􏲗􏴞􏲟􏳢􏴟􏰾􏰕􏲅􏱹􏱨􏱩􏰘􏱮􏱡􏱢􏳽􏰤􏰀􏴠􏴡􏴢
    • 􏴣􏲛删掉__weak
    • 删掉􏴣􏲛inout 􏴣􏲛􏴤􏰷􏱮􏱈􏱉
      􏰫􏰬􏴥􏴦􏰀􏰣􏴤􏰷􏱏􏱐- 删掉协议,例如:@protocol XXTestDelegate
    • 删掉 􏴣􏲛- (void).cxx_destruct { %log; %orig; }
    • 删掉 􏴣􏴧HBLogDebug(@" = 0x%x", (unsigned int)r); 􏴨􏳫􏳎􏰅􏲒
    • 替换类名为void,比如􏱮􏱈􏱉􏲯XXPerson *替换为􏴨􏳫􏲒void *
      􏰫􏰬􏴥􏴦􏰀􏰣􏳎􏱏􏱐 - 或者生命一下类信息@class XXPerson
Tweak开发过程
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 221,695评论 6 515
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,569评论 3 399
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 168,130评论 0 360
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,648评论 1 297
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,655评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,268评论 1 309
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,835评论 3 421
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,740评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,286评论 1 318
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,375评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,505评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,185评论 5 350
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,873评论 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,357评论 0 24
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,466评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,921评论 3 376
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,515评论 2 359

推荐阅读更多精彩内容