iOS逆向學習(簽名機制)

iOS簽名機制的做用

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簽名流程

要想知道上述全部文件的具體做用,就須要瞭解iOS簽名的完整流程。在使用Xcode編譯、運行完項目以後,Xcode其實幫咱們作了簽名操做。ide

其實就是利用codeSign指令對.app文件進行簽名操做。

準備

想要執行iOS簽名流程,就須要有如下公鑰、私鑰信息工具

  • Mac設備的公鑰和私鑰,通常是Mac設備本身生成
  • Apple官方的私鑰,保存在Apple的後臺
  • Apple官方的公鑰,每一臺iPhone出廠以後都會保存Apple官方的公鑰信息

簽名流程分析

iOS項目在編譯完成以後會生成.app文件,App的簽名操做從拿到.app文件開始學習

  • 第一步,拿到.app文件以後,使用Mac私鑰對.app文件進行簽名操做,生成的簽名文件存放在.app目錄下的_CodeSignature/CodeResources

  • 第二步,使用Apple私鑰對Mac公鑰進行簽名,生成證書文件

  • 第三步,將第二步獲取到的證書文件和devices、app id以及entitlement一塊兒使用Apple私鑰再次進行簽名,生成mobileprovision文件,也就是描述文件。

  • 第四步,將第一步簽名事後的.app文件和第三步生成的mobileprovision文件一塊兒壓縮生成ipa安裝包。

  • 最後,完整的簽名打包過程以下

驗證流程

對.app安裝包進行簽名以後,壓縮生成ipa安裝包,而後將ipa安裝包安裝到iPhone上時,會進行簽名驗證操做。網站

  • 第一步,使用iPhone上存放的Apple公鑰驗證mobileprovision文件中的簽名。
  • 第二步,簽名驗證成功以後,拿到mobileprovision中存放的devices、app id以及entitlement信息。同時拿到證書文件。而後使用Apple公鑰對證書中的簽名進行驗證。驗證成功以後拿到Mac公鑰。
  • 第三步,拿到Mac公鑰以後,使用Mac公鑰對App的簽名文件進行驗證,若是驗證成功,則代表當前的App的源碼沒有被篡改過。而後此App就能安裝到iPhone上 最後獲得完整的簽名加驗證流程,以下

在文件mobileprovision中,有devices、app id以及entitlement信息,它們的做用分別是:

* devices標識着哪些設備能夠安裝此App,若是設備不在devices中,安裝會失敗。
* app id,指定此標識的App才能安裝,若是App的惟一標識和此app id不對應,則安裝失敗。
* entitlement中存放在App所具有的權限信息,若是App所使用的權限和entitlement中存放的權限不一致,也會產生問題。

。
複製代碼

簽名實際操做流程

Apple官方驗證流程

Apple官方驗證流程以下:spa

重簽名

當咱們逆向了一款App,爲App編寫了相應的插件,而且安裝到了咱們本身的越獄手機上。可是,逆向過的App只能在本身越獄手機上使用,若是咱們想要將App和咱們本身編寫的插件從新打包,安裝到未越獄的iPhone上,那就須要學習如何對App進行重簽名。插件

學習重簽名以前,須要注意幾點命令行

  • 第一,安裝包中的可執行文件必須是進行過脫殼操做的,重簽名纔會生效,否則會安裝失敗
  • 第二,重簽名所須要的mobileprovision文件必須是付費開發者帳號申請的才能夠,免費開發者帳號沒法進行重簽名。
  • 第三,.app包中的全部動態庫(.framework,.dylib)、AppExtension(PlugIns文件夾,拓展名是appex)、WatchApp(Watch文件夾)等都須要進行重簽名操做

CodeSign指令重簽名

  • 首先,須要準備一個embedded.mobileprovision文件(必須是付費開發者帳號生成的,裏面的appid、device等須要匹配),而後將此文件放入.app包中
生成mobileprovision文件有兩種方式,第一種是經過Xcode自動生成,在編譯後的App包中能夠找到,第二種是到Apple官網生成,上文有詳細步驟。
複製代碼
  • 從embedded.mobileprovision文件中提取出entitlements.plist權限文件,具體有兩步:
// 首先從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

複製代碼
  • 查看Mac上可使用的證書,獲取到證書的Identity,後續簽名須要使用,具體指令以下
security find-identity -v -p codesigning

複製代碼

獲得的結果以下

➜  ~ security find-identity -v -p codesigning
  1) D9E2802126C89BF6BF6621064FC5547F895FC25E "iPhone Developer: xxxxx@xxxx.com (KT9PJDKFVG)"

複製代碼
  • 對.app包中的全部動態庫、AppExtension等進行重簽名,前提是修改過這些動態庫或者AppExtension,若是沒有修改的動態庫或者AppExtension,能夠跳過此步驟。指令以下:
# -fs 是 -f -s 的縮寫
codesign -fs 證書ID xxx.dylib

複製代碼
  • 對.app包進行簽名,須要使用到以前生成的entitlements.plist文件,指令以下:
codesign -fs 證書ID --entitlements entitlements.plist xxx.app

複製代碼

Theos插件重簽名

使用Xcode編譯本身的項目,咱們知道源碼,因此知道怎麼修改Mach-O文件,可是若是咱們在逆向別人的App時,是不知作別人的源碼的,因此沒法直接修改Mach-O文件。

以前的文章中學習了Theos,知道了怎麼經過建立Tweak項目來修改App的行爲,

Tweak加載方式

建立了Tweak項目以後,經過Cydia安裝到越獄手機上,而後就能夠改變App的行爲。具體是怎麼實現的呢?

  • 首先,Tweak項目通過編譯生成的是一個dylib動態庫文件,存放在Tweak項目目錄.theos/obj/debug/目錄下。
  • 執行make package打包以後生成對應的deb文件,存放在packages目錄下。
  • 執行make install以後,會經過Cydia安裝到手機上,dylib文件存放在~/Library/MobileSubstrate/DynamicLibraries/目錄下。
  • 在App啓動以後,會同時將dylib加載到內存中,App中若是訪問被咱們hook的類中的方法,會直接執行dylib中的方法。

動態庫的注入

Tweak項目本質上是生成動態庫,並且動態庫不是存放在.app目錄下,因此,想要將咱們逆向過的App安裝到別人的手機上,首先須要作的就是將Tweak項目生成的動態庫注入到App中的可執行文件中,也就是Mach-O文件中。

可使用insert_dylib庫來將動態庫注入到Mach-O文件中,能夠經過insert_dylib庫主頁下載insert_dylib工具。在Release環境下編譯,獲得命令行工具,將命令行工具放在/usr/local/bin目錄下。

insert_dylib庫用法

insert_dylib的本質其實就是往Mach-O文件的Load Commands中添加了一個LC_LOAD_DYLIB或者LC_LOAD_WEAK_DYLIB。具體注入方法以下:

insert_dylib 動態庫加載路徑 Mach-O文件 --all-yes --weak

複製代碼
  • --weak選項表示,即便當前注入的動態庫找不到,App也不會報錯
  • --all-yes選項表示,後面全部的選項都選yes

查看Mach-O的動態庫依賴信息

查看動態庫依賴信息兩種方式

  • 經過otool查看Mach-O的動態庫依賴信息
otool -L Mach-O文件

複製代碼

  • 經過MachOView查看Mach-O的動態庫依賴信息

更改動態庫的加載地址

在向Mach-O文件中注入動態庫以後,須要更改Mach-O文件中動態庫的加載地址,不然在App運行時,會由於找不到動態庫報錯。

可使用install_name_tool指令來修改Mach-O文件中動態庫的加載地址:

install_name_tool -change 舊地址 新地址 Mach-O文件

複製代碼

須要注意的是,上述指令中的新地址,必須填寫全路徑地址,可是咱們不知道App安裝到手機上後dylib存放的具體地址,所以,可使用如下兩個經常使用的環境變量:

  • @executable_path表明可執行文件所在的目錄,也就是Mach-O文件所在目錄。咱們將dylib和可執行文件放在同一個目錄下,而後將地址修改成@executable_path/dylib名稱。這就表示在加載動態庫時,到可執行文件所在的目錄下去尋找動態庫。
  • @loader_path表明動態庫所在的目錄,此環境變量通常在動態庫依賴其它動態庫的狀況下使用,若是咱們須要注入的動態庫還依賴其它動態庫,那麼就須要將所依賴的動態庫和原動態庫存放在同一目錄下,而後更改動態庫的加載地址爲@loader_path/動態庫名稱。這表示到原動態庫所在目錄下加載須要依賴的動態庫。

Theos開發的動態庫插件注意事項

  • 咱們使用Theos開發的動態庫插件(dylib)由於使用過Cydia安裝的,因此它默認是依賴CydiaSubstrate插件的。CydiaSubstrate插件存放目錄爲iPhone的/Library/Frameworks/CydiaSubstrate.framework/CydiaSubstrate。
  • 若是想要將咱們開發的動態庫插件打包到ipa中, 就須要同時將CydiaSubstrate一塊兒打包到ipa中,而且須要修改CydiaSubstrate的加載地址。

重簽名GUI工具

iReSign 和 iOS App Signer

相關文章
相關標籤/搜索