iOS應用重簽名技術
瞭解了iOS應用簽名之後,發現蘋果就是通過簽名來驗證我們的證書能否能簽名我們的App
,那我們能不能用我們的證書對別人的App
進行簽名呢?理論上只要我們有了這個證書就能對這個App
進行簽名,那麼我們就可以用我們的證書對其他App
進行簽名。
1、App的簽名是由誰籤的?
平常我們使用Xcode
開發,我們基本上沒有關注過這些,其實App
的簽名是由我們Mac系統
裡面的CodeSign
工具完成的,只不過Xcode
幫我們幹了這些事情而已。
2、準備工作
首先我們需要一個砸過殼的App
,砸過殼的App
就是越獄應用,可以前往PP助手
下載。
使用otool -l WeChat | grep cry
可以檢視是否砸過殼
localhost : ~/Documents/SecurityProducts/003-CodeSign應用重簽名/ipa/微信-7.0.5(越獄應用)/Payload/WeChat.app : otool -l WeChat | grep cry
cryptoff 16384
cryptsize 100237312
cryptid 0
複製程式碼
注意:cryptid
0代表未加密(也就是說砸過殼的)
1代表加密的
3、如何使用CodeSign
進行重簽名?
注意此方式安裝的微信登入後會被封號
下方有詳細流程截圖。
步驟如下:
- 需要一個砸過殼的
WeChat.ipa
- 解壓
WeChat.ipa
- 找到
WeChat.app
拷貝到一個新建資料夾WeChatCodeSign
下- 右鍵
顯示包內容
刪除無法簽名的外掛(PlugIns
和Watch
)- 終端輸入
security find-identity -v -p codesigning
尋找證書,拷貝需要使用的證書名稱
- 進入
WeChat.app/FrameWork
資料夾,然後對資料夾下面的所有Framework
簽名 ,終端進入當前目錄,輸入簽名程式碼codesign -fs "證書名稱" xxx.framework
- 新建一個
Xcode
專案WeChatDemo
,並且執行到手機上一次- 在
WeChatDemo
中找到WeChatDemo.app
- 右鍵顯示包內容,拷貝描述檔案
embedded.mobileprovision
到WeChatCodeSign
下,並且拷貝到WeChat.app
中一份。- 在
WeChatDemo
中,新建一個plist
檔案ent.plist
(命名隨意)- 終端輸入
security cms -Di embedded.mobileprovision
開啟embedded.mobileprovision
- 拷貝
embedded.mobileprovision
下key
為Entitlements
的Value
(簽名信息)到ent.plist
- 拷貝
ent.plist
到WeChatCodeSign
下- 進入
WeChat.app
下找到info.plist
更改成WeChatDemo
的bundle id
- 最後進入
WeChatCodeSign
目錄下,對App
包進行簽名,終端輸入codesign -fs "證書名稱" --no-strict --entitlements=ent.plist WeChat.app
Command + Shift + 2
安裝
詳細流程截圖
下載好的越獄的 WeChat.ipa
包
我們下載好了這樣一個 WeChat.ipa
包後,解壓 ipa
包然後找到 WeChat.app
拷貝到一個新建資料夾WeChatCodeSign
下
對WeChat.app
右鍵顯示包內容
刪除無法簽名的外掛(PlugIns
和 Watch
)
終端輸入 security find-identity -v -p codesigning
尋找證書,拷貝需要使用的證書名稱
("Apple Development: ZZZZZZ (ABENW7IAHK)"
)
注意:這裡有一個坑,如果你有多個同名證書,但是證書前面的編號不同,記得刪除無用的證書,不然簽名時候會報:簽名時使用了模稜兩可的證書。
終端輸入codesign -fs "證書名稱" xxx.framework
,依次對WeChat.app/FrameWork
下的xxx.frameWork
簽名
新建工程WeChatDemo
,真機編輯或執行一次,找到WeChatDemo.app
拷貝embedded.mobileprovision
到WeChatCodeSign
下,並且拷貝到WeChat.app中一份。
在WeChatDemo
中,新建一個plist
檔案ent.plist
(命名隨意)
終端輸入security cms -Di embedded.mobileprovision
開啟 embedded.mobileprovision
並拷貝embedded.mobileprovision
下 key
為Entitlements
的Value
(簽名信息)到ent.plist
拷貝ent.plist
到WeChatCodeSign
下,然後進入WeChat.app
下找到info.plist
更改成WeChatDemo
的bundle id
,最後進入WeChatCodeSign
目錄下,終端輸入 codesign -fs "證書名稱" --no-strict --entitlements=ent.plist WeChat.app
對App
包進行簽名
Command + Shift + 2
安裝WeChat
4、使用Xcode
進行重簽名
使用Xcode
重簽名的方式其實和我們手動簽名基本差不多,只是Xcode
幫我們完成了將描述檔案拷貝到.app
包裡,然後生成ent.plist
和最後對App
包的簽名而已,下方的工作還是需要做的。
- 上述同樣的準備工作
- 刪除該刪除的檔案
- 簽名FrameWork包
- 然後將
WeChat.app
覆蓋我們新建工程的.app
包 - 執行就可以了
注意:
這有一個坑:使用Xcode
重簽名的時候,新建的功能一定要和WeChat
同名,不然Xcode
讀取WeChat
的MacOView
檔案時會因為找不到而不執行替換的包。
5、使用Shell
進行重簽名
使用Shell
(關於Shell)重簽名也就是把上面繁瑣的步驟寫成一個指令碼讓Xcode
去執行一步到位。
重簽名指令碼如下:
# ${SRCROOT} 它是工程檔案所在的目錄
TEMP_PATH="${SRCROOT}/Temp"
#資原始檔夾,我們提前在工程目錄下新建一個APP資料夾,裡面放ipa包
ASSETS_PATH="${SRCROOT}/APP"
#目標ipa包路徑
TARGET_IPA_PATH="${ASSETS_PATH}/*.ipa"
#清空Temp資料夾
rm -rf "${SRCROOT}/Temp"
mkdir -p "${SRCROOT}/Temp"
#----------------------------------------
# 1. 解壓IPA到Temp下
unzip -oqq "$TARGET_IPA_PATH" -d "$TEMP_PATH"
# 拿到解壓的臨時的APP的路徑
TEMP_APP_PATH=$(set -- "$TEMP_PATH/Payload/"*.app;echo "$1")
# echo "路徑是:$TEMP_APP_PATH"
#----------------------------------------
# 2. 將解壓出來的.app拷貝進入工程下
# BUILT_PRODUCTS_DIR 工程生成的APP包的路徑
# TARGET_NAME target名稱
TARGET_APP_PATH="$BUILT_PRODUCTS_DIR/$TARGET_NAME.app"
echo "app路徑:$TARGET_APP_PATH"
rm -rf "$TARGET_APP_PATH"
mkdir -p "$TARGET_APP_PATH"
cp -rf "$TEMP_APP_PATH/" "$TARGET_APP_PATH"
#----------------------------------------
# 3. 刪除extension和WatchAPP.個人證書沒法簽名Extention
rm -rf "$TARGET_APP_PATH/PlugIns"
rm -rf "$TARGET_APP_PATH/Watch"
#----------------------------------------
# 4. 更新info.plist檔案 CFBundleIdentifier
# 設定:"Set : KEY Value" "目標檔案路徑"
/usr/libexec/PlistBuddy -c "Set :CFBundleIdentifier $PRODUCT_BUNDLE_IDENTIFIER" "$TARGET_APP_PATH/Info.plist"
#----------------------------------------
# 5. 給MachO檔案上執行許可權
# 拿到MachO檔案的路徑
APP_BINARY=`plutil -convert xml1 -o - $TARGET_APP_PATH/Info.plist|grep -A1 Exec|tail -n1|cut -f2 -d\>|cut -f1 -d\<`
#上可執行許可權
chmod +x "$TARGET_APP_PATH/$APP_BINARY"
#----------------------------------------
# 6. 重簽名第三方 FrameWorks
TARGET_APP_FRAMEWORKS_PATH="$TARGET_APP_PATH/Frameworks"
if [ -d "$TARGET_APP_FRAMEWORKS_PATH" ];
then
for FRAMEWORK in "$TARGET_APP_FRAMEWORKS_PATH/"*
do
#簽名
/usr/bin/codesign --force --sign "$EXPANDED_CODE_SIGN_IDENTITY" "$FRAMEWORK"
done
fi
複製程式碼
拷貝上述內容,開啟終端輸入touch appShell.sh
新建一個Shell
檔案,再輸入vim appShell.sh
開啟檔案,按i
後再貼上內容,最後按Esc
輸入:wq