前言
學(xué)習(xí)逆向有一段時(shí)間了,想著寫個(gè)iOS Jailbreak Tweak練練手,平時(shí)比較喜歡看視頻,看到比較搞笑的視頻想保存下載發(fā)給好友,無奈無法下載,于是有了這個(gè)VideoDownloaderCN插件。
聲明 : 插件用于技術(shù)研究

一、分析
最近分析幾個(gè)App上的視頻播放,基本上就是一個(gè)View上有個(gè)播放組件,而這個(gè)View或者它的若干個(gè)nextResponder持有這個(gè)視頻的url,于是有這樣的思路:
- 動(dòng)態(tài)分析定位得到視頻的URL
- 在View的構(gòu)造方法內(nèi)添加一個(gè)手勢(shì)彈出下載
- 手勢(shì)對(duì)應(yīng)視頻下載的方法實(shí)現(xiàn),最后移動(dòng)到系統(tǒng)相冊(cè)
分析方法用到:Cycript動(dòng)態(tài)調(diào)試、Reveal界面分析、class-dump頭文件
分析過程不在這里描述,主要mark一下Tweak的構(gòu)建工程.
二、Theos
安裝配置
網(wǎng)絡(luò)上有非常多的教程,但是我推薦查看官方的.Theos installation
創(chuàng)建工程
nic.pl

目錄介紹

Makefile

Tweak.xm

此處我使用了多個(gè)xm文件來區(qū)分每個(gè)App的注入代碼,具體查看github
*.plist

編譯Tweak
做好了基礎(chǔ)配置以及編寫好xm之后,就可以通過make命令編譯,我遇到了一個(gè)錯(cuò)誤,如下:

修改Makefile再次編譯


make package生成deb

安裝Tweak
make install命令安裝到設(shè)備,安裝前需要配置一些必要參數(shù),將以下兩行參數(shù)配置到Makefile是一種方法,意思是通過本地USB方式,端口2222安裝到手機(jī),我的做法是配置好寫在.bash_profile或.zshrc內(nèi),這樣不用每次在Makefile內(nèi)編寫(重要提示:出現(xiàn)Error請(qǐng)?jiān)敿?xì)檢查theos配置,手機(jī)IP、端口是否映射,ssh是否正常登陸)
export THEOS_DEVICE_IP=localhost
export THEOS_DEVICE_PORT=2222
當(dāng)然安裝deb方法不止一種,當(dāng)你打包出deb后
- 可以使用
CyDown這個(gè)插件開一個(gè)ftp,然后PC傳deb過去,接著手機(jī)端打開cydia找到那個(gè)deb安裝。 - 可以使用
scp命令傳到手機(jī)端,接著手機(jī)終端dpkg -i安裝,具體做法請(qǐng)自行搜索詳細(xì)教程。
至此,一個(gè)Tweak在iOS越獄設(shè)備上

三、插件設(shè)置項(xiàng)Preference Bundle
一個(gè)tweak可能要設(shè)置一些選項(xiàng),就像App Store上的App一樣,在設(shè)置應(yīng)用里面可以設(shè)置,在theos里,可以通過創(chuàng)建Preference Bundle來為插件提供設(shè)置界面,有點(diǎn)類似于Xcode里的Setting Bundle,Preference Bundle安裝到手機(jī)后會(huì)在/Library/PreferenceBundles/目錄生成一個(gè)對(duì)應(yīng)的bundle,此bundle會(huì)基于PreferenceLoader注入到設(shè)置應(yīng)用(Setting.app),而PreferenceLoader是由Dustin Howett開發(fā)的基于Mobile Substrate的工具,主要為插件在系統(tǒng)設(shè)置界面添加一個(gè)設(shè)置入口。
為插件創(chuàng)建Preference Bundle
一般的做法為:在原插件目錄使用theos創(chuàng)建


創(chuàng)建preference bundle后新生成目錄下的文件介紹如下:
| 文件 | 作用/含義 |
|---|---|
| entry.plist | 為插件在系統(tǒng)設(shè)置應(yīng)用界面添加一個(gè)入口,一般修改icon與label即可 |
| XXXRootListController | XXXRootListController必須繼承PSListController或者PSViewController,且必須實(shí)現(xiàn)- (id)specifiers方法,因?yàn)镻SListController依賴_specifiers來獲得metadata和group |
| Makefile |
preference bundle的Makefile,一般不用過多修改與操作,編譯Tweak的Makefile會(huì)跟隨著一起編譯 |
| Resources文件夾下的文件如下 | |
| Info.plist | 主要記錄這個(gè)preference bundle的配置信息,一般不用修改 |
| Root.plist | 重點(diǎn)編寫的文件,主要配置插件界面的UI元素,XML格式,好像還有一種類似JSON格式的 |
關(guān)于Preference Bundle的更多配置方法,參考:
讓 iPhone 上顯示學(xué)期周數(shù)(五)?—?— 增加用戶配置界面
Part 6: Preferences, Preferences, a little Tweak, and Heaps of More Preferences
Theos - Preference Bundle Tutorial iOS 8 - iPhone, iPad
網(wǎng)上關(guān)于Preference Bundle的用法中文介紹很少,我是結(jié)合iPhonewiki、視頻以及一些開源插件的Preference Bundle配置學(xué)習(xí),真的是花了不少時(shí)間~~~,具體的配置我不放上來了,可以去我的github看一下,我盡量注釋說明了配置的含義。
推薦一個(gè)開源插件Repo:Open-Source-Tweaks
四、遇到的坑
theos創(chuàng)建preference bundle后編譯不通過,原因是theos找不到對(duì)應(yīng)的庫

解決方法:
手動(dòng)下載theos需要的sdks,網(wǎng)上已經(jīng)有人Patch好了,將從theos sdks下載的sdks放到theos的/sdks目錄下。
再次編譯還是錯(cuò)誤,原因是目前Xcode10.1已經(jīng)使用iOS12.1的sdks,搜了一番沒有找到theos用的,于是我將插件支持版本調(diào)低一點(diǎn),可以編譯通過,Tweak的Makefile添加:
export TARGET = iphone:clang:11.2:8.0
最低版本8.0,最高版本11.2,反正iOS12的越獄大神還沒release,why so serious?
參考:Xcode10.x theos doesn't work
五、總結(jié)
本次主要學(xué)習(xí)theos開發(fā)iPhone tweak的操作以及為tweak增加設(shè)置入口,因?yàn)樽约旱牟寮枰獙?duì)多個(gè)App注入,就想增加開關(guān)來控制插件是否生效,順便學(xué)習(xí)一下Preference Bundle.
整個(gè)開發(fā)過程回顧一下大概是:
-
Cycript調(diào)試拿到視頻URL的成員變量 - 查看頭文件查看屬性與方法,
hook初始化方法添加觸發(fā)手勢(shì) - 編寫
Tweak調(diào)試測(cè)試,適配多個(gè)視頻場(chǎng)景 - 編寫
Tweak的Preference Bundle控制插件開關(guān)(花了不少時(shí)間) - 整理