引言
當(dāng)我們?cè)谑褂胻heos創(chuàng)建一個(gè)tweak項(xiàng)目的時(shí)候冠跷,tweak做了什么?它的工作原理是什么身诺?
分析tweak項(xiàng)目
- 分析tweak創(chuàng)建以后的幾個(gè)文件蜜托,創(chuàng)建操作請(qǐng)查看十一
根目錄
.
├── .theos
| ├── _
| | └── ... *
| ├── obj
| | └── ... *
| ├── packages
| | └── ... 記錄版本號(hào)
| ├── build_session
| ├── fakeroot
| └── last_package 當(dāng)前打包成功以后放的路徑
├── obj 實(shí)際上跟上面.theos/obj的目錄是一樣的
| └── debug/... 空的
├── packages
| └── ... 你的包程序,也就是你的插件的包霉赡,在很多威鋒源里面的*.deb文件橄务,每次打包都會(huì)生成一個(gè)包文件,每次包文件的版本號(hào)都會(huì)++
├── control 配置信息
├── Makefile 環(huán)境變量信息
├── Tweak.xm 編寫(xiě)logos hook代碼
├── ***.plist 目標(biāo)進(jìn)程穴亏,就是你需要修改蜂挪、hook的App的Bundle identifier
_ 目錄
├── DEBIAN
| └── control 配置信息
├── Library
| | └── MobileSubstrate/Dynamiclibrarte/**.plist 目標(biāo)進(jìn)程,就是你需要修改嗓化、hook的App的Bundle identifier
obj 目錄 上面兩個(gè)obj目錄實(shí)際上都是一樣的棠涮,只不過(guò)在根目錄中的obj在打包安裝的整個(gè)過(guò)程中都是空的,我也不知道作者當(dāng)時(shí)是怎么想的刺覆,所以就繞過(guò)去严肪,可能還有別的作用的,現(xiàn)在是沒(méi)找到相關(guān)的內(nèi)容谦屑。
├── debug
| ├── arm64 arm64的*.dylib 動(dòng)態(tài)庫(kù)
| └── armv7 armv7的*.dylib 動(dòng)態(tài)庫(kù)
| | └── *.dylib 合并arm64驳糯、armv7的動(dòng)態(tài)庫(kù)
當(dāng)我使用theos創(chuàng)建一個(gè)tweak項(xiàng)目,并make
氢橙、make package
酝枢、make install
三個(gè)步驟會(huì)直接安裝到你的手機(jī)里面,在cydia安裝的插件中就可以看到你自己的插件
當(dāng)然tweak是以什么形式安裝到手機(jī)中的吶悍手?
首先我們來(lái)介紹下動(dòng)態(tài)庫(kù)能夠被加載帘睦,而且還會(huì)被調(diào)用,基本上我所知道的只有2種:
1. 注入到某個(gè)App
2. 插入到某個(gè)進(jìn)程
驗(yàn)證
為了證明我已經(jīng)將動(dòng)態(tài)庫(kù)注入App或是插進(jìn)我的目標(biāo)進(jìn)程坦康,我在**.xm
中添加了如下代碼進(jìn)行驗(yàn)證
%hook WCAccountLoginFirstViewController
- (void)viewDidAppear:(BOOL)animated{
UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"提示" message:@"注入成功了竣付,嗚~喵!" preferredStyle:UIAlertControllerStyleAlert];
UIAlertAction *alertaction = [UIAlertAction actionWithTitle:@"好的" style:UIAlertActionStyleCancel handler:^(UIAlertAction * _Nonnull action) {
}];
[alert addAction:alertaction];
[[UIApplication sharedApplication].keyWindow.rootViewController presentViewController:alert animated:YES completion:nil];
%orig;
}
%end
驗(yàn)證注入到某個(gè)App
猜想:
當(dāng)我創(chuàng)建一個(gè)tweak項(xiàng)目的時(shí)候涝焙,會(huì)在最后輸入卑笨,目標(biāo)App的Bundle identifier,這個(gè)App的唯一標(biāo)示仑撞,cydia根據(jù)這個(gè)Bundle identifier直接注入我的動(dòng)態(tài)庫(kù)赤兴。
而我要驗(yàn)證的就是make
、make package
隧哮、make install
安裝到手機(jī)以后桶良,我查看手機(jī)里面的MachO文件,查看是否注入了我的動(dòng)態(tài)庫(kù)文件沮翔。
過(guò)程
-
訪問(wèn)我的手機(jī)陨帆,打開(kāi)我的目標(biāo)App,Copy目錄下的*.app文件,通過(guò)SSH發(fā)送給我的Mac桌面
$ scp -P 3456 -r root@localhost:/var/containers/Bundle/Application/39C3D718-5FD5-41E1-86C2-72DB9B06C75D/xxx.app ~/Desktop
//拿到MachO文件
使用MachOView打開(kāi)這個(gè)MachO文件
在Load Commands 中查看是否存在你剛注入的動(dòng)態(tài)庫(kù)名稱(chēng)
我從頭到尾都沒(méi)有看到有我創(chuàng)建的動(dòng)態(tài)庫(kù)
驗(yàn)證證明了采蚀,tweak創(chuàng)建的動(dòng)態(tài)庫(kù)并沒(méi)有注入到MachO疲牵,沒(méi)有修改App的二進(jìn)制文件
tweak不是注入動(dòng)態(tài)庫(kù)的方式
需要注意的是注入的方式,就是修改二進(jìn)制文件榆鼠,注定要重新簽名二進(jìn)制文件
無(wú)越獄iphone安裝多個(gè)同樣應(yīng)用的方法(一)
無(wú)越獄IPhone安裝多個(gè)同樣應(yīng)用的方法(二)Xcode簽名
無(wú)越獄IPhone安裝多個(gè)同樣應(yīng)用的方法(三)自動(dòng)化重簽名
驗(yàn)證插入到某個(gè)進(jìn)程
分析
插入到某個(gè)進(jìn)程底下纲爸,我們需要的是一個(gè)dyld的環(huán)境變量,DYLD_INSERT_LIBRARIES
這個(gè)環(huán)境變量告訴了某個(gè)App進(jìn)程妆够,我要加載某個(gè)動(dòng)態(tài)庫(kù)识啦,當(dāng)App運(yùn)行的時(shí)候,臨時(shí)掛載到上面而并沒(méi)有修改App的MachO文件神妹,當(dāng)App從后臺(tái)刪除以后颓哮,這個(gè)臨時(shí)加載的動(dòng)態(tài)庫(kù)也會(huì)跟著清除,當(dāng)這個(gè)App重新打開(kāi)后需要重新加載這個(gè)動(dòng)態(tài)庫(kù)
在我的IPhone一起玩越獄 -(十)- 使用dumpdecrypted砸殼鸵荠,動(dòng)態(tài)砸殼
這個(gè)篇文章中提到過(guò)這種方式也應(yīng)用過(guò)這種方式冕茅,請(qǐng)移駕過(guò)去查看
驗(yàn)證
圖中顯示的就是當(dāng)我啟動(dòng)***.app目標(biāo)App的時(shí)候,cydia檢測(cè)到了它啟動(dòng)了蛹找,cydia會(huì)調(diào)用
DYLD_INSERT_LIBRARIES
這個(gè)變量讓這個(gè)App去加載我的動(dòng)態(tài)庫(kù)嵌赠,Loading: .../你的動(dòng)態(tài)庫(kù)的路徑
。
總結(jié)
tweak的原理
- tweak生成的是一個(gè)動(dòng)態(tài)庫(kù)熄赡,并且打包成一個(gè)deb的包
- dylib動(dòng)態(tài)庫(kù)
- plist文件(目標(biāo)app的bundle identifier)
- cydia安裝這個(gè).deb姜挺,實(shí)際上就是將.deb中的動(dòng)態(tài)庫(kù)、plist取出來(lái)
- 根據(jù)plist提供的bundle identifier查找目標(biāo)App是否啟動(dòng)
- 如果啟動(dòng)加載dylib這個(gè)動(dòng)態(tài)庫(kù)
以上