要想修改应用的代码,并且稳定的运行(不受页面重启的影响),就需要编写代码并安装到可执行文件中。theos工具就可以帮我们做好这系列复杂的操作,我们只需要编写hook代码。
以喜马拉雅App为例,我们尝试播放音频的详情界面禁止广告弹出。
注意:仅供学习交流使用,禁止使用技术手段非法获益。
一、theos
1.1. 安装签名⼯具ldid
- 先确保安装了brew
1 | /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" |
- 利用brew安装ldid
1 | brew install ldid |
1.2. 修改环境变量
- 编辑⽤户的配置文件
1 | vim ~/.bash_profile |
- 在
.bash_profie
文件后面加入以下2⾏
1 | export THEOS=~/theos |
- 让
.bash_profiel
配置的环境变量立即⽣效(或者重新打开终端)
1 | source ~/.bash_profile |
1.3. 下载theos
建议在$THEOS
⽬录下载代码(也就是刚才配置的~/theos
⽬录)。
1 | git clone --recursive https://github.com/theos/theos.git $THEOS |
1.4. 新建tweak项⽬
cd
到一个存放项目代码的⽂件夹(⽐如桌面),然后执行nic.pl
1 | cd ~/Desktop |
- 选择
[11.] iphone/tweak
- 填写项目信息
- Project Name
- 项⽬名称
- Package Name
- 项⽬ID(随便写)
- Author/Maintainer Name
- 作者
- 直接敲回车按照默认做法就行(默认是Mac上的用户名)
- [iphone/tweak] MobileSubstrate Bundle filter
- 需要修改的APP的Bundle Identifier(喜⻢拉雅FM的是
com.gemd.iting
) - 可以通过Cycript查看APP的Bundle Identifier
- 需要修改的APP的Bundle Identifier(喜⻢拉雅FM的是
- [iphone/tweak] List of applications to terminate upon installation
- 直接敲回车按照默认做法就行
- Project Name
1 | Project Name (required): ting_tweak |
1.5. 编辑Makefile
- 在前⾯加⼊环境变量,写清楚通过哪个IP和端口访问⼿机
THEOS_DEVICE_IP
THEOS_DEVICE_PORT
1 | export THEOS_DEVICE_IP=127.0.0.1 |
- 如果不希望每个项目的Makefile都编写IP和端⼝环境变量,也可以添加到用户配置⽂件中(编辑完毕后,
$ source ~/.bash_profile
让配置生效或者重启终端)
1 | vim ~/.bash_profile |
1.6. 编写代码
通过Reveal查看图层才知道是显示广告的类是XMAdAnimationView
和XMSoundPatchPosterView
。再通过class-dump分析可执行文件的头文件,让对应类的创建方法返回nil
,广告就不会显示了。
- 打开
Tweak.xm
⽂件
1 | %hook XMAdAnimationView |
1.7. 编译/打包/安装
- 编译
1 | make |
- 打包成deb
1 | make package |
- 安装(默认会⾃动重启SpringBoard)
1 | make install |
1.8. 可能遇到的问题
1.8.1. make package的错误
1 | make package |
是因为打包压缩方式有问题,改成gzip压缩就⾏。
解决方法:
- 修改
dm.pl
⽂件,用#
号注释掉下⾯两句
1 | vim $THEOS/vendor/dm.pl/dm.pl |
- 修改
deb.mk
文件第6⾏的压缩方式为gzip
1 | vim $THEOS/makefiles/package/deb.mk |
1.8.2. make的错误
错误一:
1 | make |
是因为多个xcode导致(有可能安装了好⼏个Xcode),需要指定一下Xcode路径
解决方法:
1 | sudo xcode-select --switch /Applications/Xcode.app/Contents/Developer/ |
错误二:
1 | make |
是因为之前已经编译过,有缓存导致的,clean
⼀下即可。
解决方法:
1 | make clean |