iOS逆向 應用重簽名+微信重簽名實戰

寫在前面

應用重簽名(本文涉及)無風險,但某信有檢測BundId機制,建議不要大號登陸算法

1、代碼簽名

代碼簽名是對可執行文件或腳本進行數字簽名,用來確認軟件在簽名後未被修改或損壞的措施。和數字簽名原理同樣,只不過簽名的數據是代碼而已xcode

1.簡單的代碼簽名

1.蘋果官方生成一對非對稱加密的公私鑰,在iOS的系統中內置一個公鑰,私鑰由蘋果後臺保存;

2.開發者上傳App到App Store時,蘋果後臺用私鑰對App數據進行簽名(即先進行Hash獲得hash值,再用私鑰加密hash值獲得「RSAHash」);安全

3.iOS系統下載這個App後,用內置的公鑰驗證這個簽名,若簽名正確,那麼這個App確定是由蘋果後臺認證的,而且沒有被修改過,也就達到了蘋果的需求:保證安裝的每個APP都是通過蘋果官方容許的。(公鑰解密「RSAHash」獲得hash1,再對應用包進行相同hash算法獲得hash2,驗證兩次hash值是否相同)bash

可是還有不少需求是不能經過App Store下載這一途徑知足的服務器

2.蘋果的市場需求

1.安裝包不須要上傳到App Store,能夠直接安裝到手機上微信

  • 開發App時直接真機調試安裝
  • 企業內部分發的渠道企業證書籤名的APP也是須要順利安裝的

2.蘋果爲了保證系統的安全性,又必須對安裝的APP有絕對的控制權app

  • 通過蘋果容許才能夠安裝
  • 不能被濫用致使非開發APP也能被安裝

爲了實現這些需求,iOS簽名的複雜度也就開始增長了,蘋果這裏給出的方案是雙層簽名ide

3.雙層簽名

這裏簡單梳理了一下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文件和公鑰M的關係
CSR文件和公鑰M的關係:

當CSR文件建立的時候,會自動生成一對私鑰和公鑰,私鑰存儲在Mac上,私鑰存儲默認存儲在登陸鑰匙串中,能夠在鑰匙串的分類鑰匙下查看,請求到的證書會包含公鑰部分

圖中還有一大坨東西是什麼?接下來就來介紹它

4.描述文件

蘋果爲了解決應用濫用的問題,因此蘋果又加了兩個限制

  • 第一限制在蘋果後臺註冊過的設備才能夠安裝
  • 第二限制簽名只能針對某一個具體的App,而且蘋果還想控制App裏面的iCloud/PUSH/後臺運行/調試器附加這些權限,因此蘋果把這些權限開關統一稱爲Entitlements(受權文件)

所以纔有了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
複製代碼

2、重簽名

1.重簽名前期準備

1.PP助手下載微信(越獄版本)

2.解壓縮ipa包

3.終端進入如圖目錄查看應用簽名信息

$ codesign -vv -d WeChat.app
複製代碼

4.列出電腦上的證書

//注意這裏要選擇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
複製代碼

如圖所示當前MachO文件 cryptid=0是越獄應用

2.重簽名步驟

1.刪除插件和帶有插件的.app包(好比Watch,PlugIns)

由於普通帳號不能對插件進行簽名,因此須要刪除

包內容路徑中找到WatchPlugIns文件夾直接刪除

2.重籤framework
// 進入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
複製代碼

3.給MachO上可執行權限

包內容路徑下執行$ Chmod +x WeChat

4.添加描述文件

新建工程,真機運行便可獲得描述文件

將ipa包中的描述文件放到微信的包內容中去

5.修改應用包的bundid

修改微信包內容中的info.plist->BundleId,改成與描述文件的BundleId一致

6.受權文件重籤app包

查看原先的描述文件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
複製代碼

7.安裝.app包

Xcode界面下shift+cmd+2調出手機設備

app運行後利用Xcode附加進程

點擊「登陸」按鈕就能夠打印對應信息了

接下來再介紹個騷操做——利用Xcode來使以上繁瑣的步驟略微減小

3.xcode重簽名

必須是與MachO文件同名工程(工程名相同,BundId無所謂),不然進程不是微信進程

1.運行app,裝描述文件

新建WeChat工程,同上Command+Run,將描述文件生成一下

2.替換掉app包

複製一個新的越獄包,覆蓋掉到原來的ipa包

3.刪除插件

同本文2-1

4.重籤framework

同本文2-2

5.run

因爲是Xcode直接運行,能夠經過Debug View查看界面

寫在結尾

原本想寫的簡潔點,但爲了讓看這篇文章的人有所收穫,我仍是一步步操做盡量講解的詳細點。我以爲寫博客的目的一半是爲了積累,另外一半是送人玫瑰,手留餘香,但願對重簽名原理這塊沒怎麼接觸過的同窗能有個初步認識乃至可以上手操做

下一篇將介紹更騷的重簽名操做

相關文章
相關標籤/搜索