一夸浅、越獄版應(yīng)用重簽名(正版的需要砸殼瘟判,這個(gè)以后介紹)
應(yīng)用重簽名需要以下幾個(gè)步驟:
- 刪除插件和帶有插件的.app包
- 對(duì)Frameworks里面的庫進(jìn)行重簽名
- 給可執(zhí)行文件 +x(可執(zhí)行)權(quán)限
- 添加描述文件
- 替換BundleID
- 通過授權(quán)文件重簽app包
重簽名說白了就是用自己的證書和描述文件替換原應(yīng)用的證書和描述文件扭弧,更換原應(yīng)用的bundle_id。
下面以微信為例講解應(yīng)用重簽名,這里只供學(xué)習(xí)參考洼畅,不要用于商業(yè)和個(gè)人盈利佳鳖,否則后果自負(fù)霍殴。
1. 下載應(yīng)用
先在電腦上下載一個(gè)PP助手,然后下載微信越獄版安裝包。
應(yīng)用.png
下載后使用解壓縮工具將.ipa文件解壓
image.png
解壓縮后我們會(huì)得到如下圖所示的文件系吩,其中WeChat.app是我們重簽名操作的文件来庭。
image.png
使用下面的命令查看文件信息,可以看到應(yīng)用的簽名
codesign -d -vv WeChat.app
image.png
使用右鍵顯示包內(nèi)容查看WeChat.app文件內(nèi)容穿挨,其中存在一個(gè)如下圖所示的文件月弛,這就是可執(zhí)行文件
可執(zhí)行文件.png
使用如下命令可查看這個(gè)可執(zhí)行文件的相關(guān)信息
//查看信息
otool -l WeChat
//篩選查看信息,搜索crypt
otool -l WeChat | grep crypt
//重定向信息科盛,將信息輸出到WeChat.txt中
otool -l WeChat > ~/Desktop/WeChat.txt
image.png
可執(zhí)行文件信息中cryptid代表加密方式帽衙,0代表沒有加密,這里為什么會(huì)有兩個(gè)cryptid贞绵?
image.png
我們會(huì)發(fā)現(xiàn)可執(zhí)行文件支持兩種架構(gòu):arm_v7和arm64厉萝。一種架構(gòu)對(duì)應(yīng)一個(gè)加密方式,因此cryptid有兩個(gè)但壮。
2.準(zhǔn)備一個(gè)可用的開發(fā)證書和描述文件
可以使用命令查看鑰匙串里可簽名的證書
security find-identity -v -p codesigning
image.png
3.刪除插件和帶有插件的.app包
image.png
刪除PlugIns和Watch冀泻,應(yīng)為插件無法進(jìn)行重簽名,必須刪掉蜡饵。Watch文件加下WeChatWatchNative.app中也含有插件所以也必須刪掉弹渔。
4.對(duì)Frameworks中的文件進(jìn)行重簽名
image.png
使用下面的命令一次對(duì)*.framework文件進(jìn)行重簽名
codesign -fs "證書串" 文件名
5.給可執(zhí)行文件 +x(可執(zhí)行)權(quán)限
chmod +x WeChat
6.添加描述文件
將準(zhǔn)備的描述文件放到Wechat.app內(nèi)
描述文件可以通過下圖方式獲取
image.png
找到Test.app文件顯示包內(nèi)容
image.png
7.替換BundleID
打開WeChat.app內(nèi)的Info.plist文件,修改Bundle identifier為Test.app對(duì)應(yīng)的Bundle identifier
8.通過授權(quán)文件重簽app包
手動(dòng)重簽app包
首先使用下面命令查看描述文件信息
security cms -D -i embedded.mobileprovision
授權(quán)信息.png
將上述信息進(jìn)行復(fù)制溯祸,創(chuàng)建entitlements.plist文件肢专。
image.png
到此我們已經(jīng)將所有準(zhǔn)備工作都已做好舞肆,下面是利用權(quán)限文件entitlements.plist對(duì)WeChat.app進(jìn)行重簽名,命令如下:
codesign -fs “證書串” --no-strict --entitlements=權(quán)限文件.plist APP包
image.png
APP重簽名成功。
重簽名后的文件信息.png
image.png
進(jìn)行最后一步將重簽名成功后的文件進(jìn)行打包成.ipa格式文件博杖。
zip –ry 輸出文件 輸入文件
執(zhí)行成功后就可以安裝ipa文件了椿胯,我們應(yīng)用重簽名完成了!L旮哩盲!
利用Xcode對(duì)app進(jìn)行授權(quán)重簽
這里需要對(duì)工程名需要重簽名應(yīng)用同名,只能修改工程名,不能修改應(yīng)用名狈醉,否則行不通廉油。
- 應(yīng)用連接真機(jī),編譯一下苗傅,此時(shí)會(huì)生成一個(gè)WeChat.app抒线,如下圖
image.png
打開WeChat.app所在的文件夾,將前面幾個(gè)步驟處理好的越獄版的WeChat.app拷貝到此處渣慕,覆蓋工程產(chǎn)生的.app文件嘶炭。覆蓋后直接運(yùn)行工程,Xcode會(huì)自動(dòng)生成權(quán)限文件對(duì).app文件進(jìn)行重簽名并將應(yīng)用安裝到手機(jī)上逊桦。
三眨猎、使用腳本對(duì)應(yīng)用進(jìn)行重簽名
- 首先創(chuàng)建腳本appSign.sh腳本文件,放到當(dāng)前工程文件下
- 在工程文件下創(chuàng)建一個(gè)APP文件夾卫袒,用于存放要重簽名的ipa
-
配置工程如下圖所示
image.png - 配置成功后運(yùn)行工程即可將重簽名的應(yīng)用安裝到手機(jī)上
下面代碼是重簽名腳本宵呛,可直接復(fù)制使用
# ${SRCROOT} 它是工程文件所在的目錄
TEMP_PATH="${SRCROOT}/Temp"
#資源文件夾,我們提前在工程目錄下新建一個(gè)APP文件夾夕凝,里面放ipa包
ASSETS_PATH="${SRCROOT}/APP"
#目標(biāo)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"
# 拿到解壓的臨時(shí)的APP的路徑
TEMP_APP_PATH=$(set -- "$TEMP_PATH/Payload/"*.app;echo "$1")
# echo "路徑是:$TEMP_APP_PATH"
#----------------------------------------
# 2. 將解壓出來的.app拷貝進(jìn)入工程下
# 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.個(gè)人證書沒法簽名Extention
rm -rf "$TARGET_APP_PATH/PlugIns"
rm -rf "$TARGET_APP_PATH/Watch"
#----------------------------------------
# 4. 更新info.plist文件 CFBundleIdentifier
# 設(shè)置:"Set : KEY Value" "目標(biāo)文件路徑"
/usr/libexec/PlistBuddy -c "Set :CFBundleIdentifier $PRODUCT_BUNDLE_IDENTIFIER" "$TARGET_APP_PATH/Info.plist"
#----------------------------------------
# 5. 給MachO文件上執(zhí)行權(quán)限
# 拿到MachO文件的路徑
APP_BINARY=`plutil -convert xml1 -o - $TARGET_APP_PATH/Info.plist|grep -A1 Exec|tail -n1|cut -f2 -d\>|cut -f1 -d\<`
#上可執(zhí)行權(quán)限
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