1. 程式人生 > >ipa重簽名

ipa重簽名

using dem vision tin PE 文檔 ted paths 刪除

為什麽要研究重簽名問題?
將程序打包成ipa包後,ipa包中會包含Provisioning Profile和_CodeSignature等文件,裏面包含了對整個ipa的簽名信息。

一旦改動ipa中的不論什麽內容,比如添加一個頭文件,簽名就會失效,導致ipa無法安裝。(貌似改變Info.plist是不影響的)
因此,假設要通過改動ipa包中的內容來篡改信息或註入代碼(比如加一個動態庫進去)的話。就須要解決ipa包的重簽名問題。


準備
在重簽名之前要做一些準備工作。


1.首先要下載並安裝Xcode,裏面有個codesign_allocate程序,在安裝時/usr/bin中會多一個codesign的程序,該程序用於ipa包的簽名。


2.企業證書的Certificate文件,私鑰文件,Provisioning Profile文件等。註意企業證書一定要是iOS Distribution的類型,不能是iOS Development。

其他具體設置。如In-House等參見http://beyondvincent.com/blog/2014/07/30/provision-ios-ipa-app-for-in-house-enterprise-distribution/


重簽名步驟
1.解壓ipa
解壓ipa得到Payload/[App name].bundle。打開bundle。


2.刪除舊的ipa簽名信息
刪除bundle中的_CodeSignature文件夾。也就是刪除之前ipa的簽名信息。


3.更換證書
將bundle中舊的Provisioning Profile刪除。用我們自己的企業證書的Provisioning Profile替代。


註意,要將ipa包中我們的企業證書改名為embedded.mobileprovision。


4.改動bundle內容
此時我們能夠盡情地改動bundle中的內容。比如加入一個動態庫。刪除一張圖片等。

註意:假設要往bundle中加入動態庫,必須要先將其壓縮成zip文件,在程序啟動時將其解壓到Documents文件夾下再dlopen。否則程序在啟動時載入動態庫文件會卡死在那裏。


5.又一次簽名
在完畢bundle內容的改動後。須要通過/usr/bin/codesign程序又一次簽名。命令例如以下:

/usr/bin/codesign -f -s "iPhone Distribution: YourCompanyName" --resource-rules Payload/ MYAPP.app/ResourceRules.plist Payload/ MYAPP.app
當中iPhone Distribution能夠從鑰匙串訪問中獲取,就是企業證書的名字,比如以下的"iPhone Distribution:XXXXXXXXXX":技術分享圖片


具體的命令演示樣例:

codesign -f -s "iPhone Developer: XXXXXXXXXX" --resource-rules Payload/NdCP_Game_Demo.app/ResourceRules.plist Payload/NdCP_Game_Demo.app
這條命令的意思是:使用keychain中"iPhone Developer: XXXXXXXXXX"標識的證書。依據Payload/NdCP_Game_Demo.app/ResourceRules.plist文件裏的規則進行簽名,假設ipa包中已經存在簽名,那麽將被替換,該過程生成的_CodeSignature文件夾將存放在Payload/NdCP_Game_Demo.app文件夾下。

在命令運行後,在bundle中會生成一個新的_CodeSignature文件夾,裏面包含了新的簽名信息。


6.又一次打包成ipa
在完畢上述工作後。能夠生成新的ipa進行公布。演示樣例命令例如以下:

zip -r ResignTest.ipa Payload
# 註意Payload後面不能有“/”


7.公布

經過打包公布測試。得出結論:對改動了ipa包內容和當中的簽名後,重簽名的ipa文件能夠在非越獄設備和越獄設備上安裝成功。註意,是通過帶有SSL證書的站點和Apple系統安裝的(企業內部分發程序)。不是通過PP助手那樣的第三方工具安裝的。


參考資料

http://www.cocoachina.com/bbs/simple/?t181236.html

http://www.169it.com/article/15588355475122308384.html


附錄
1.codesign

在幫助文檔中:

codesign -- Create and manipulate code signatures

codesign的選項:

-f, --force     When signing, causes codesign to replace any existing signature on the path(s) given. Without this option, existing signatures will not be replaced, and the signing operation fails.


-s, --sign identity     Sign the code at the path(s) given using this identity. See SIGNING IDENTITIES below.


--resource-rules filename   During signing, this option overrides the default rules for identifying and collecting bundle resources and nested code to be sealed into the signature. The argument is the path to a property list (plist) file containing scanning and qualification instructions. See the code signing documentation for details.


其用法例如以下:
Usage: codesign -s identity [-fv*] [-o flags] [-r reqs] [-i ident] path ... # sign
       codesign -v [-v*] [-R testreq] path|[+]pid ... # verify
       codesign -d [options] path ... # display contents
       codesign -h pid ... # display hosting paths


註意:CocoaChina論壇中當中一個帖子說重簽名後,會影響到keychain的使用,這一步有待驗證,後面會補充說明。



ipa重簽名