
為了方便廣大網(wǎng)友手動砸殼和鑒于目前 PP 助手已經(jīng)下載不到脫殼的應(yīng)用還有 itunes 新版本也不支持下載 ipa 了,所以個人跟朋友一起只做了,自動化免費砸殼平臺 - www.dumpapp.com ,希望多多支持。
一、iOS 簽名機制的目的
在 iOS 出來之前,在主流操作系統(tǒng)(Mac/Windows/Linux)上開發(fā)和運行軟件是不需要簽名的,軟件隨便從哪里下載都能運行,導(dǎo)致平臺對第三方軟件難以控制,盜版流行。
蘋果希望解決這樣的問題,在 iOS 平臺對第三方 APP 有絕對的控制權(quán),一定要保證每一個安裝到 iOS 上的 APP 都是經(jīng)過蘋果官方允許的,怎樣保證呢?就是通過簽名機制。
二、iOS 簽名機制的實現(xiàn)
1. iOS 上架 APP,簽名證書的過程
(1)生成 CertificateSigningRequest.certSigningRequest 文件
(鑰匙串 --- 從證書頒發(fā)機構(gòu)請求證書 ---- 生成)
(2)獲得 ios_development.cer / ios_distribution.cer 證書
(需要上傳 CertificateSigningRequest.certSigningRequest 文件)
(3)注冊設(shè)備,添加 Appid (生成描述文件的準(zhǔn)備)
(4)獲得 *.mobileprovision 文件
(需要選擇 appid,devices,cer證書 等文件)
2. iOS APP 簽名流程圖
(1)iOS 簽名 通過Mac 公鑰 和 Apple 私鑰 進行加密生成公鑰證書。
(2)然后加上 appid,devices,cer 證書,entitlements 然后再次用 Apple 私鑰 進行加密 生成 mobileprovision 文件
(3)然后 再加上 APP 二進制的 簽名 和 APP 二進制,最后就是最終ipa安裝包的組成。

三、iOS 簽名 APP 的組成
1. cer 證書的生成與組成
(1)生成Mac設(shè)備的公私鑰(通過證書助理)
生成 CertificateSigningRequest.certSigningRequest文件
(鑰匙串 --- 從證書頒發(fā)機構(gòu)請求證書 ---- 生成)

(2)獲得證書
從開發(fā)者平臺 上傳Mac電腦生成的 CSR 文件,獲得 ios_development.cer / ios_distribution.cer 證書

總結(jié) - cer 證書的組成
- 證書 = 利用
Apple 后臺的私鑰,對Mac 設(shè)備生成的公鑰進行簽名后的生成的cer 證書文件 - Mac公鑰 =
CertificateSigningRequest.certSigningRequest - Apple私鑰 =
Apple后臺生成。

2. mobileprovision 描述文件的生成
(1)從開發(fā)者平臺 選擇 appid + devices + 證書 生成的 描述文件

(2)mobileprovision 證書的組成
Mobileprovision = 證書 + devices + appid + entitlements + Apple私鑰加密簽名

總結(jié) App 構(gòu)成
APP = APP + Mac私鑰加密簽名
ipa安裝包 = APP + mobileprivision

AppStore 的下載安裝驗證
如果APP是從AppStore下載安裝的,你會發(fā)現(xiàn)里面是沒有mobileprovision文件的
它的驗證流程會簡單很多:直接用 Apple的公鑰 去驗證 簽名 然后獲取到 APP。

四、如何手動重簽名一個 APP
1. 為什么需要重簽名
一旦改變了應(yīng)用的二進制文件,或者增加修改了里面的資源,或者修改了包名 等,應(yīng)用本身的簽名就會被破壞。
如果還要想將修改后的 ipa 安裝到手機上,就需要對應(yīng)用做重簽名,讓 ipa 包和簽名保持一致。
(其實就是手動完成 Xcode 簽名)
當(dāng)然如果是越獄手機在 cydia 中安裝了 appsync 插件后也可以去掉蘋果的簽名驗證,進行隨意安裝 ipa。不過大多數(shù)人的手機都是非越獄的,所以想要修改 ipa 就必須重簽名操作。
2. ipa 包中 需要重簽名的文件
.app 包內(nèi)部的所有動態(tài)庫(.framework、.dylib)、AppExtension(PlugIns文件夾,拓展名是appex)、WatchApp(Watch文件夾)都需要重新簽名。
一般 PlugIns 和 Watch 文件夾 可以進行刪除操作。
3. 重簽名的步驟 - 概述版
- 下載 ipa,對
ipa 進行脫殼,解壓 ipa 得到Payload文件夾(確保 ipa 是脫殼后的才能進行重簽名) - 進入 Payload 中的
.app文件夾中,刪除PlugIns和Watch文件夾(如果有這兩個文件夾的話無法進行簽名,需要進行刪除) - 刪除
info.plist中的UISupportedDevices字段(如果有此字段會存在安裝 ipa 失敗的情況) - 如果有需要,修改
BundleId或者包名字,或者針對app 進行逆向hook 注入動態(tài)庫修改。 - 使用
security命令獲取當(dāng)前證書的序號,然后獲取對應(yīng)證書的mobileprovision文件。 - 獲取
mobileprovision文件中 的entitlements.plist放到.app 同級目錄下。 - 使用
codesign命令 對 APP 中資源framework等進行簽名。 - 使用
codesign命令,對整個.app 文件 用entitlements.plist進行重簽名。 - 使用 zip 命令 打包
Payload為.ipa文件。
使用
個人證書重簽名的時候,必須保持 重簽名包 info.plist 里的 bundleid 和 描述文件生成中的 bundleid 一致。
4. 重簽名步驟 - 簡化版
(1)準(zhǔn)備一個embedded.mobileprovision文件(appid、device一定要匹配),并放入.app包中
可以通過
Xcode自動生成,然后在編譯后的APP包中找到?;蛘咴?code>開發(fā)者證書網(wǎng)站生成下載。
(2)從embedded.mobileprovision文件中提取出entitlements.plist權(quán)限文件
security cms -D -i embedded.mobileprovision > temp.plist
/usr/libexec/PlistBuddy -x -c 'Print :Entitlements' temp.plist > entitlements.plist
(3)查看可用的證書
security find-identity -v -p codesigning
(4)對.app內(nèi)部的動態(tài)庫、AppExtension等進行簽名
codesign -fs 證書ID xxx.dylib
(5)對.app包進行簽名
codesign -fs 證書ID --entitlements entitlements.plist xxx.app
五、重簽名的步驟 -- 詳細演示操作
下面以 《LIANKS》 這個 app 演示重簽名。
脫殼后的 ipa 可從 www.dumpapp.com 進行獲取
1. 準(zhǔn)備工作
(1)獲取 ipa,解壓 Payload 文件夾
下載 ipa,對 ipa 進行 脫殼解壓 ipa 得到 Payload 文件夾(需要確保 ipa 是脫殼后的才能進行重簽名)

(2)刪除無用文件夾
進入 Payload 中的.app 文件夾中,刪除 PlugIns 和 Watch 文件夾。
如果有這兩個文件夾的話無法進行簽名,需要進行刪除。
rm -r PlugIns
rm -r Watch
(3)刪除APP的 info.plist 中的 UISupportedDevices 字段
如果有此字段會存在安裝 ipa 失敗的情況
/usr/libexec/PlistBuddy -c "Delete :UISupportedDevices" info.plist

(4)對 ipa 進行修改,破壞簽名。
如果有需要,修改 BundleId 或者包名字,或者針對app 進行逆向 hook 修改注入動態(tài)庫。
/usr/libexec/PlistBuddy -c "Set :CFBundleIdentifier com.lianks.client3" Info.plist
/usr/libexec/PlistBuddy -c "Set :CFBundleDisplayName 重簽名 APP" Info.plist
/usr/libexec/PlistBuddy -c "Set :CFBundleName 重簽名 APP2" Info.plist
記住,使用個人證書重簽名的時候,必須保持 重簽名包 info.plist 得到 bundleid 和 描述文件mobileprovision 生成中的 bundleid 一致。
(5)使用個人證書,新建項目,編譯獲取證書對應(yīng) mobileprovision
新建一個新的項目工程,然后選擇對應(yīng)的 team 生成對應(yīng)的個人證書,然后 編譯后進入 Products 下,找到編譯后的 .app 進入后,獲取對應(yīng)的 mobileprovision 文件。

獲取對應(yīng)的 mobileprovision 文件后,把 mobileprovision 放到 Payload 文件夾下。

如果自己手里有 P12 證書 和 對應(yīng) mobileprovision 文件,那么可以直接使用對應(yīng)的mobileprovision 文件,只要確保 證書 和 mobileprovision 文件對應(yīng)。
獲取 mobileprovision 文件中 的 entitlements.plist 放到 .app 同級目錄下。
當(dāng)對整個 app 進行簽名,所以需要用到 mobileprovision 中的 entitlements 描述。
下面演示是如何從 mobileprovision 提取 entitlements.plist 的方法
security cms -D -i embedded.mobileprovision > temp.plist
/usr/libexec/PlistBuddy -x -c 'Print :Entitlements' temp.plist > entitlements.plist

(6)使用 security 命令 獲取當(dāng)前證書的 ID。然后獲取對應(yīng)證書的 mobileprovision文件。
例如證書 ID:D575192406813F8C403E9F419F6C7EB59FE5B6B7 "Apple Development: Dasen Zhang (YL8475CD7Q)"
security find-identity -v -p codesigning

2. 正式開始簽名
這個時候我們已經(jīng)拿到 D575192406813F8C403E9F419F6C7EB59FE5B6B7證書 ID 和 entitlements.plist 描述文件,然后就可以 對 app 內(nèi) framework 等資源進行簽名了。
(1)使用 codesign 命令 對 APP 中資源framework,dylib等進行 簽名。
執(zhí)行簽名命令:
codesign -fs D575192406813F8C403E9F419F6C7EB59FE5B6B7 *.*

(2) 最后使用 codesign 命令,對整個.app 文件 用 entitlements.plist 進行重簽名。
codesign -fs D575192406813F8C403E9F419F6C7EB59FE5B6B7 --entitlements entitlements.plist HiFi\ Pro.app

(3)對Payload 文件夾進行壓縮成 ipa,進行安裝測試
壓縮完成后,就可以用愛思助手進行安裝
zip -ry hifi.ipa Payload

(4) 使用愛思注入進行導(dǎo)入測試

(5)安裝成功
這個時候發(fā)現(xiàn)能夠安裝成功,并且名字已經(jīng)變了,說明我們已經(jīng)重簽名成功了。

六、其它簽名方法
對 iOS ipa 進行簽名目前已經(jīng)有很多工具了,其實這些工具底層都是根據(jù)手動簽名的原理進行了封裝和自動化。
iOS App Signer
https://github.com/DanTheMan827/ios-app-signer
- 可以對.app重簽名打包成ipa
- 需要再.app包中提供對應(yīng)的embedded.mobileprovision文件
iReSign
https://github.com/maciekish/iReSign
- 可以對ipa進行重簽名
- 需要提供entitlements.plist、embedded.mobileprovision文件的路徑
LTResign
https://github.com/gltwy/LTResign
- 可以對ipa進行重簽名,一款基于 Python 寫的腳本
- 需要提供embedded.mobileprovision文件的路徑·