名词介绍
1. Tweak
iOS越狱开发中,各种破解补丁的统称为Tweak,通常意义上我们说的越狱开发,都是指开发一个Tweak.
基本上,tweak都依赖于一个名叫cydia Substrate的动态库,作者是Jay Freeman (@saurik),它的主要功能是hook某个App,修改代码比如替换其中方法的实现,Cydia上的tweak都是基于cydia Substrate实现的。
Tweak的本质:
tweak的实质就是iOS平台的动态库。iOS平台上有两种形势的动态库,dylib与framework。Framework这种开发者用的比较多,而dylib这种就相对比较少一点,比如libsqlite.dylib,libz.dylib等。而tweak用的正是dylib这种形势的动态库。我们可以在设备的/Library/MobileSubstrate/DynamicLibrarie
s目录下查看手机上存在着的所有tweak。这个目录下除dylib外还存在着plist与bundle两种格式的文件,plist文件是用来标识该tweak的作用范围,而bundle是tweak所用到的资源文件。
1. Theos
Theos是一个越狱开发工具包,,它给我们准备好了一些代码模板、预置一些基本的Makefile脚本。Theos是越狱开发工具的首先,因为其最大的特点就是简单。大道至简,Theos的下载安装、编译发布都比较简单,让开发者把精力放到开发上去。
而Tweak是Theos的一个功能模块。
提到Theos还要提到iOSOpenDev
,这是另一个开发工具,整合到Xcode里了,使用起来没有Theos
方便,这里不做过多介绍。
一:安装ldid
使用brew签名工具:ldid
brew install ldid
ldid是用来签名iOS可执行文件的,可以在越狱iOS中取代Xcode自带的codesign
二、修改环境变量
编辑用户的配置文件
vim ~/.bash_profile
在.bash_profile
追加下面两行
export THEOS=~/theos
export PATH=$THEOS/bin:$PATH
让刚修改的.bash_profile
,生效
source ~/.bash_profile
三、下载theos
git clone --recursive https://github.com/theos/theos.git $THEOS
四、新建tweak项目
在工程目录执行nic.pl
nic.pl
选择13
, 这里的选择数字不一定,theos目前有人在维护,会增加一些新功能,数字不是唯一,我们看清楚是iphone/tweak
即可
下面说一些选项的填写:
Package Name [com.yourcompany.13]:
项目名称,和Bundle Identifier
类似,一般为到域名,但和不要和宿主APP一样就好,如我们Hook腾讯视频APP(com.tencent.live4iphone):com.live4iphone.tweak
Author/Maintainer Name [mac]:
随便写,可以不填,直接回车
[iphone/tweak] MobileSubstrate Bundle filter [com.apple.springboard]:
这个是宿主APP的Bundle Identifier
,不要写错。可以通过Cycript查看(怎么通过Cycript查看,可以参考文章:iOS-逆向<3>-砸壳.md3>,里面有介绍)。com.tencent.live4iphone
[iphone/tweak] List of applications to terminate upon installation (space-separated, '-' for none) [SpringBoard]:
直接回车即可。
至此填写完毕,输出与打印如下图所示:
五、编写Tweak
一个分为两步,
5.1 填写Makefile
在上边填写通过哪个IP地址和端口连接手机
export THEOS_DEVICE_IP=10.105.12.136
export THEOS_DEVICE_PORT=22
填写完毕,如下所示
export THEOS_DEVICE_IP=10.105.12.136
export THEOS_DEVICE_PORT=22
include $(THEOS)/makefiles/common.mk
TWEAK_NAME = souhutweak
souhutweak_FILES = Tweak.xm
include $(THEOS_MAKE_PATH)/tweak.mk
after-install::
install.exec "killall -9 SpringBoard"
其他信息可以先不用动,在我们编写复杂Tweak时会有介绍,这里我们用默认的。
5.2 用Reveal分析界面,找到目标class
打开Tweak.xm后,我们可以看到,有注释会告诉我们怎么填写
%hook 要hook的雷鸣
// Hooking a class method
- (instancetype)initWithFrame:(CGRect)frame {
return nil;
}
%end
此时我们要借助于Reveal。这里不介绍详细的步骤,具体可参考文章:iOS-逆向<2>-越狱机用 Reveal 调试任意 App 的界面2>
打开搜狐视频,用Reveal,我们可以看到广告的view是ASAdvertPlayerView
但是可以看到上面的viewcontroller里显示是ASAdvertPlayerViewController_iPhone
,也就是ASAdvertPlayerView
是显示view,其逻辑是在ASAdvertPlayerViewController_iPhone
里,所以我们最好对这两个类都进行hook
类找到了,hook哪个方法呢,这里就用到class-dump
,我们可以把都文件导出,分析找到要hook的哪个类。
分析ASAdvertPlayerView
就很方便的发现其头文件如下:
但是,分析ASAdvertPlayerViewController_iPhone
时发现这个是ASAdvertPlayerViewController
的之类,所以为了更为彻底的hook,我们最好是对ASAdvertPlayerViewController
的方法进行hook
我们查看ASAdvertPlayerViewController
的头文件,可以发现其吃石化方法
5.3 编写Tweak.xm进行Hook
根据上述分析我们编写的hook代码如下:
Tweak.xm的文件内容如下:
%hook ASAdvertPlayerView
// Hooking a class method
- (instancetype)initWithFrame:(CGRect)frame {
return nil;
}
%end
%hook ASAdvertPlayerViewController
// Hooking a class method
- (id)initWithAdvertFrame:(struct CGRect)arg1 delegate:(id)arg2 {
return nil;
}
%end
编写完成后,我们执行以此make
,make package
,make install
,如果没有错误会有两次提升输入手机root密码,然后重启SpringBoard,就可以安装成功。
安装后我们打开搜狐视频就看到已经没有广告了。
六、Tweak插件的卸载
刚才我们的操作是永久有效的,那么如果我们想删除安装插件该怎么操作呢。
打开Cydia
,找到tab:已安装
,切换最近
选项卡
点击右上角的卸载,即可卸载插件