一、安装签名工具 ldid
- 1.1、先确保安装了 brew,命令如下
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"
- 1.2、利用 brew 安装 ldid
brew install ldid
二、修改环境变量 和 下载theos
- 2.1、编辑用户的配置文件
打开.bash_profile
vim ~/.bash_profile
提示:不熟悉 vim 的可以
open .bash_profile
,修改后保存
- 配置变量,在.bash_profile文件后面追加下面的 2 行
export THEOS=~/theos export PATH=$THEOS/bin:$PATH
提示
export THEOS=~/theos
配置 theos 的主路径,将来下载到哪个地方,下面 2.2 我们可以看到export PATH=$THEOS/bin:$PATH
的目的是为了在任何路径下都可以找到~/theos/bin
下面的命令,如下面用到的nic.pl
- $PATH 就是引用环境变量的值
- 配置立马生效
source ~/.bash_profile
- 2.2、下载 theos
git clone --recursive https://github.com/theos/theos.git $THEOS
提示
- recursive: 代表递归的意思,因为在 gitmodules 里面存在依赖,如果不加 recursive 仅仅是下载 gitmodules 文件,不会下载依赖
$THEOS
等同于 ~/theos
三、theos 的使用
- 3.1、项目的类型
终端输入nic.pl
,会有很多的项目类型,我们要是iphone/tweak
类型,可以进行hook
- 3.2、新建 tweak 项目
- cd 到桌面 ,输入
nic.pl
,展示项目类型
wangchongdeMacBook-Pro:Desktop wangchong$ nic.pl NIC 2.0 - New Instance Creator ------------------------------ [1.] iPhone/activator_event [2.] iPhone/application_modern [3.] iPhone/application_swift [4.] iPhone/flipswitch_switch [5.] iPhone/framework [6.] iPhone/library [7.] iPhone/preference_bundle_modern [8.] iPhone/tool [9.] iPhone/tool_swift [10.] iPhone/tweak [11.] iPhone/xpc_service
- 选择 10
Choose a Template (required): 10
- 项目的名字,我这里是以爱奇艺为例iQiYiPhoneVideo在后面加了tweak
Project Name (required): iQiYiPhoneVideotweak
- 包名,可以随便写一个
Package Name [com.yourcompany.iqiyiphonevideotweak]: com.jk.iQiYiPhoneVideotweak
- 作者,直接敲回车按照默认做法就行 (默认是mac上的用户名)
Author/Maintainer Name [王冲]:
- 需要修改app的 Bundle Identifier,爱奇艺的:
com.qiyi.iphone
,获取一个项目的唯一标示可以使用 cycript,可以参考 第三天的博客
[iphone/tweak] MobileSubstrate Bundle filter [com.apple.springboard]: com.qiyi.iphone
- 创建完成,直接敲回车按照默认的就行
[iphone/tweak] List of applications to terminate upon installation (space-separated, '-' for none) [SpringBoard]: Instantiating iphone/tweak in iqiyiphonevideotweak/... Done.
- 3.3、配置创建好的项目文件,以上面创建的为例 iqiyiphonevideotweak
- 先配置 Makefile 文件,在Makefile文件的最前面加入环境变量,写清楚通过哪个 IP 和 端口访问手机
export THEOS_DEVICE_IP=127.0.0.1 export THEOS_DEVICE_PORT=10010
- Tweak.x 去掉一些,如下,再把文件改为oc,点击右下角语言切换
%hook ClassName
与%end
之间是我们要hook
的代码,ClassName
是我们要hook
的类名
- 3.4、真实演练,去掉爱奇艺下图的部分,下图使用的是 Reveal , Reveal的使用参考博客的 四
- <1>、找到要hook 的类名,上图的是:QYIphonePreAdControlView
- <2>、打开 爱奇艺脱壳后的 可执行文件,我使用的
Sublime
打开的,command + p
搜索QYIphonePreAdControlView
- <3>、修改
Tweak.x
,设置要hook
的内容
%hook QYIphonePreAdControlView - (id)initWithFrame:(struct CGRect)arg1 andPlayerViewController:(id)arg2 { return nil; } %end
- 提示:
%hook 类名
与%end
用来放要 hook 的代码,因为我们是要去掉 QYIphonePreAdControlView,所以我们在其初始化返回 nil,那么改类的界面就会看不到- 可以hook多个类以及多个方法,如下
%hook 类1 方法1 方法2 %end %hook 类2 方法1 %end %hook 类3 方法1 %end
- <4>、电脑的 10010 与 手机的22端口进行映射,记得电脑和手机使用线连接
- 下载usbmuxd工具包(下载v1.0.8版本,主要用到里面的2个python脚本:
tcprelay.py
与usbmux.py
)
- 将iPhone的
22
端口(SSH端口)映射到Mac本地的10010
端口(不一定非是10010端口,只要不是保留端口就好)
cd usbmuxd-1.0.8 python tcprelay.py -t 22:10010
提示:
-t
代表可以映射多个手机的 22 端口
- <5>、运行hook代码,生成如下图的插件,在运行 make install 的时候会安装到手机上
cd Tweak.x 所在的文件夹 make make package make install
<6>、可能遇到的问题
- make 错误一
$ make Error: You do not have an SDK in /Library/Developer/CommandLineTools/Platforms/iPhoneOS.platform/Developer/SDKs
- 原因:是因为多个 xcode 导致路径 (有可能安装多个 xcode),需要指定一下 xcode
$ sudo xcode-select --switch /Applications/Xcode.app/Contents/Developer/
- make 错误二
$ make > Making all for tweak xxx… make[2]: Nothing to be done for `internal-library-compile'.
- 原因:是因为之前已经编译过,有缓存导致的,clean 一下即可
$ make clean $ make
- 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 文件,用 #号注释掉下面的两句
$ vim $THEOS/vendor/dm.pl/dm.pl #use IO::Compress::Lzma; #use IO::Compress::Xz;
- 修改 deb.mk 文件 第六行的压缩方式为 gzip
$ vim $THEOS/makefiles/package/deb.mk _THEOS_PLATFORM_DPKG_DEB_COMPRESSION ?= gzip
- 3.5、每次修改改完 Tweak.x 我们都需要做
make clean && make && make package && make install
操作,这个是我放到 自己磁盘下的文件
- 我们在修改完
Tweak.x
我们就可以,终端先进入 Tweak.x 所在的文件夹,然后执行sh ~/tweak.sh
提示:其实
make package
包含make
(编译),我们可以把 tweak.sh 里面的make 去掉,也就是下面的
make clean && make package && make install
四、扩展: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类似
- %new:添加一个新的方法
- %c(className):生成一个 Class对象,比如 %c(NSObject),类似于 NSSTringFromClass()、objc_getClass()
- %ctor:在加载静态库的时候调用
- %dtor:在程序退出时调用
- %logify.pl:可以将一个头文件快速转换成已经包含打印信息的 xm 文件
logify.pl xx.h > xx.xm
- 如果有额外的资源文件(比如图片),放在项目的 layout 文件夹中,对应着手机的根路径
五、theos-tweak 是实现过程
- 5.1、基本过程
- 编写 Tweak 代码
- $ make:编译 Tweak代码为动态库 (*.dylib)
- $ make package : 将 dylib 打包为 deb 文件
- $ make install:将deb文件传送到手机上,通过 Cydia 安装deb
- 插件将会安装在 /Library/MobileSubstrate/DynamicLibraries文件夹中
- *.dylib:编译后的 Tweak代码
- *.plist:存放着需要 hook 的 APP ID
- 当打开app的时候
- Cydia Subsrate (Cydia 已自动安装的插件)会让App去加载对应的 dylib
- 修改APP内存中的代码逻辑,去执行 dylib 中的函数代码
- 所以,theos 的tweak并不会对APP原来的可执行文件进行修改,仅仅是修改了内存中的代码逻辑
- 5.2、疑问
- 未脱壳的APP是否支持 tweak?
答:支持,因为tweak是在内存中实现的,并没有修改 .app中的可执行文件 - tweak 效果是否永久性的?
答:取决于tweak中用到的 APP 代码是否被修改过 - 如果一旦更新APP,tweak会不会失效?
答:取决于tweak中用到的 APP 代码是否被修改过 - 未越狱的手机是否支持 tweak?
答案:不支持 - 能不能对游戏项目进行 tweak?
答:可以,但是游戏大多数是通过 C++或者C#编写的,而且类名、函数名会进行混淆操作
六、logify.pl 注意点
- 6.1、logify.pl 生成的 x 文件, 有很多时候是编译不通过的,需要机型一些处理
- 删掉 __weak
- 删掉 inout
- 删掉协议,比如:或者声明一下协议信息
@protocol XXTestDelegate
- 删掉 - (void).cxx_destruct { %log;%orig;}
- 删除 HBLogDebug(@ "= 0x%x",(unsigned int));
- 替换类名为 void,比如将 XXPerson 替换为 void 或者声明一下类信息 @class XXPerson
/System/Library/CoreServices/SpringBoard.app/SpringBoard