一、安装签名工具 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端口进行映射,记得电脑和手机使用线连接
-
<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#编写的,而且类名、函数名会进行混淆操作
- 未脱壳的APP是否支持 tweak?
六、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