1. 程式人生 > IOS開發 >iOS應用重簽名技術

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
  • 右鍵顯示包內容刪除無法簽名的外掛(PlugInsWatch
  • 終端輸入 security find-identity -v -p codesigning 尋找證書,拷貝需要使用的證書名稱
  • 進入WeChat.app/FrameWork資料夾,然後對資料夾下面的所有Framework簽名 ,終端進入當前目錄,輸入簽名程式碼 codesign -fs "證書名稱" xxx.framework
  • 新建一個Xcode專案WeChatDemo,並且執行到手機上一次
  • WeChatDemo中找到 WeChatDemo.app
  • 右鍵顯示包內容,拷貝描述檔案embedded.mobileprovisionWeChatCodeSign下,並且拷貝到WeChat.app中一份。
  • WeChatDemo中,新建一個plist檔案ent.plist(命名隨意)
  • 終端輸入security cms -Di embedded.mobileprovision 開啟 embedded.mobileprovision
  • 拷貝embedded.mobileprovisionkeyEntitlementsValue(簽名信息)到ent.plist
  • 拷貝ent.plistWeChatCodeSign
  • 進入WeChat.app 下找到info.plist 更改成WeChatDemobundle id
  • 最後進入WeChatCodeSign目錄下,對 App包進行簽名,終端輸入 codesign -fs "證書名稱" --no-strict --entitlements=ent.plist WeChat.app
  • Command + Shift + 2 安裝

詳細流程截圖

下載好的越獄的 WeChat.ipa

WeChat.ipa

我們下載好了這樣一個 WeChat.ipa 包後,解壓 ipa 包然後找到 WeChat.app 拷貝到一個新建資料夾WeChatCodeSign

WeChat.app

WeChat.app右鍵顯示包內容刪除無法簽名的外掛(PlugInsWatch

刪除無法簽名的外掛

終端輸入 security find-identity -v -p codesigning 尋找證書,拷貝需要使用的證書名稱("Apple Development: ZZZZZZ (ABENW7IAHK)")

注意:這裡有一個坑,如果你有多個同名證書,但是證書前面的編號不同,記得刪除無用的證書,不然簽名時候會報:簽名時使用了模稜兩可的證書。

尋找證書

終端輸入codesign -fs "證書名稱" xxx.framework,依次對WeChat.app/FrameWork下的xxx.frameWork簽名

對FrameWork簽名

新建工程WeChatDemo,真機編輯或執行一次,找到WeChatDemo.app拷貝embedded.mobileprovisionWeChatCodeSign下,並且拷貝到WeChat.app中一份。

WeChatDemo
WeChatCodeSign

WeChatDemo中,新建一個plist檔案ent.plist(命名隨意)

新建ent.plist

終端輸入security cms -Di embedded.mobileprovision 開啟 embedded.mobileprovision 並拷貝embedded.mobileprovisionkeyEntitlementsValue(簽名信息)到ent.plist

image.png
As Open Source
替換

拷貝ent.plistWeChatCodeSign下,然後進入WeChat.app 下找到info.plist 更改成WeChatDemobundle id,最後進入WeChatCodeSign目錄下,終端輸入 codesign -fs "證書名稱" --no-strict --entitlements=ent.plist WeChat.appApp包進行簽名

簽名

Command + Shift + 2 安裝WeChat

安裝WeChat

4、使用Xcode進行重簽名

使用Xcode重簽名的方式其實和我們手動簽名基本差不多,只是Xcode幫我們完成了將描述檔案拷貝到.app包裡,然後生成ent.plist和最後對App包的簽名而已,下方的工作還是需要做的。

  • 上述同樣的準備工作
  • 刪除該刪除的檔案
  • 簽名FrameWork包
  • 然後將WeChat.app覆蓋我們新建工程的.app
  • 執行就可以了

注意: 這有一個坑:使用Xcode重簽名的時候,新建的功能一定要和WeChat同名,不然Xcode讀取WeChatMacOView檔案時會因為找不到而不執行替換的包。

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