1.codesign
Xocde提供了簽名工具,codesign,我們通過幾個命令就可以完成重簽名
I.終端命令
$security find-identity -v -p codesigning 列出鑰匙串里可簽名的證書
$Codesign –fs “證書串” 文件名 強制替換簽名
$Chmod +x 可執行文件 給文件添加權限
$security cms -D -i ../embedded.mobileprovision 查看描述文件
$codesign -fs “證書串” --no-strict --entitlements=權限文件.plist APP包
$Zip –ry 輸出文件 輸入文件 將輸入文件壓縮為輸出文件
II.重簽名步驟
1.刪除插件和帶有插件的.app包(比如Watch)
2.對Frameworks里面的庫進行重簽名
3.給可執行文件 +x(可執行)權限
4.添加描述文件(新建工程,真機編譯得到,而且要運行,將描述文件安裝到手機)
5.替換BundleID(info.plist 文件。 BundleID要和描述文件中的ID保持一致)
6.通過授權文件(Entilements)重簽.app包、
- 1.查看描述文件$security cms -D -i embedded.mobileprovision
- 2.將描述文件中Entilements 拷貝出來,生成plist文件。(文件名稱entitlements.plist )
- 3.用權限文件簽名APP包 $ codesign -fs "Apple Development: XX(XX)" --no-strict --entitlements=entitlements.plist WeChat.app
7.最后通過Xcode安裝
III.重簽名微信7.0.8版本
簽名??? 原始數據--->HASH--->加密
重簽名???原始數據--->HASH--->加密
重簽名并沒有改原始數據
- 1.解壓微信.ipa包能看到Payload文件夾下有一個WeChat應用程序
- 2.codesign -vv -d WeChat.app,此時發現WeChat具有簽名信息
3.查看Mac上自己的證書,security find-identity -v -p codesigning
image
4.通過otool -l WeChat查看MachO文件的詳細信息,太多一個屏幕占用不下,可以輸出到txt文檔中otool -l WeChat > ~/Desktop/123.txt,cryptid為0表示此MachO文件未加密
圖片.png
- 5.用普通賬號對WeChat進行重簽名,并安裝到手機上,若直接通過Xcode安裝微信7.0.8.ipa會安裝失敗,此時會驗證簽名信息,無法安裝
WeChat.app包里面的WeChat可執行文件,Frameworks,plugins,watch是需要重簽名的,免費賬號無法對plugins,watch進行重簽名,直接刪除
framework中也含有簽名信息
framework挨個進行重簽名
可執行文件要想重簽名,必須要有x可執行權限,否則簽名不成功
ls -l WeChat
-rwxr-xr-x@ 1 cloud staff 126048560 10 16 2019 WeChat
- 6.描述文件,用剛剛重簽的個人賬號新建WeChatDemo,編譯,在Product下生成WeChatDemo包中存在描述文件,運行到手機上,同時將描述文件embedded.mobileprovision拷貝到WeChat.app包中,描述文件與Bundle identifier(com.cloud.WeChatDemo)綁定了,在WeChat包中找到info.plist文件將Bundle identifier由com.tencent.xin替換為com.cloud.WeChatDemo
7.描述文件信息修改,描述文件中有一個Entitlements,拷貝此Key對應的字典到123.plist文件中,并將123.plist文件名改為entitlements.plist,重簽時需要設置權限,拷貝entitlements.plist到WeChat同一級目錄
image
以描述文件entitlements.plist的這一段描述來對WeChat.app這個包設置權限
codesign -fs "Apple Development: 785144130@qq.com (L694845PVL)" --no-strict --entitlements=entitlements.plist WeChat.app
簽名信息變更codesign -vv -d WeChat.app
- 8.通過Xcode安裝WeChat.app,Cmd + Shift + 2打開Xcode安裝頁,安裝WeChat.app
IV.Xcode重簽名微信7.0.8版本
1.新建和微信同名的工程WeChat,運行,Products下生成一個WeChat.app包,將前面替換好的已經重簽名的WeChat.app包替換掉此包,再次運行,能成功運行
圖片.png
- 2.從零開始,運行和微信同名空工程WeChat,
- A.將微信-7.0.8中的WeChat.app顯示包內容,刪掉Watch,Plugins文件夾
- B.重簽名Frameworks中的6個framework
- C.info.plist中的Bundle identifier由com.tencent.xin改為com.cloud.WeChat123
- D.用修改后的WeChat.app包替換Xcode中Products目錄下的WeChat.app,Xcode發現Products中有WeChat.app,會默認為是已經編譯完成的,運行
V.指令切換bash和zsh
chsh -s /bin/bash
chsh -s /bin/bash
VI.Shell
shell是一種特殊的交互式工具,它為用戶提供了啟動程序、管理文件系統中文件以及運行在系統上的進程的途徑。Shell一般是指命令行工具。它允許你輸入文本命令,然后解釋命令,并在內核中執行。
Shell腳本,也就是用各類命令預先放入到一個文本文件中,方便一次性執行的一個腳本文件。
快速新建文件夾和腳本文件的四種方式
1.mkdir shell,cd shell,touch 123.txt,三句代碼是新建文件夾和txt文件
image- 2.新建123.sh,后綴為.sh為腳本文件,執行以下三句其一都能執行,source 123.sh和bash 123.sh,zsh 123.sh的區別是source 123.sh會進入shell目錄中,bash,zsh執行會停留在當前目錄下,source停留在腳本執行完畢的目錄下
bash 123.sh
zsh 123.sh
source 123.sh
執行./123.sh會發現沒有執行權限,ls -l 123.sh,chmod +x 123.sh授權
$source FileName
意思:在當前shell環境中讀取并執行FileName中的命令
特點:
命令可以強行讓一個腳本去立即影響當前的環境(一般用于加載配置文件)。
命令會強制執行腳本中的全部命令,而忽略文件的權限。
zsh FileName
意思:重新建立一個子shell,在子shell中執行腳本里面的句子。
$./FileName
意思:讀取并執行文件中的命令。但有一個前提,腳本文件需要有可執行權限。
Mac中有多少個shell,shell在bin目錄下
/bin/bash Mac老系統中,新Mac系統使用zsh
/bin/csh 已經被tcsh替換了
/bin/dash 比bash小很多,效率更高,Ubantu,unix下使用較多
/bin/ksh AT&T發張,兼容bash
/bin/sh 已經被bash替換
/bin/tcsh 整合cshell,提供更多功能
/bin/zsh 新版Mac自帶
VII.用戶、組、權限
Unix和Linux都是多用戶、多任務的系統,所以這樣的系統里面就擁有了用戶、組的概念。那么同樣文件的權限也就有相應的所屬用戶和所屬組了。
不指定用戶組,默認是所有用戶a
VIII.腳本實現重簽名
- 1.新建APP和Temp文件夾,拷貝微信-7.0.8.ipa到APP文件夾中
- 2.新建腳本123.sh,給腳本授予執行權,chmod +r 123.sh
- 3.Xcode中新增運行腳本選項,./123.sh
執行完腳本WeChat.app已經被拷貝到Temp目錄下
# ${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
VIV.腳本重簽名安裝WeChat8.0.2
8.0.2的包直接運行會崩潰
8.0.2的包中需要刪掉info.plist中的UISupportedDevices,重新打包zip -ry WeChate.ipa Payload/
運行程序