iOS 應用簽名原理&重簽名

在蘋果的平常開發中,真機測試與打包等不少流程都會牽扯到各類證書,CertificateSigningRequest,p12等。可是不少相應的開發者並不理解iOS App應用簽名的原理和流程。今天着重講解一下此內容。html

思考shell

在蘋果的iOS系統出來以前,之前的主流程Mac OS/Window軟件存在着安全隱患,盜版軟件,病毒入侵等,蘋果但願能解決相似的問題,保證每個安裝在蘋果手機上的app都是通過蘋果官方容許的,怎麼保證呢?xcode

 

1、iOS 應用簽名原理

1 代碼簽名

要想回答上面「思考」的答案,首先咱們講解一個概念。代碼簽名:是對可執行腳本或者文件進行數字簽名,用來保證軟件在簽名後未被損害或者修改的措施。安全

2 簡單的代碼簽名

最簡單的驗證方式是經過蘋果官方生成非對稱加密的一對公私鑰。私鑰保存在Appstore的服務器,而公鑰保存在iOS系統中,蘋果後臺用私鑰來對App數據進行簽名,iOS系統下載此APP後,用公鑰來驗證簽名。若驗證成功,說明該App未被更改,能夠安裝到手機中,反之,則不行。bash

上面的驗證能夠解決大部分App入駐手機中的場景,可是對於咱們開發蘋果應用的開發者而言,咱們也能夠直接經過真機測試進入到用戶的手機,並且蘋果也有企業用戶渠道,因此若是想要全方面的安全的安裝蘋果App,就沒法經過簡單的代碼簽名作到,那麼蘋果又是經過怎樣的方案呢?服務器

3 雙層簽名

下面流程圖微信

解釋以下:架構

  1. 首先Mac電腦經過CSR文件申請證書(經過公鑰M)
  2. 蘋果服務器返回公鑰M以及公鑰M算出的哈希值(也就是簽名)
  3. App包裏包括可執行文件MachO,而後對MachO經過私鑰M簽名(App簽名)並將證書放到App中
  4. 而後將App放入到iphone中。首先將App中的證書拿出來解析,誰能解析App的證書,由於App的證書是由蘋果服務器拿着私鑰A中進行加密的,也只有公鑰A能解密出來,也就是iphone中保存的公鑰A,經過驗證查看App是否被修改;而後再去驗證App的簽名,怎麼驗證App的簽名呢,(App簽名是經過Mac 電腦的私鑰M進行加密的,也只有證書中的公鑰M進行解密)就這樣通過了兩層驗證!

經過上面的講解,是否是發現特別的安全了?其實否則,由於大部分的應用都是經過AppStore進行安裝,若是經過上面的過程能夠安裝全部的蘋果設備,那麼還須要要Appstore幹嗎,這時候蘋果防止濫用App,就作了兩條限制:app

  1. 通過蘋果服務器中註冊過的設備
  2. 簽名只能具體到某一個App進行簽名(推送,受權等)

通過上面的講解,也引出了另外一個概念-描述文件。iphone

4 描述文件

描述文件又稱爲Provisioning profile,通常包括了三樣東西:

  1. 證書
  2. AppId
  3. 設備

當咱們打包或者是真機運行的時候,經過證書來驗證程序的安全性和合法性。

而且在App的使用中,蘋果還想控制App裏面的推送/iCloud及後臺運行等這些的權限,蘋果將這些權限開關統稱爲受權文件-Entitlements,並將文件放在了描述文件中。

在開發中,編譯一個App後,會用本地的私鑰M對App進行簽名,同時從蘋果服務器獲得的描述文件打包進App裏爲embeded.mobileprovision,把App安裝在手機中,最後系統進行來驗證。

上面的圖也會變爲以下:流程就是將描述文件加入,解決上面的問題?

 5 拓展

首先咱們作一個demo講解App包內容。

  • 首先看工程文件1-products文件,點擊打開Demo.app,顯示包內容,緊接着出現2-內容
  • 查看有_Codesignature,是資源文件簽名;embedded.mobileprovision是上面說的描述文件;另外咱們看下可執行代碼,也就是MachO文件,放在了001--Demo中,也就是黑色的一個,經過MachOView中能夠查看MachO文件。打開以後,代碼簽名放在MachO中以下:

也就是Code Signature--代碼簽名。

 可是咱們是作逆向開發,因此咱們要學會應用重命名!!!

 

2、iOS 應用重簽名

在講解重簽名中,首先學下終端命令:

當咱們從AppStore上下載App後,若是作了相應的更改,又怎麼會在手機上運行起來呢?這就須要應用重簽名,而且Xcode給咱們提供了重簽名技術-codesign技術。

拓展咱們首先來說解一下怎麼獲取應用的ipa包?

  1. 助手裏面下載
  2. 越獄手機裏面進行拷貝
  3. iTunes下載(12.6.3)

1 下面咱們將以在iTunes 12.6.3 下載了兩個版本的微信,一個爲正版,一個爲盜版的分別進行簽名!

經過微信-6.7.3(越獄應用)顯示包內容,看出對應的子目錄,查看playload文件夾,發現WeChat.app

2而後經過終端命令,otool -l WeChat | grep crypt 查看篩選後的cryp,獲得以下:

經過上面的發現cryptid = 0 表明是該App不是加密的,非0時表明是加密的。假如cryptid=1 表明是用1這種方式加密,不表明用1加密。

上面顯示爲何有兩個cryptid = 0 ,下面的輸入命令解釋了爲什麼有兩個:經過命令file WeChat

查看有Mach-O中有兩種架構,Mach-O executable arm_v7和Mach-O 64bit executable arm64兩個,arm_v7表明5s以前的手機,arm64表明的是5s手機以後

3 對越獄微信開始重簽名,由於cryptid  = 0

3.1 刪除多餘的越獄微信包內容

3.2 對Framework進行重簽名:codesign -fs 「本身的開發證書」 framework

 

下面是經過終端命令的截圖,完成對截圖內的Framework進行重簽名。

 

3.3 下面要對App包整個重籤,也就須要對描述文件進行重籤。首先將描述性文件放入到越獄微信包下(描述性文件必需要與boundId一致,infoPlist文件查看

 

 

 

開始要權限plist文件,將entitlements.plist放到了weChat.app同等級目錄中

咱們看WeChat.app中,該刪的已經刪掉,framework重籤,以及描述性文件加進去,下面用entitlements.plist對整個App包簽名。

經過命令codesign -fs 「本身證書」 --no-strict --entitlements=entitlements.plist WeChat.app,對包簽名

緊接着經過查看codesign -d -vv WeChat.app命令查看重簽名成功沒,上面的截圖中,發現證書已經變爲了本身的,說明重簽名成功。

結合着xcode與描述性文件,就能夠在手機上運行。

上面重簽名的步驟,可能並非很清晰,又準備了一個總結以下:

 3、拓展

3.1 Shell腳本

Shell腳本爲用戶提供了啓動程序,管理系統的文件以及運行在系統上進程的途徑。Shell在開發中通常指命令行工具,它容許輸入文本的命令,而後解釋命令,最後在內核中執行。Shell腳本,也是用各種命令預先放入到文件中,方便一次性執行的腳本文件。

下面咱們用demo方式講解shell命令:

首先經過命令建立文件夾,並在文件夾下建立「國孩」文本

查看桌面內容以下:

若是想這些命令一次性的執行,能夠嘗試寫一個腳本文件

而後進入到編輯頁面,將內容輸入進去

最後生成文件以下,也能完成目的

 

看到上面以後,使用到了bash,除了bash,還有zsh,Source等命令效果都是同樣的,怎麼查看mac支持哪些呢?

經過cd /private/etc,以及cat shells

經過上面的均可以知足創建123.txt。

可是上面的各個指令也有必定的區別,以下:

 

3.2 用戶、組、權限

也是以Demo的形式進入,在桌面上新建一個Demo文件夾。經過命令ls -l命令查看demo的文件權限

 

前面有一排-rw-r--r--等,你們可能不知道什麼意思,下面咱們來說解:經過一幅圖

上面就是文件類型與權限。

上面的權限可不能夠更改呢,對於逆向開發的人員,不是沒有東西是不能夠更改的,下面咱們來說述下更改文件類型和權限。

經過一幅圖來說解文件更改的基本內容和指令:

再以Demo的方式進行講解:

更改guohai.sh文件權限,取消全部權限(非讀非寫非執行)

再將user,group以及其餘設置爲可讀,執行以下:

還有其餘不少命令,你們能夠根據上圖本身嘗試。

 

4、腳本重簽名

學了上面的腳本,就是爲了下面所講的內容-腳本重簽名服務的,利用腳本進行重簽名。

首先打開項目工程-->build phases -->選擇以下:建立一個script腳本

建立以後

而後咱們按照以下步驟進行腳本簽名

# ${SRCROOT} 它是工程文件所在的目錄 TEMP_PATH="${SRCROOT}/Temp" ASSETS_PATH="${SRCROOT}/APP" TARGET_IPA_PATH="${ASSETS_PATH}/*.ipa" #清空Temp文件夾 rm -rf "$TEMP_PATH" mkdir "$TEMP_PATH" #1.1將IPA解壓到Temp下 unzip -oqq "$TARGET_IPA_PATH" -d "$TEMP_PATH" #1.2拿到解壓臨時的APP路徑 TEMP_APP_PATH=$(set -- "$TEMP_PATH/Payload/"*.app;echo "$1") echo "TEMP:🍺$TEMP_APP_PATH" #2拷貝APP #2.1拿到當前工程下的APP路徑 TARGET_APP_PATH="$BUILT_PRODUCTS_DIR/$TARGET_NAME.app" echo "TARGET_APP_PATH🍺:$TARGET_APP_PATH" #2.2拷貝三方APP到咱們的工程下 cp -rf "$TEMP_APP_PATH/" "$TARGET_APP_PATH" #3幹掉多餘的部分 rm -rf "$TARGET_APP_PATH/PlugIns" rm -rf "$TARGET_APP_PATH/Watch" #4修改info.plist 文件 /usr/libexec/PlistBuddy -c "Set :CFBundleIdentifier $PRODUCT_BUNDLE_IDENTIFIER" "$TARGET_APP_PATH/Info.plist" #5.給可執行文件上權限 #添加ipa二進制的執行權限,不然xcode會告知沒法運行 #這個操做是要找到第三方app包裏的可執行文件名稱,由於info.plist的 'Executable file' key對應的是可執行文件的名稱 #咱們grep 一下,而後取最後一行, 而後以cut 命令分割,取出想要的關鍵信息。存到APP_BINARY變量裏 APP_BINARY=`plutil -convert xml1 -o - $TARGET_APP_PATH/Info.plist|grep -A1 Exec|tail -n1 | cut -f2 -d\> | cut -f1 -d\<` echo "🍺: $APP_BINARY" chmod +x "$TARGET_APP_PATH/$APP_BINARY" #6.重簽名三方FrameWorks TARGET_APP_FRAMEWORKS_PATH="$TARGET_APP_PATH/Frameworks"
for FRAMEWORK in "$TARGET_APP_FRAMEWORKS_PATH/"*
do #echo "🍺FRAMEWORK:$FRAMEWORK"
/usr/bin/codesign --force --sign "$EXPANDED_CODE_SIGN_IDENTITY" "$FRAMEWORK" done

以上就是在項目中使用腳本進行重簽名,代碼程序也是上面的重籤步驟。

 

今天的iOS應用程序簽名以及應用重簽名的基本內容和操做,但願對你們有所幫助,謝謝閱讀!!!

原文出處:https://www.cnblogs.com/guohai-stronger/p/11781249.html

相關文章
相關標籤/搜索