[TOC]
一、简介
Theos是一个越狱开发工具包,由iOS越狱界知名 人士Dustin Howett(@DHowett)开发并分享到
GitHub上。Theos与其他越狱开发工具相比,最大的 特点就是简单:下载安装简单、Logos语法简单、编译发布简单,可以让使用者把精力都放在开发工作上 去。
二、安装ldid
ldid是专门用来签名iOS可执行文件的工具,用以 在越狱iOS中取代Xcode自带的codesign。
通过Homebrew
安装
1 | brew install ldid #如果没有brew 执行下这个命令 /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" |
三、安装dpkg
deb
是越狱开发安装包的标准格式,dpkg
是 一个用于操作deb文件的工具,有了这个工具,Theos
才能正确地把工程打包成为deb
文件。
1 | brew install dpkg |
四、安装THEOS和配置
配置好环境变量
1 | echo "export THEOS=~/theos" >> ~/.bash_profile |
1 | git clone --recursive https://github.com/theos/theos.git $THEOS |
现在敲下面的指令就有提示了
1 | ➜ ~ ~/theos/bin/nic.pl |
要想直接敲nic.pl
,将export PATH=~/theos/bin:$PATH
加到~/.bash_profile
中即可
4.1 新建项目
找到你想要放的目录,执行nic.pl
1 | ➜ temp2 nic.pl |
看到一共有14种模板,逆向中接触最多的是tweak
,也就是13
,其他更多的模板请参照
- 我们选择13(tweak)模板;
- project Name : 工程名称;
- package Name : deb的包名;
- Author Name :
- [iphone/tweak] MobileSubstrate Bundle filter: 你要破解的app的
bundleid
; - [iphone/tweak] List of applications to terminate upon installation : 输入tweak安装完成后需要重启的应用,以进 程名表示,一般直接回车。
完成以后目录结构如下
1 | ── testtheos |
4.1.1 Makefile
内容如下
1 | include $(THEOS)/makefiles/common.mk |
4.1.1.1 include $(THEOS)/makefiles/common.mk
echo下这个路径如下
1 | ~/theos/makefiles/common.mk |
这里封装了很多内置的命令,一般不做修改
4.1.1.2 TWEAK_NAME = testtheos
插件的名称,之前新建工程的时候写的
4.1.1.3 testtheos_FILES = Tweak.xm
自己写的hook文件,多个话以空格隔开
4.1.1.4 include $(THEOS_MAKE_PATH)/tweak.mk
根据不同的Theos工程类型,通过include命令指 定不同的.mk文件;在逆向工程初级阶段,我们开发 的一般是Application、Tweak和Tool三种类型的程序, 它们对应的.mk文件分别是application.mk、tweak.mk 和tool.mk,可以按需更改。
4.1.1.5 after-install::install.exec “killall -9 SpringBoard”
插件安装成功后重启SpringBoard
关于Makefile
更多参照
4.1.2 Tweak.xm
1 | /* How to Hook with Logos |
这个文件就是用来写hook代码,使用的语法是Logos
语法,关于logo
语法后面会写个详细介绍,也可自行学习
4.1.3 control
1 | Package: com.theos.developer |
这里没啥要介绍的了
4.1.4 testtheos.plist
1 | { Filter = { Bundles = ( "com.app.springboard" ); }; } |
这里就是hook的app的bundleid
4.2 编译、打包、安装
4.2.1 编译 make
1 | ➜ testtheos make |
可以看出make
指令完成了预处理
、编译
、链接
、签名
操作,同时多了个.theos
文件夹
1 | ➜ testtheos la |
进到.theos
文件下查看
1 | ➜ testtheos ls -l ./.theos/obj/debug/ |
有个testtheos.dylib
,这个动态库是插件最核心的部分了。
4.2.2 打包 make package
1 | ➜ testtheos make package |
这个步骤就是使用dpkg
将动态库打包成deb
包
1 | ➜ testtheos la |
发现多了一个packages
1 | ➜ testtheos la ./packages |
com.theos.developer_0.0.1-1+debug_iphoneos-arm.deb
就是可以安装到手机上的deb
最终安装包。
执行完了make package
除了生成了packages
文件夹之外,在.theos
文件下还多了一个_
文件夹
1 | ➜ testtheos ls -l ./.theos |
看下这个文件夹中的内容
1 | ➜ _ tree |
control
内容和我们一开始的control
差不多,Library
1 | └── Library |
这个到时就是到手机上的安装目录
我们对比下生成的deb
包的内容
1 | ➜ testtheos dpkg -c packages/com.theos.developer_0.0.1-1+debug_iphoneos-arm.deb |
4.2.3 安装
有了第二步的deb
安装包,有2种安装方式可以装到手机上
4.2.3.1 图形界面
将deb
安装包通过iFunBox
复制到手机上,然后通过iFlie
安装,需要的话重启手机即可。
4.2.3.2 命令的方式make install
图形界面的方式的话人机交互太多,不方便插件开发,下面介绍直接通过命令完成安装
需要现在文件Makefile
文件的顶部添加手机的ip地址
1 | export THEOS_DEVICE_IP=iosip |
然后再执行make install
即可
五、一个简单的例子
前面一直在将理论,下面来写一个简单的例子来熟悉一下整个过程
新建一个iOS工程
我们新建一个空的iOS
工程用来测试我们的插件
目录结构如下
1 | ➜ sign tree |
在ViewController
上写一个label
作为展示
1 | - (void)viewDidLoad { |
然后将工程跑到越用手机上备用。
新建一个Tweak
工程
control内容如下
1 | Package: com.sign.test |
由于我们的测试工程的bundleid
是com.sign.test
编写hook代码
现在我们想做一个插件,当测试app打开的时候就弹一个alert
,那么hook
代码如下
1 | %hook ViewController |
编译打包
执行make
和make package
命令(make package
已经包含了make
命令了,所以直接执行make package
也是可以的)
执行完成以后会有个com.sign.test_0.0.1-1+debug_iphoneos-arm.deb
安装
图形界面方式
通过iFunbox
将com.sign.test_0.0.1-1+debug_iphoneos-arm.deb
放到iPhone的根目录下,通过 iFile
查看
点击安装,如果安装成功,打开Cydia
可以看到,如果看不到,重启一下手机
点击查看安装的路径
正好使我们之前说的路径,通过iFunbox
也可以找到该动态库
此时打开我们的测试程序
插件已经生效了
命令方式
如果你已经执行了图形的操作,先在Cydia
中卸载该插件。
先在Makefile
文件的顶部增加export THEOS_DEVICE_IP=192.168.1.102
,地址换成你自己手机的地址
然后执行make install
命令即可,发现和图形界面是一样的效果
六、常见报错
6.1 [error] Cowardly refusing to make a project inside $THEOS
有可能是你执行git clone --recursive https://github.com/theos/theos.git $THEOS
命令 的时候报错了 ,有些代码没下载下来,请检查git clone信息
6.2 如果安装的插件一直到手机的根目录(针对命令行安装)不在/Library/MobileSubstrate/DynamicLibraries/
下
则 将文件$THEOS/makefiles/package/deb.mk 中 53行附近,由
1 | $(ECHO_NOTHING)COPYFILE_DISABLE=1 $(FAKEROOT) -r $(_THEOS_PLATFORM_DPKG_DEB) -Z$(_THEOS_PLATFORM_DPKG_DEB_COMPRESSION) -b "$(THEOS_STAGING_DIR)" "$(_THEOS_DEB_PACKAGE_FILENAME)"$(ECHO_END) |
替换为
1 | $(ECHO_NOTHING)COPYFILE_DISABLE=1 $(FAKEROOT) -r dpkg-deb -Zgzip -b "$(THEOS_STAGING_DIR)" "$(_THEOS_DEB_PACKAGE_FILENAME)" $(STDERR_NULL_REDIRECT)$(ECHO_END) |
具体参考链接
到这应该感受到了插件的强大了,接下来只要学会分析app和熟悉logo语法就可以写更多好用的插件了。