1. 程式人生 > >ipa重簽名的四種方式

ipa重簽名的四種方式

一 開發者除錯安裝app到手機的簽名過程

 1. Mac電腦生成公鑰M和私鑰M 2. 公鑰M傳給蘋果伺服器,蘋果伺服器的私鑰A對公鑰M進行加密生成證書返回給xcode 3. Xcode下載profile等描述檔案,用公鑰M對app進行加密生成app簽名,然後把app簽名和證書以及profile檔案一起打包成ipa 4. 手機進行兩次解密,手機用手機系統裡的公鑰A對證書進行解密得到公鑰M,然後對比profile描述檔案,檢視許可權,看是否合法;然後用公鑰M對app簽名進行解密 5. 手機裡的公鑰A與蘋果伺服器私鑰A相對應 過程如下圖:

二 加密和重簽名相關的命令

  1. 1.base64加密檔案:base64 test.txt -o new.txt

  2. 2. base64解密: base64 new.txt -o abc.txt -D

  3. 3. openssl生成私鑰: openssl genrsa -out private.pem 512

  4. 4. 由私鑰生成公鑰: openssl rsa -in private.pem -out public.pem -pubout

  5. 5. 檢視rsa的明文:openssl rsa -in private.pem -text -out private.text

  6. 6. 檢視csr解密資訊:openssl asn1parse -i -in CertificateSigningRequest.certSigningRequest

  7. 7. 檢視profile檔案資訊: /Users/mac/Library/MobileDevice/Provisioning\ Profiles 然後security cms -D -i e871987c-b4c5-4658-8338-f6e4cabaff8e.mobileprovision

  8. 8. 檢視簽名信息:ipa包解壓開啟,進入Payload,檢視.app的簽名信息 codesign -vv -d QQMusic.app

  9. 9. 檢視所有證書:security find-identity -v -p codesigning

  10. 10. 檢視可執行檔案macho的加密資訊:.app顯示包內容,找到同名的可執行檔案otool -l QQMusic | grep crypt得到以下結果:

  11. cryptoff 16384

  12. cryptsize 50085888

  13. cryptid 0

  14. cryptoff 16384

  15. cryptsize 55115776

  16. cryptid 0

  17. 兩個架構的cryptid都是0,都沒有加密

三 重簽名方式之一 手動重簽名 1. 新建工程codesignDemo,選擇證書和真機除錯 2. 進入包內容,因為免費證書無法重簽名外掛,所以刪除PlugIns資料夾,Watch裡也有外掛,也刪除 3. 對Frameworks裡的framework進行重簽名,有些包沒有Frameworks就忽略這步: 進入Frameworks 資料夾;然後一個一個的重簽名 

  1. security find-identity -v -p codesigning //檢視所有證書

  2. codesign -fs "iPhone Developer: [email protected] (Q4M32A5HU5)" QYUniversalFramework.framework //選擇和工程codesignDemo一樣的證書

4. 給可執行檔案執行許可權: chmod +x iQiYiPhoneVideo 5. codesignDemo工程裡的Products裡的codesignDemo.app顯示包內容,找到包內容裡的embedded.mobileprovision檔案,拷貝到需要重簽名的愛奇藝.app包內容中 6. codesignDemo工程的Bundle identifier拷貝到愛奇藝.app的包內容中的Info.plist的Bundle identifier 7. 找到第五步的embedded.mobileprovision檔案,然後security cms -D -i embedded.mobileprovision找到<key>Entitlements</key>,然後把<key>Entitlements</key>下面的:

  1. <dict>

  2. <key>keychain-access-groups</key>

  3. <array>

  4. <string>9D3898Q5N5.*</string>

  5. </array>

  6. <key>get-task-allow</key>

  7. <true/>

  8. <key>application-identifier</key>

  9. <string>9D3898Q5N5.www.demo.com.codesignDemo</string>

  10. <key>com.apple.developer.team-identifier</key>

  11. <string>9D3898Q5N5</string>

  12. </dict>

用Xcode生成plist檔案PropertyList.plist,然後Open As -> Source Code,把剛才的<dict>拷貝進去,得到如下:

  1. <?xml version="1.0" encoding="UTF-8"?>

  2. <!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">

  3. <!--

  4. PropertyList.plist

  5. codesignDemo

  6. Created by mac on 2018/5/14.

  7. Copyright (c) 2018年 meryin. All rights reserved.

  8. -->

  9. <plist version="1.0">

  10. <dict>

  11. <key>keychain-access-groups</key>

  12. <array>

  13. <string>9D3898Q5N5.*</string>

  14. </array>

  15. <key>get-task-allow</key>

  16. <true/>

  17. <key>application-identifier</key>

  18. <string>9D3898Q5N5.www.demo.com.codesignDemo</string>

  19. <key>com.apple.developer.team-identifier</key>

  20. <string>9D3898Q5N5</string>

  21. </dict>

  22. </plist>

8. 把第7步得到的plist檔案,和.app放在一個資料夾new中,進行重簽名

  1. ➜ new ls

  2. PropertyList.plist iQiYiPhoneVideo.app

  3. ➜ security find-identity -v -p codesigning

  4. 1) C5FF31245563ADB609BEAC77D10B9C96F0EB586A "iPhone Developer: [email protected] (Q4M32A5HU5)"

  5. 1 valid identities found

  6. ➜ codesign -fs "iPhone Developer: [email protected] (Q4M32A5HU5)" --no-strict --entitlements=PropertyList.plist iQiYiPhoneVideo.app //用工程codesignDemo的證書進行重簽名

9. 安裝到手機上 打包為ipa:  zip -ry newAiqiyi.ipa new 把new資料夾打包為newAiqiyi.ipa

安裝:Xcode command+shift+2進入到裝置管理,選擇+號找到剛才的newAiqiyi.ipa

四 重簽名方式之二 Xcode重簽名

1. 新建工程codesignDemo,選擇證書和真機除錯 2. 把iQiYiPhoneVideo.app替換codesignDemo工程的Products的codesignDemo.app替換成iQiYiPhoneVideo.app,並把iQiYiPhoneVideo.app改名為codesignDemo.app 3. 進入替換後的codesignDemo.app包內容中,刪除PlugIns資料夾和Watch資料夾 4. 重簽名對Frameworks裡的framework進行重簽名,有些包沒有Frameworks就忽略這步 5. 改替換後的codesignDemo.app包中的Info.plist的Bundle identifier改為codesignDemo工程的Bundle identifier 6. 給可執行檔案執行許可權:chmod +x iQiYiPhoneVideo 8. 執行工程codesignDemo五 重簽名方式之三 指令碼重簽名 1. 新建工程cosignAutoDemo,選擇證書和真機除錯,在工程根目錄裡新建APP和Temp資料夾: 2. xcode->Build Phases->+New Run Script Phase 3. 在Run Script的shell程式碼如下:

  1. # ${SRCROOT} 它是工程檔案所在的目錄

  2. TEMP_PATH="${SRCROOT}/Temp"

  3. #資原始檔夾

  4. ASSETS_PATH="${SRCROOT}/APP"

  5. #ipa包路徑

  6. TARGET_IPA_PATH="${ASSETS_PATH}/*.ipa"

  7. #新建Temp資料夾

  8. rm -rf "${SRCROOT}/Temp"

  9. mkdir -p "${SRCROOT}/Temp"

  10. #----------------------------------------

  11. # 1. 解壓IPA到Temp下

  12. unzip -oqq "$TARGET_IPA_PATH" -d "$TEMP_PATH"

  13. # 拿到解壓的臨時的APP的路徑

  14. TEMP_APP_PATH=$(set -- "$TEMP_PATH/Payload/"*.app;echo "$1")

  15. # echo "路徑是:$TEMP_APP_PATH"

  16. #----------------------------------------

  17. # 2. 將解壓出來的.app拷貝進入工程下

  18. # BUILT_PRODUCTS_DIR 工程生成的APP包的路徑

  19. # TARGET_NAME target名稱

  20. TARGET_APP_PATH="$BUILT_PRODUCTS_DIR/$TARGET_NAME.app"

  21. echo "app路徑:$TARGET_APP_PATH"

  22. rm -rf "$TARGET_APP_PATH"

  23. mkdir -p "$TARGET_APP_PATH"

  24. cp -rf "$TEMP_APP_PATH/" "$TARGET_APP_PATH"

  25. #----------------------------------------

  26. # 3. 刪除extension和WatchAPP.個人證書沒法簽名Extention

  27. rm -rf "$TARGET_APP_PATH/PlugIns"

  28. rm -rf "$TARGET_APP_PATH/Watch"

  29. #----------------------------------------

  30. # 4. 更新info.plist檔案 CFBundleIdentifier

  31. # 設定:"Set : KEY Value" "目標檔案路徑"

  32. /usr/libexec/PlistBuddy -c "Set :CFBundleIdentifier $PRODUCT_BUNDLE_IDENTIFIER" "$TARGET_APP_PATH/Info.plist"

  33. #----------------------------------------

  34. # 5. 給MachO檔案上執行許可權

  35. # 拿到MachO檔案的路徑

  36. APP_BINARY=`plutil -convert xml1 -o - $TARGET_APP_PATH/Info.plist|grep -A1 Exec|tail -n1|cut -f2 -d\>|cut -f1 -d\<`

  37. #上可執行許可權

  38. chmod +x "$TARGET_APP_PATH/$APP_BINARY"

  39. #----------------------------------------

  40. # 6. 重簽名第三方 FrameWorks

  41. TARGET_APP_FRAMEWORKS_PATH="$TARGET_APP_PATH/Frameworks"

  42. if [ -d "$TARGET_APP_FRAMEWORKS_PATH" ];

  43. then

  44. for FRAMEWORK in "$TARGET_APP_FRAMEWORKS_PATH/"*

  45. do

  46. #簽名

  47. /usr/bin/codesign --force --sign "$EXPANDED_CODE_SIGN_IDENTITY" "$FRAMEWORK"

  48. done

  49. fi

4. 在APP資料夾下放ipa包,然後執行

也可以把指令碼儲存成xcodeCodesign.sh檔案,然後在Run Script的shell的程式碼處,寫入xcodeCodesign.sh檔案的路徑;最後要chmod +x xcodeCodesign.sh,就可以運行了

 重簽名方式之四  MonkeyDev重簽名 1. MonkeyDev安裝 2. 新建MonkeyApp工程monkeyDemo

3. 在monkeyDemo資料夾的TargetApp裡放ipa包,然後執行

手動重簽名,由於證書等多方面細節問題容易簽名失敗;Xcode重簽名指令碼重簽名和MonkeyDev最好用