前言
俗話說得好, 萬事開頭難. 僅僅是上圖一個如此簡單地不能再簡單的小app, 其實都不算是app, 只是注入了一段代碼進系統中, 等到特定的函數方法調用的時候就會被我們hook掉, 執行我們寫的代碼, 僅此而已.
哈哈, 就是這樣一個小功能, 搞得我焦頭爛額了一個晚上, 所以大家不用害怕, 連我這樣的菜鳥都能實現, 大家只要認真看我的總結, 就一定可以自己也動手在自己越獄iPhone, iPad上嗨起來!
ps : 為了紀念這神圣的一刻, 就算是這么簡單的程序我也把它放到了我的Github上, 也算是一個里程碑吧. 還有就是萬一哪天我自己忘了的時候能回頭看看就能把這些知識撿回來. GitHub入口 -> 第一個越獄程序代碼
廢話不多說, 我們直入正題!
準備動作
你需要準備的是 :
- 一臺Mac
- 一部已經越獄的iPhone or iPad
- Theos
- Xcode
- Xcode Command Line Tools
- dpkg
Mac
這個..就不說了吧. 再不行虛擬機也可以頂著上啊
越獄iPhone
越獄的方法網上已經有很多成熟的方法了, 我的4s用PP助手真的就接近一鍵越獄了. 當然這臺越獄iPhone還需要配置.
安裝OpenSSH
由于接著要在電腦上用命令行直接連接到手機給手機安裝, 所以這里必須配置好. 方法也很簡單, Cydia的主界面拉下去就有OpenSSH的配置方法了, 這里不再贅述.
ps : 友情提示以下, 配置好之后是有一個原始的root密碼的, 必須修改掉, 否則容易讓不安好心的人連接到你的手機.
方法如下 :
進入命令行工具
ssh root@你的手機的IP地址
passwd
修改好之后輸入logout就能斷開連接了
由于每次用ssh鏈接手機都需要輸入密碼比較麻煩, 有一種一勞永逸的方法, 大家可以自行Google~
安裝apt與ldid
直接在Cydia搜索apt和ldid, 安裝即可.
Xcode
相信做iOS開發的都有吧..這里就不再說了, 只是如果你Mac上有多個Xcode的話, 需要用以下指令指定一個Theos默認使用的Xcode
sudo xcode-select -s /Application/Xcode.app/Contents/Developer
大家根據自己實際Xcode的位置來定.
Xcode Command Line Tools
在命令行下執行xcode-select --install
即可
dpkg
首先安裝MacPort, 在官網下載安裝就行了. 安裝好之后可以通過在命令行中輸入port version
來查看是否安裝成功.
然后輸入sudo port install dpkg
就能安裝dpkg了, dpkg是用來把我們寫的Tweak代碼打包成deb的工具
ps : 越獄app安裝包后綴為.deb
, 而沒越獄的為.ipa
.
Theos
我們的主角終于上場了. 我們的代碼就是用這個軟件來編寫.
下載Theos
export THEOS=/opt/theos
配置環境變量, 以后THEOS就相當于theos的絕對路徑, 即/opt/theos
sudo git clone git://github.com/DHowett/theos.git $THEOS
從GitHub上下載Theos
配置ldid
從這里下載ldid, 把他放到/opt/theos/bin/
下, 并用以下命令賦予它可執行權限
sudo chmod 777 /opt/theos/bin/ldid
解決Theos的bug
首先在Cydia中搜索安裝CydiaSubstrate
, 然后用iFunBox或scp等方式, 將iOS上的/Library/Frameworks/CydiaSubstrate.framework/CydiaSubstrate
拷貝到Mac上, 重命名為libsubstrate.dylib
之后放到/opt/theos/lib/
下, 替換掉無效的文件即可. (我這部Mac上lib文件夾是空文件夾).
ok, 大功告成, 我們終于可以用Theos大展拳腳啦!!!
創建Theos工程
依然是使用命令行進行創建Theos項目
/opt/theos/bin/nic.pl
: 自動NIC(New Instance Creator).
然后這里會有許多個模板, 就跟Xcode我們創建項目的時候也有許多模板給我們選擇, 是Command Line Tool or Single View Application .... 這里也是. 我們選擇iphone/tweak
這個.
Project Name
: 項目名稱
Package Name
: 打包成deb包的名稱(類似于bundle identifier)
Author/Maintainer Name
: 作者名
MobileSubstrate Bundle filter
: 該工程作用的對象的bundle identifier, 想hook哪個app, 就輸入哪個app的bundle identifier. 例如微信有可能是com.tencent.wechat
List of application to terminate upon installation
: 該tweak安裝完成后需要重啟的應用, 一般重啟SpringBoard. (相當于重啟桌面). 不用的話就輸入 -
ok, 工程創建完成啦
Theos基本知識
創建完后一般會有4個文件
Makefile
Tweak.xm
control
xxx.plist
Makefile
該文件指定工程用到的文件, 框架,庫等信息. 例如你的Tweak.xm文件用到了UIKit, Foundation等其他什么框架, 都在這里描述. 里面具體可以寫些什么大家可以自行Google啦.
這里需要注意的是, 如果要把程序通過ssh的方式安裝在手機上, 就必須在里面加一段
THEOS_DEVICE_IP = 手機的IP地址
Tweak.xm
我們寫代碼的文件, 后綴中的x代表這個文件支持Logos語法. m代表支持C++. 如果只有一個單獨的x代表支持Logos和C, xm則支持Logos和C/C++. 跟我們的.m和.mm一個意思.
這個文件默認內容就是一個注釋, 簡易的指導書. 這里介紹一些我們用到的概念
%hook
%hook ClassName
: 代表要hook這個類.
%hook SpringBoard
/* 這里則為你要hook的函數, 方法 */
%end
%orig
用在鉤住(hook)的函數內部, 代表調用被鉤住的函數的原始代碼
%log
用在鉤住(hook)的函數內部, 用來打印函數的類名, 參數等信息, 還可自己追加想要打印的信息.
%new
用在%hook
的內部, 用于給一個現有的類添加新函數.
ps : 還有一些例如%group
, %ctor
, %init
, %c
等大家可自行Google其用法, 這里不再贅述
control
該文件記錄了deb包管理系統所需的基本信息, 會被打包進deb包中.
xxx.plist
跟我們應用中的info.plist作用類似.
開始編碼
由于我們的app非常小, 只是在iPhone啟動SpringBoard.app完成的時候顯示一個alertView而已, 所以我們的代碼非常精簡
%hook SpringBoard
- (void)applicationDidFinishLaunching:(id)application
{
%orig; // 調用原來的代碼
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Welcome to iPhone 4s!" message:nil delegate:self cancelButtonTitle:@"Goddamn!" otherButtonTitles:nil];
[alert show]; // 顯示彈窗
}
%end
編譯 + 打包 + 安裝
在項目文件夾下使用make
命令, 就可以編譯Theos工程了. 編譯完成當前目錄下會多一個obj
文件夾
make package
命令, 打包程序. 打包成功后當前目錄下會多一個package
文件夾, 你的deb文件就在里邊
make package install
: 編譯+打包+安裝一條龍服務, 直接將程序編譯打包后通過ssh連接的方式安裝在你的手機上. 當然你也可以把deb文件先放到手機上再利用iFile或其他應用安裝.
Done! coffee time.
ps : 配置文件和代碼都能在我的GitHub上找到, 有什么不懂的可以Google或者在這里留個言, 我都會盡可能快地回復, 相互學習, 共同進步! Good luck!