應用重簽名(本文涉及)無風險,但某信有檢測BundId機制,建議不要大號登陸算法
代碼簽名是對可執行文件或腳本進行數字簽名,用來確認軟件在簽名後未被修改或損壞的措施。和數字簽名原理同樣,只不過簽名的數據是代碼而已xcode
2.開發者上傳App到App Store時,蘋果後臺用私鑰對App數據進行簽名(即先進行Hash獲得hash值,再用私鑰加密hash值獲得「RSAHash」);安全
3.iOS系統下載這個App後,用內置的公鑰驗證這個簽名,若簽名正確,那麼這個App確定是由蘋果後臺認證的,而且沒有被修改過,也就達到了蘋果的需求:保證安裝的每個APP都是通過蘋果官方容許的。(公鑰解密「RSAHash」獲得hash1,再對應用包進行相同hash算法獲得hash2,驗證兩次hash值是否相同)bash
可是還有不少需求是不能經過App Store下載這一途徑知足的服務器
1.安裝包不須要上傳到App Store,能夠直接安裝到手機上微信
2.蘋果爲了保證系統的安全性,又必須對安裝的APP有絕對的控制權app
爲了實現這些需求,iOS簽名的複雜度也就開始增長了,蘋果這裏給出的方案是雙層簽名ide
這裏簡單梳理了一下iOS的雙層簽名流程,固然這不是最終的流程,蘋果爸爸在這個基礎流程上還要加點東西。這個流程中有兩個基礎角色:Mac電腦、iPhone手機,由於iOS的APP開發環境在Mac系統下,因此這個依賴關係成爲了蘋果雙層簽名的基礎網站
1.蘋果本身有固定的一對公私鑰,跟以前App Store原理同樣,私鑰存儲在蘋果後臺,公鑰放在每一個iOS系統中。這裏稱爲公鑰A
、私鑰A
;在Mac系統中建立CSR
文件時生成非對稱加密算法的一對公鑰/私鑰,這裏稱爲公鑰M
、私鑰M
;A=Apple M = Macui
2.開發者經過CSR
文件向開發者中心申請證書
3.蘋果服務器生成證書
,也就是咱們平時所說的開發者證書
,其原理就是用私鑰A
對公鑰M
非對稱加密。請求到證書
以後,鑰匙串訪問
就會將證書
與本地私鑰M
( 就是咱們所熟知的p12
) 進行相關聯
4.當咱們Command+B
生成一個應用時,Xcode就會用本地的私鑰M
對這個應用進行簽名,同時將證書放到app裏面打包成ipa包
5.iPhone手機安裝ipa包
6.iOS系統裏的公鑰A
對證書進行驗證
7.驗證經過拿到證書
中的公鑰M
8.公鑰M
驗證app的簽名。這裏就間接驗證了這個APP的安裝行爲是否通過蘋果官方容許(這裏只驗證安裝行爲,不驗證APP是否被改動,由於開發階段 APP 內容老是不斷變化的,蘋果不須要管)
3.第一次簽名:私鑰A->公鑰M=>證書
4.第二次簽名:私鑰M->app=>app
7.第一次驗證:公鑰A->證書=>公鑰M
8.第二次驗證:公鑰M->私鑰M=>結果
當CSR文件建立的時候,會自動生成一對私鑰和公鑰,私鑰存儲在Mac上,私鑰存儲默認存儲在登陸鑰匙串中,能夠在鑰匙串的分類鑰匙下查看,請求到的證書會包含公鑰部分
圖中還有一大坨東西是什麼?接下來就來介紹它
蘋果爲了解決應用濫用的問題,因此蘋果又加了兩個限制
所以纔有了Provisioning Profile(描述文件)
描述文件通常包括證書、AppID、設備。當咱們在真機運行或者打包一個項目的時候,證書用來證實咱們程序的安全性和合法性
描述文件是在AppleDevelop網站建立的(在Xcode中填上AppleID它會代辦建立),Xcode運行時會打包進入App內。因此咱們使用CSR申請證書時,咱們還要申請一個東西!!就是描述文件!
在開發時,編譯完一個App後,用本地的私鑰M對這個App進行簽名,同時把從蘋果服務器獲得的 Provisioning Profile文件打包進APP裏,文件名爲embedded.mobileprovision,把 APP 安裝到手機上,最後系統進行驗證
前往描述文件目錄
$ /Users/**用戶名**/Library/MobileDevice/Provisioning Profiles
複製代碼
查看描述文件
$ security cms -Di xxx.mobileprovision
複製代碼
1.PP助手下載微信(越獄版本)
3.終端進入如圖目錄查看應用簽名信息
$ codesign -vv -d WeChat.app
複製代碼
//注意這裏要選擇iPhone Developer證書
$ security find-identity -v -p codesigning
複製代碼
5.查看MachO文件是否加密(步驟3顯示包內容後進入當前目錄)
//讀取MachO信息
$ otool -l WeChat
//讀取MachO信息並
$ otool -l WeChat > ~/Desktop/123.txt
//讀取MachO中"cry"開頭的信息
$ otool -l WeChat | grep cry
複製代碼
由於普通帳號不能對插件進行簽名,因此須要刪除
在包內容
路徑中找到Watch
和PlugIns
文件夾直接刪除
// 進入FrameWork目錄
$ cd Frameworks
// 列舉當前FrameWork
$ ls
// 覆蓋簽名
// codesign -fs "(證書名稱)" (FrameWork名稱)
$ codesign -fs "iPhone Developer: 840385400@qq.com (NZJQGFWAYE)" mars.framework
$ codesign -fs "iPhone Developer: 840385400@qq.com (NZJQGFWAYE)" marsbridgenetwork.framework
$ codesign -fs "iPhone Developer: 840385400@qq.com (NZJQGFWAYE)" matrixreport.framework
$ codesign -fs "iPhone Developer: 840385400@qq.com (NZJQGFWAYE)" OpenSSL.framework
$ codesign -fs "iPhone Developer: 840385400@qq.com (NZJQGFWAYE)" ProtobufLite.framework
$ codesign -fs "iPhone Developer: 840385400@qq.com (NZJQGFWAYE)" andromeda.framework
複製代碼
在包內容
路徑下執行$ Chmod +x WeChat
新建工程,真機運行便可獲得描述文件
將ipa包中的描述文件
放到微信的包內容
中去
修改微信包內容
中的info.plist->BundleId,改成與描述文件
的BundleId一致
查看原先的描述文件
embedded.mobileprovision並複製相應內容
$ security cms -Di embedded.mobileprovision
利用Xcode新建一個plist文件
以代碼形式打開plist文件(open As->Source code)並粘貼相應內容
複製一份與目標.app放於同一目錄下
最後一步命令行簽名app包
$ codesign -fs "iPhone Developer: 840385400@qq.com (NZJQGFWAYE)" --no-strict --entitlements=ent.plist WeChat.app
複製代碼
Xcode界面下shift+cmd+2
調出手機設備
app運行後利用Xcode附加進程
點擊「登陸」按鈕就能夠打印對應信息了
接下來再介紹個騷操做——利用Xcode來使以上繁瑣的步驟略微減小
必須是與MachO文件同名工程(工程名相同,BundId無所謂),不然進程不是微信進程
新建WeChat
工程,同上Command+Run
,將描述文件生成一下
複製一個新的越獄包,覆蓋掉到原來的ipa包
同本文2-1
同本文2-2
因爲是Xcode直接運行,能夠經過Debug View查看界面
原本想寫的簡潔點,但爲了讓看這篇文章的人有所收穫,我仍是一步步操做盡量講解的詳細點。我以爲寫博客的目的一半是爲了積累,另外一半是送人玫瑰,手留餘香,但願對重簽名原理這塊沒怎麼接觸過的同窗能有個初步認識乃至可以上手操做
下一篇將介紹更騷的重簽名操做