為了方便廣大網(wǎng)友手動砸殼和鑒于目前 PP 助手已經(jīng)下載不到脫殼的應用還有 itunes 新版本也不支持下載 ipa 了梦重,所以個人跟朋友一起只做了款青,自動化免費砸殼平臺 - www.dumpapp.com ,希望多多支持。
一症脂、iOS 簽名機制的目的
在 iOS 出來之前涝涤,在主流操作系統(tǒng)(Mac/Windows/Linux)上開發(fā)和運行軟件是不需要簽名的媚狰,軟件隨便從哪里下載都能運行,導致平臺對第三方軟件難以控制阔拳,盜版流行崭孤。
蘋果希望解決這樣的問題,在 iOS 平臺對第三方 APP 有絕對的控制權糊肠,一定要保證每一個安裝到 iOS 上的 APP 都是經(jīng)過蘋果官方允許的辨宠,怎樣保證呢?就是通過簽名機制货裹。
二嗤形、iOS 簽名機制的實現(xiàn)
1. iOS 上架 APP,簽名證書的過程
(1)生成 CertificateSigningRequest.certSigningRequest
文件
(鑰匙串 --- 從證書頒發(fā)機構請求證書 ---- 生成)
(2)獲得 ios_development.cer / ios_distribution.cer
證書
(需要上傳 CertificateSigningRequest.certSigningRequest
文件)
(3)注冊設備弧圆,添加 Appid (生成描述文件的準備)
(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設備的公私鑰(通過證書助理)
生成 CertificateSigningRequest.certSigningRequest
文件
(鑰匙串 --- 從證書頒發(fā)機構請求證書 ---- 生成)
(2)獲得證書
從開發(fā)者平臺 上傳Mac電腦生成的 CSR 文件
吭产,獲得 ios_development.cer / ios_distribution.cer
證書
總結 - cer 證書的組成
- 證書 = 利用
Apple 后臺的私鑰
侣监,對Mac 設備生成的公鑰
進行簽名
后的生成的cer 證書文件
- Mac公鑰 =
CertificateSigningRequest.certSigningRequest
- Apple私鑰 =
Apple后臺生成
。
2. mobileprovision 描述文件的生成
(1)從開發(fā)者平臺 選擇 appid
+ devices
+ 證書
生成的 描述文件
(2)mobileprovision 證書的組成
Mobileprovision = 證書
+ devices
+ appid
+ entitlements
+ Apple私鑰加密簽名
總結 App 構成
APP = APP
+ Mac私鑰加密簽名
ipa安裝包 = APP
+ mobileprivision
AppStore 的下載安裝驗證
如果APP是從AppStore下載安裝的垮刹,你會發(fā)現(xiàn)里面是沒有mobileprovision
文件的
它的驗證流程會簡單很多:直接用 Apple的公鑰
去驗證 簽名
然后獲取到 APP
达吞。
四、如何手動重簽名一個 APP
1. 為什么需要重簽名
一旦改變了應用的二進制文件荒典,或者增加修改了里面的資源酪劫,或者修改了包名 等,應用本身的簽名就會被破壞寺董。
如果還要想將修改后的 ipa 安裝到手機上覆糟,就需要對應用做重簽名,讓 ipa 包和簽名保持一致遮咖。
(其實就是手動完成 Xcode 簽名)
當然如果是越獄手機在 cydia
中安裝了 appsync
插件后也可以去掉蘋果的簽名驗證滩字,進行隨意安裝 ipa。不過大多數(shù)人的手機都是非越獄的御吞,所以想要修改 ipa 就必須重簽名操作麦箍。
2. ipa 包中 需要重簽名的文件
.app 包內部的所有動態(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
命令獲取當前證書的序號
根资,然后獲取對應證書的mobileprovision
文件架专。 - 獲取
mobileprovision
文件中 的entitlements.plist
放到.app 同級目錄
下同窘。 - 使用
codesign
命令 對 APP 中資源framework
等進行簽名
。 - 使用
codesign
命令部脚,對整個.app 文件 用entitlements.plist
進行重簽名想邦。 - 使用 zip 命令 打包
Payload
為.ipa
文件。
使用
個人證書
重簽名的時候委刘,必須保持 重簽名包 info.plist 里的 bundleid 和 描述文件生成中的 bundleid 一致丧没。
4. 重簽名步驟 - 簡化版
(1)準備一個embedded.mobileprovision文件(appid、device一定要匹配)锡移,并放入.app包中
可以通過
Xcode自動生成
呕童,然后在編譯后的APP包中
找到∠海或者在開發(fā)者證書網(wǎng)站
生成下載夺饲。
(2)從embedded.mobileprovision文件中提取出entitlements.plist權限文件
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內部的動態(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. 準備工作
(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)使用個人證書,新建項目盈包,編譯獲取證書對應 mobileprovision
新建一個新的項目工程沸呐,然后選擇對應的 team 生成對應的個人證書
,然后 編譯
后進入 Products
下呢燥,找到編譯后的 .app
進入后崭添,獲取對應的 mobileprovision
文件。
獲取對應的 mobileprovision
文件后叛氨,把 mobileprovision
放到 Payload 文件夾
下呼渣。
如果自己手里有 P12 證書 和 對應 mobileprovision 文件棘伴,那么可以直接使用對應的mobileprovision 文件,只要確保 證書 和 mobileprovision 文件對應屁置。
獲取 mobileprovision
文件中 的 entitlements.plist
放到 .app 同級目錄
下焊夸。
當對整個 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
命令 獲取當前證書的 ID
阱穗。然后獲取對應證書的 mobileprovision
文件。
例如證書 ID:D575192406813F8C403E9F419F6C7EB59FE5B6B7
"Apple Development: Dasen Zhang (YL8475CD7Q)"
security find-identity -v -p codesigning
2. 正式開始簽名
這個時候我們已經(jīng)拿到 D575192406813F8C403E9F419F6C7EB59FE5B6B7
證書 ID 和 entitlements.plist
描述文件使鹅,然后就可以 對 app 內 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) 使用愛思注入進行導入測試
(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包中提供對應的embedded.mobileprovision文件
iReSign
https://github.com/maciekish/iReSign
- 可以對ipa進行重簽名
- 需要提供entitlements.plist、embedded.mobileprovision文件的路徑
LTResign
https://github.com/gltwy/LTResign
- 可以對ipa進行重簽名插龄,一款基于 Python 寫的腳本
- 需要提供embedded.mobileprovision文件的路徑·