1. 程式人生 > >iOS逆向之App簽名

iOS逆向之App簽名

PE https 系統 圖1 校驗 道理 tor 其他 一件事

iOS App簽名

在學習iOS簽名之前,需要對密碼學有一定的了解,比如RSA加密、HASH哈希函數
參考:https://www.jianshu.com/p/003288dfb3b7

一、簡單的簽名原理:

  • 目的:
  • 保證每個App都是經過蘋果公司官方認證的

  • 背景:因為手機和系統都是蘋果公司生產的,所以蘋果公司可以在手機上內置公鑰,然後在App Store上放置私鑰
  • 蘋果手機:公鑰
  • App Store:私鑰
  • 原理:
    1.App上傳到App Store時,蘋果公司拿到App的HASH(MD5,SHA等)值,然後用私鑰進行加密(簽名),這時候只有手機上的公鑰才可以解密;
    2.手機下載應用安裝App時,先用公鑰解密(驗證簽名),拿到HASH值,然後將此HASH值,與要安裝的App的HASH值進行校驗,如果App有被修改過,則校驗失敗。這樣就可以有效的保證每個App都是經過蘋果公司官方認證的。

弊端:
這樣的做法,需要所有的App上傳App Store,才能在手機上安裝使用,那麽當開發者要用真機調試時,則必須將開發階段的App上傳App Store,才能調試;另外企業賬號的App並不用上傳到App Store就能安裝使用。這樣的做法明顯不合理,所以蘋果公司在此基礎上再做修改。

簽名原理圖1:

技術分享圖片

二、進階的簽名原理:

*目的:

  • 沒上傳App Store的應用,要經過蘋果的允許才能安裝
  • 背景:
  • mac電腦:私鑰M和公鑰M(電腦生成)
  • 蘋果服務器:私鑰A
  • iPhone手機:公鑰A
  • 原理:
    1.mac電腦將公鑰M(生成的CSR文件)和開發者信息傳到蘋果服務器,這個過程叫做申請證書
    2.蘋果服務器對公鑰M進行加密(用私鑰A來加密),生成證書文件(包含公鑰M和公鑰M的HASH值),發送給mac電腦安裝證書,存在本地鑰匙串
    3.蘋果電腦安裝App到手機時,做了一件事情:用私鑰M對App的HASH值進行加密(簽名) ,這時的APP內部實際包含了APP的簽名(私鑰M加密App的HASH值)、第2步生成的證書文件(包含公鑰M和公鑰M的HASH值),App可執行文件以及其他信息
    4.兩次解密過程:
    4.1. iPhone手機拿到證書文件(包含公鑰M和公鑰M的HASH值),因為手機裏有公鑰A,所以能解密證書文件,得到公鑰M和公鑰M的HASH值,先驗證公鑰M生成的HASH值(MD5,SHA等)是不是和證書文件裏的公鑰M的HASH值一致,確保證書沒有被修改;
    4.2. 驗證一致後,就可以用公鑰M來解密第2步的APP的簽名,同樣道理可以驗證App是否被修改過。 因為在開發階段App會經常修改,所以App就算是修改過,也能安裝。第4步主要是驗證證書是不是蘋果認證的,只要證書對就可以安裝運行。

這種方式能夠保證安裝的App是經過蘋果允許的,但是還有弊端。
弊端:
只要申請一個證書,就可以安裝在所有的iOS設備。

簽名原理圖2:

技術分享圖片

三、終極的簽名原理:

*目的:

  • 不能濫用安裝
  • 背景:
  • mac電腦:私鑰M和公鑰M(電腦生成)
  • 蘋果服務器:私鑰A
  • iPhone手機:公鑰A
  • 原理:
    加了兩個限制:
    第一個:需要在蘋果服務器註冊過的設備才能安裝,證書對應的是有設備的(UUID)
    第二個:簽名只能針對某一個App,並且還需要UUID、AppID、推送,後臺運行等權力描述信息,蘋果公司把這些權限統一生成一個文件,稱為權限文件,專門用來描述App簽名的權限,並最生成Provision Profile(描述文件):包含設備IDs,AppID,Entitlements(權力文件包含是否可調試,推送,後臺運行等信息)。

1.在進階的簽名原理中的第2步,證書文件(包含公鑰M和公鑰M的HASH值)和Provision Profile(描述文件)傳給發送給mac電腦;
2.在進階的簽名原理中的第3步,Provision Profile(描述文件)也會和證書文件一起打包進去 。

查看Provision Profile信息:

cd ~/Library/MobileDevice/Provisioning\ Profiles/
ls

技術分享圖片
打開文件夾:
open .
技術分享圖片

在該目錄下用終端查看:

security cms -D -i 0ae1aea3-6094-5dc4dc867596.mobileprovision

技術分享圖片
技術分享圖片

其中包含了一些重要信息:

  • TeamName
  • AppIDName
  • ProvisionedDevices 設備
  • UUID 描述文件本身的UUID
  • Entitlements:
  • get-task-allow 是否可以調試
  • com.apple.developer.team-identifier

簽名原理圖3

技術分享圖片

iOS逆向之App簽名