iOS簽名機制的做用就是保證安裝到用戶手機上的App都是通過Apple官方容許的。固然,越獄設備除外。 在平時開發時,不論是真機調試,仍是發佈App到App Store,咱們都須要通過如下幾個步驟ios
首先,在Mac上生成CertificateSigningRequest.certSigningRequest文件 而後在Apple開發者網站上獲取到ios_development.cer或者ios_distribution.cer證書文件,前者是開發證書,後者是發佈證書 在Apple開發者網站上註冊device,添加App ID。 選擇device、App ID以及開發證書或者生產證書,生成mobileprovision文件bash
通過以上的一系列操做以後,咱們最終就能夠拿到ios_development.cer或者ios_distribution.cer證書文件,以及mobileprovision描述文件。經過安裝這些文件到Mac上就能夠進行真機調試。固然,若是你在Xcode中勾選了Automatically manage signing選項,那麼Xcode會自動幫咱們執行以上的全部操做。 那麼,以上操做每一步執行的做用是什麼?最後得到的ios_development.cer或者ios_distribution.cer證書文件,以及mobileprovision描述文件的做用又是什麼?這些文件中又包含了什麼內容?app
要想知道上述全部文件的具體做用,就須要瞭解iOS簽名的完整流程。在使用Xcode編譯、運行完項目以後,Xcode其實幫咱們作了簽名操做。ide
想要執行iOS簽名流程,就須要有如下公鑰、私鑰信息工具
iOS項目在編譯完成以後會生成.app文件,App的簽名操做從拿到.app文件開始學習
對.app安裝包進行簽名以後,壓縮生成ipa安裝包,而後將ipa安裝包安裝到iPhone上時,會進行簽名驗證操做。網站
在文件mobileprovision中,有devices、app id以及entitlement信息,它們的做用分別是:
* devices標識着哪些設備能夠安裝此App,若是設備不在devices中,安裝會失敗。
* app id,指定此標識的App才能安裝,若是App的惟一標識和此app id不對應,則安裝失敗。
* entitlement中存放在App所具有的權限信息,若是App所使用的權限和entitlement中存放的權限不一致,也會產生問題。
。
複製代碼
Apple官方驗證流程以下:spa
當咱們逆向了一款App,爲App編寫了相應的插件,而且安裝到了咱們本身的越獄手機上。可是,逆向過的App只能在本身越獄手機上使用,若是咱們想要將App和咱們本身編寫的插件從新打包,安裝到未越獄的iPhone上,那就須要學習如何對App進行重簽名。插件
學習重簽名以前,須要注意幾點命令行
生成mobileprovision文件有兩種方式,第一種是經過Xcode自動生成,在編譯後的App包中能夠找到,第二種是到Apple官網生成,上文有詳細步驟。
複製代碼
// 首先從embedded.mobileprovision文件中導出權限信息,存放到temp.plist中
security cms -D -i embedded.mobileprovision > temp.plist
# 而後使用PlistBuddy工具將temp.plist轉換成Entitlements格式的文件entitlements.plist
/usr/libexec/PlistBuddy -x -c 'Print :Entitlements' temp.plist > entitlements.plist
複製代碼
security find-identity -v -p codesigning
複製代碼
獲得的結果以下
➜ ~ security find-identity -v -p codesigning
1) D9E2802126C89BF6BF6621064FC5547F895FC25E "iPhone Developer: xxxxx@xxxx.com (KT9PJDKFVG)"
複製代碼
# -fs 是 -f -s 的縮寫
codesign -fs 證書ID xxx.dylib
複製代碼
codesign -fs 證書ID --entitlements entitlements.plist xxx.app
複製代碼
使用Xcode編譯本身的項目,咱們知道源碼,因此知道怎麼修改Mach-O文件,可是若是咱們在逆向別人的App時,是不知作別人的源碼的,因此沒法直接修改Mach-O文件。
以前的文章中學習了Theos,知道了怎麼經過建立Tweak項目來修改App的行爲,
建立了Tweak項目以後,經過Cydia安裝到越獄手機上,而後就能夠改變App的行爲。具體是怎麼實現的呢?
Tweak項目本質上是生成動態庫,並且動態庫不是存放在.app目錄下,因此,想要將咱們逆向過的App安裝到別人的手機上,首先須要作的就是將Tweak項目生成的動態庫注入到App中的可執行文件中,也就是Mach-O文件中。
可使用insert_dylib庫來將動態庫注入到Mach-O文件中,能夠經過insert_dylib庫主頁下載insert_dylib工具。在Release環境下編譯,獲得命令行工具,將命令行工具放在/usr/local/bin目錄下。
insert_dylib的本質其實就是往Mach-O文件的Load Commands中添加了一個LC_LOAD_DYLIB或者LC_LOAD_WEAK_DYLIB。具體注入方法以下:
insert_dylib 動態庫加載路徑 Mach-O文件 --all-yes --weak
複製代碼
查看動態庫依賴信息兩種方式
otool -L Mach-O文件
複製代碼
在向Mach-O文件中注入動態庫以後,須要更改Mach-O文件中動態庫的加載地址,不然在App運行時,會由於找不到動態庫報錯。
可使用install_name_tool指令來修改Mach-O文件中動態庫的加載地址:
install_name_tool -change 舊地址 新地址 Mach-O文件
複製代碼
須要注意的是,上述指令中的新地址,必須填寫全路徑地址,可是咱們不知道App安裝到手機上後dylib存放的具體地址,所以,可使用如下兩個經常使用的環境變量: