Theos

1.安装签名⼯工具ldid

  • 先确保安装了了brew

    1
    $ /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
  • 利用brew安装ldid

    1
    $ brew install ldid

2.修改环境变量量

  • 编辑⽤户的配置⽂件

    1
    $ vim ~/.bash_profile
  • 在.bash_profie⽂件后⾯加⼊以下2⾏

    1
    2
    export THEOS=~/theos
    export PATH=$THEOS/bin:$PATH
  • 让.bash_profiel配置的环境变量⽴即生效(或者重新打开终端)

    1
    $ source ~/.bash_profile

3.下载theos

  • 建议在$THEOS目录下载代码(也就是刚才配置的~/theos目录)
    1
    $ git clone --recursive https://github.com/theos/theos.git $THEOS

4.新建tweak项⽬

  • cd 到一个存放项⽬代码的⽂件夹(⽐如桌面)

    1
    2
    $ cd ~/Desktop
    $ nic.pl
  • 选择[11.] iphone/tweak
    新建tewak项目

  • 填写项目信息

  • 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
  • 直接敲回车按照默认做法就⾏
    1
    2
    3
    4
    5
    6
    7
    8
    9
    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.

5. 编辑Makefile

  • 在前面加⼊入环境变量,写清楚通过哪个IP和端口访问手机
  • THEOS_DEVICE_IP
  • THEOS_DEVICE_PORT

    1
    2
    3
    4
    5
    6
    7
    8
    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让配置⽣生效(或者重启终端)
    1
    2
    3
    4
    5
    6
    $ 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

6.编写代码

  • 打开Tweak.xm⽂文件
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15

    %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

7.编译-打包-安装

  • 编译

    1
    make
  • 打包成deb

    1
    make package
  • 安装(默认会⾃动重启SpringBoard)

    1
    make install

8.可能遇到的问题

make package的错误:

1
2
3
4
5
6
7
8
9
10
11
$ 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/mj/theos/bin/dm.pl line 12.
make: *** [internal-package] Error 2

  • 是因为打包压缩⽅方式有问题,改成gzip压缩就⾏
  • 修改dm.pl⽂件,⽤ # 号注释掉下面两句:

    1
    2
    3
    4
    $ vim $THEOS/vendor/dm.pl/dm.pl
    // 将下面两行用 # 注释掉
    use IO::Compress::Lzma;
    use IO::Compress::Xz;
  • 修改deb.mk⽂件第6行的压缩方式为gzip

    1
    2
    $ vim $THEOS/makefiles/package/deb.mk
    _THEOS_PLATFORM_DPKG_DEB_COMPRESSION ?= gzip

make的错误1:

1
2
3
4
$ 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
    1
    /Applications/Xcode.app/Contents/Developer/

make的错误2:

1
2
3
$ make
> Making all for tweak xxx...
make[2]: Nothing to be done for `internal-library-compile'.

  • 是因为之前已经编译过,有缓存导致的,clean一下即可
    1
    2
    $ make clean
    $ make

10.theos资料查询

1
logify.pl xx.h > xx.xm
  • 如果有额外的资源文件(比如图片),放在项目的layout⽂件夹中,对应着⼿手机的根路径/

11.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#编写的,⽽且类名、函数名会进⾏混淆操作

12. 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;