前言
俗話說得好, 萬事開頭難. 僅僅是上圖一個如此簡單地不能再簡單的小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密碼的, 必須修改掉, 否則容易讓不安好心的人連線到你的手機.
1 2 3 4 5 6 7 |
方法如下 : 進入命令列工具 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個檔案
1 2 3 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這個類.
1 2 3 4 |
%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而已, 所以我們的程式碼非常精簡
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
%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! enjoyourself!
ps : 配置檔案和程式碼都能在我的GitHub上找到, 有什麼不懂的可以Google或者在這裡留個言, 我都會盡可能快地回覆, 相互學習, 共同進步! Good luck!
打賞支援我寫出更多好文章,謝謝!
打賞作者
打賞支援我寫出更多好文章,謝謝!
任選一種支付方式