Theos是一个越狱开发包, 也是逆向中比较重要也是最有意思的工具, 它可以让你的想法变成现实, 编写自己的tweak对有开发热情的人来说是一件非常有趣的事情!
网上大多数还都是上古版本的theos教程, 都已经过时了, 可能越狱开发或者iOS逆向已经大不如从前了, 也没找到适合现在的, 好在开发者还一直维护, 现在整理一份当前最新的安装和基本使用教程.
安装和部署
先决条件
macOS环境
- 安装xcode
- 安装Command Line Tools
xcode-select --install
$brew install ldid
- 安装Perl module
$brew install xz
$sudo cpan IO::Compress::Lzma
安装
- 设置环境变量, 你也可以把这句话加入到.base_profile, 详见在当前用户新建一个bash_profile.
export THEOS=~/theos
- 从GitHub克隆项目
$git clone --recursive https://github.com/theos/theos.git $THEOS
不要忘记--recursive, 因为里面还包含了一些别的git库
如果你已经clone下来了, 那么使用这个命令来更新就可以了
$ $THEOS/bin/update-theos
至此最基本的配置和安装就搞定了, 再也没有其它上古教程的复杂配置.
新建项目
$ $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.
很简单的过程, 一个tweak就新建完成了!
下面我们来逐行了解一下这些东西
模板
很简单的1-12是一对模板, 我们选择11 iphone/tweak
Project Name
项目名, 按你心意
Package Name
这个想必大家都熟悉, 是一个倒叙的唯一标示
Author/Maintainer Name
你的大名!
[iphone/tweak] MobileSubstrate Bundle filter [com.apple.springboard]
作用的APP包, 这个很重要, 这里默认是com.apple.springboard, 就是iOS的桌面程序, 那么就说明这个tweak对springboard起作用, 这是一个数组, 可以输入若干个.
至于这个包名从哪找, 在XXX.app中, 查看里面的plist文件就可以了.
[iphone/tweak] List of applications to terminate upon installation
字面意思很明显了, 程序安装完成后要kill的进程, 这里既然我们要改springboard, 自然安装后会杀掉springboard让其重启, 好检验我们的程序是否已经运行.
Done
关于Theos更详细的信息可以参考wiki
项目目录详解
$ cd testreproject
$ ls
Makefile Tweak.xm control testreproject.plist
Makefile
默认的内容为:
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"
下面我们来逐行了解
include $(THEOS)/makefiles/common.mk
固定写法
TWEAK_NAME = testreproject
你刚刚输入的Project Name
testreproject_FILES = Tweak.xm
tweak包含的源文件, 不包括库头文件什么的, 多个文件以空格分割.
include $(THEOS_MAKE_PATH)/tweak.mk
不同的工程类型, 指定不同的mk文件, 一般会用到的有Application, Tweak, Tool三种类型的程序, 那么就是对应的application.mk, tweak.mk, tool.mk三个, 按需更改.
after-install::
install.exec "killall -9 SpringBoard"
这个更简单了, 安装之后要干的事情, 这里是杀掉SpringBoard进程.
下面介绍一下其它的常用配置:
- ARCHS = armv7 armv7s arm64 //指定对应的处理器架构
- TARGET = iphone:latest:8.0 //指定版本
- testreproject_FRAMEWORKS = UIKit CoreAudio //导入framework
- testreproject_PRIVATE_FRAMEWORKS = AppSupport ChatKit //导入私有库
- testreproject_LDFLAGS = -lz -lsqlite3.0 -dylib1.o // 链接libsqlite3.0.dylib, libz.dylib和dylib1.o.
Theos采用GNU Linker来链接Mack-O对象, 包括.dylib, .a和.o.
-lx代表链接libx.a或libx.dylib, 即给”x“加上”lib“的前缀, 以及".a"或".dylib"的后缀, 如果x是"y.o"的形式, 则直接链接y.o, 不加任何前缀或后缀.
Tweak.xm
默认文件如下:
/* 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
*/
文档里写的很明白了, 如何hook和调用函数之类的, 下面只简单介绍几个主要的语法, 更详细的关于LOGO的详见这里
%hook ClassName 和 %end
这个是作为一个结构存在的, 表示开始和结束
%orig
执行原始函数
%orig(nil, nil);
执行原始函数, 并自定义参数值, 如果用这种函数, 必须写明所有的参数.
control
control文件记录了deb包管理系统所需的基本信息, 会被打包进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
用于描述这个deb包的名字, 采用的命名方式同bundle identifier类似, 均为反向DNS格式. 可以按需更改.
Name
用于描述这个工程的名字, 可以按需更改.
Depends
用于描述这个deb包的依赖.
依赖指的是这个程序运行的基本条件, 可以填写固件版本或其它程序, 如果当前iOS不满足依赖中定义的条件, 则此tweak无法正常运行.
如: Depends:mobilesubstrate,firmware(>=8.0)表示当前iOS版本必须在8.0以上, 且必须安装CydiaSubstrate才能正常运行这个tweak, 可以按需更改.
Version
用于描述这个deb包的版本号, 可以按需更改.
Architecture
用于描述deb包安装的目标设备架构, 不要更改.
Description
是deb包的简介, 可以更改.
#######Maintainter
用于描述deb包的维护人, 可以按需更改.
Author
用于描述tweak的作者, 可以按需更改.
Section
用于描述deb包所属的程序类别, 不要更改.
Done
关于control文件的更多信息可以访问这里
testreproject.plist
{ Filter = { Bundles = ( "com.apple.springboard" ); }; }
该plist文件的作用和App中的Info.plist类似, 它记录了一些配置信息, 描述了tweak的作用范围.
通过Xcode打开该文件, 我们可以看到它的最外层是一个Dictionary, 只有一个名为"Filter"的键. Filter下是一系列Array, 可以分为三类:
Bundle
指定若干bundle为tweak的作用对象. 如:com.apple.springboard
Classes
指定若干class为tweak的作用对象. 如:NSString
Executables:
指定若干可执行文件为tweak的作用对象. 如:callservicesd
这三类Array可以混合使用, 但当Filter下有不同类的Array时, 需要添加一个"Mode: Any"键值对. 当Filter下的Array只有一类时, 不需要添加.
编译, 打包, 安装
编译
在根目录下使用make命令就编译了, 生成/obj/debug目录
打包
使用"make package"命令来打包.
执行完成后会在工程目录下生成/packages/xxx.deb文件.该文件就是可以直接安装在iOS上的安装包.
安装
- 可以利用其它工具导入手机目录, 进行安装, 这里不做赘述
- 使用SSH进行安装
首先在手机里安装openSSH.
在Makefile中加入以下
export THEOS_DEVICE_IP = 192.168.6.55 (手机IP)
然后make后执行
make package install
输入密码, 安装成功!
其它常见错误
==> 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
如果出现这个错误, 那么
export THEOS_DEVICE_IP=127.0.0.1
也可以将其加入到之前提到的base_profile里, 一劳永逸!.