设备
越狱手机一部
越狱流程:点击这里。
需要开启SSH通道,可以使用爱思助手打开,需要连接USB,默认IP:127.0.0.1, 端口1025,登录账号:root,密码:alpine。
安装Theos
-
环境变量配置,编辑bash_profile:
1
vim .bash_profile
添加如下内容:
1 2
export THEOS=/opt/theos export PATH=/opt/theos/bin:$PATH
其作用就是添加环境变量,方便以后使用theos时不需要每次都加上它的路径。
-
使用root权限克隆Theos,会直接克隆到磁盘根目录的
/opt/theos
目录下:1
sudo git clone https://github.com/theos/theos.git
-
使用 homebrew 安装 dkpg, ldid
dpkg(Debian Packager)是Theos依赖的工具之一,主要用来制作deb, 保证能够分发的Cydia的存储目录中,Theos生成的安装包最终也是以.deb格式。
ldid是用作给iOS可执行文件签名的工具,使越狱程序或者插件可以安装到越狱手机上。
1
brew install dpkg ldid
-
下载libsubstrate.dylib,并将它拷贝到
/opt/theos/lib
目录下:libsubstrate.dylib 的作用就是将动态库注入到第三方项目中去。
百度云链接: https://pan.baidu.com/s/1fmAosfGSS9qE8ZHWTiopSQ 提取码: r3an
创建项目
在命令行输入以下命令,启用模板:
1
nic.pl
然后会有12个模板可供选择,我们选择 `iphone/tweak’, 然后依次输入:
- 项目名称:Project Name (required): MyTeak
- 包名,即iOS中的bundleID:Package Name [com.yourcompany.myteak]: com.lingjye.myteak
- 作者:Author/Maintainer Name [txooo]: lingjye
- 需要Hook的应用的bundleID,这里如果是要hook其他APP,请更改为其他APP的bundleID:[iphone/tweak] MobileSubstrate Bundle filter [com.apple.springboard]: com.apple.springboard
-
依赖的应用,这里可以不用输入直接回车即可,默认是SpringBoard,表示tweak安装后,重启SpringBoard:[iphone/tweak] List of applications to terminate upon installation (space-separated, ‘-‘ for none) [SpringBoard]:
然后会在用户目录下(/Users/YourMacName/myteak
)生成刚才创建的项目,例如:myteak
另外可以点击这里下载另外5个模板。然后把5个模板都拷贝到 /opt/theos/templates/ios
目录下。
也可以点击查看如何自定义模板。
文件介绍
默认生成的项目下,会有四个文件:
- control文件,项目信息描述文件,包含包名,项目名称,版本信息,作者信息等。
-
Makefile文件,用于指定工程用到的文件,例如接下来需要编写的 Tweak.xm 文件,这里我们需要修改内容:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
export SDKVERSION = 10.2.1 export ARCHS = armv7 arm64 export TARGET = iphone:clang:latest:9.0 export THEOS_DEVICE_IP = 127.0.0.1 -p 1025 include $(THEOS)/makefiles/common.mk TWEAK_NAME = TweakDemo TweakDemo_FILES = Tweak.xm TweakDemo_FRAMEWORKS = UIKit CoreGraphics include $(THEOS_MAKE_PATH)/tweak.mk after-install:: install.exec "killall -9 SpringBoard"
export SDKVERSION = 10.2.1
用于指定Xcode版本号;
export ARCHS = armv7 arm64
用于指定CPU类型;
export TARGET = iphone:clang:latest:9.0
用于指定支持的iOS系统版本
export THEOS_DEVICE_IP = 127.0.0.1 -p 1025
用于指定需要安装的真机IP地址以及端口
TweakDemo_FRAMEWORKS
用于指定依赖的系统库 - Tweak.xm 这是需要我们编写的 Tweak 文件,用来执行 Hook 操作。
- xxxx.plist 这个文件用于设置 Tweak 插件的作用范围,用来指定作用于那个 APP 的 BundleID。默认:com.apple.springboard, 可以替换为你公司的 APP BundleID 试一下。
theos逆向指令
Tweak.xm 中涉及到 Logos 语法,其中的几个命令如下:
- 块级别
- 1.1. %group: 使用名称Groupname开始一个钩子组(用于条件初始化或代码组织)。所有未分组的钩子都在隐式的“_ungrouped”组中。不能包含另一个 %group,以 %end 结尾。
- 1.2. %hook:指定需要hook的class,必须以%end结尾,一个group可以包含 %hook。
- 1.2.1. %new: 在%hook内部使用,给一个现有class添加新函数,功能与class_addMethod相同。
- 1.3. %subclass:该类在运行时创建并使用方法填充。不支持ivars(使用关联对象)。%new需要一个在父类中不存在的方法。要实例化新类的对象,可以使用%c运算符。
- 1.4. %end
- 顶级
- 2.1. %config:设置配置标志
- 2.2. %hookf:为名为symbolName的函数生成函数钩子。如果名称作为字符串传递,则将动态查找该函数。
- 2.3. %ctor:tweak的构造函数,完成初始化工作;如果不显示定义,Theos会自动生成一个%ctor,并在其中调用%init(_ungrouped)。%ctor一般可以用来初始化%group,以及进行MSHookFunction等操作。
- 2.4. %dtor:与 %ctor相反,析构函数。
- 功能级别
- 3.1. %init:用于初始化某个 %group ,必须在 %hook _或 %ctor 内调用;如果带参数,则初始化指定的 group,如果不带参数,则初始化 __ungrouped。
- 3.2. %c:等同于 objc_getClass 或 NSClassFromString,即动态获取一个类的定义,在 %hook 或 %ctor 内使用。
- 3.3. %orig:在%hook内部使用,执行被 hook 的方法的原始代码。
-
3.4. %log:在 %hook 内部使用,将函数的类名、参数等信息写入 syslog,可以用 %log(@”“, @”“,…)的格式追加其他打印信息。
参考: Logos 语法
编译、打包、安装、卸载
首先需要 cd 到项目路径下:
1
cd /Users/txooo/myteak
编译
1
make
如果遇到错误,请点击这里
打包
1
make package
之后会在项目下看到生成了一个 packages
文件夹,它下面存放的就是 .deb 格式的Tweak安装包。
安装
1
make install
卸载
需要使用SSH访问设备的文件系统,然后执行以下命令:
1
2
// 此处是要卸载的bundleID
dpkg -r com.domain.xxxx
可以前往 Cydia->已安装->最近查看安装是否成功,或者使用 ssh 命令或工具前往设备的 Library/MobileSubstrate/DynamicLibraries/
目录下查看是否有刚才安装的插件,后缀为 .dylib和.plist。
注意,请在Makefile文件修改自己设备的真实IP
错误
-
错误: git submodule update –init –recursice
执行:
1
cd /opt/theos
然后执行
1
git submodule update --init --recursice
-
错误:include path for stdlibc++ headers not found; pass ‘-stdlib
修改Makefile, 在首行加入:
1 2 3 4
export SDKVERSION = 10.2.1 export ARCHS = armv7 arm64 export TARGET = iphone:clang:latest:9.0 export THEOS_DEVICE_IP = 127.0.0.1 -p 1025
-
错误:error: obsolete compression type ‘lzma’; use xz instead
修改
opt/theos/makefiles/package/deb.mk
中的第六行:1
THEOSPLATFORM_DPKG_DEB_COMPRESSION ?= lzma
改为:
1
THEOSPLATFORM_DPKG_DEB_COMPRESSION ?= xz