應用重簽名,就是把已經存在的ipa
包,重新配置一套證書和描述文件,再簽名生成一個新的ipa
包
codesign重簽名
Xcode
提供了簽名工具codesign
,通過幾個命令就可以完成重簽名終端命令
查看鑰匙串里可簽名的證書
security find-identity -v -p codesigning
強制替換簽名
codesign -fs "證書串" 文件名
給文件添加權限
chmod +x 可執行文件
查看描述文件
security cms -D -i embedded.mobileprovision
用權限文件簽名
App
包codesign -fs "證書串" --no-strict --entitlements=權限文件.plist App包
將輸入文件壓縮為輸出文件
zip -ry 輸出文件 輸入文件
案例1:
查看應用的簽名信息
從某助手導出砸殼后的
wx7.0.8.ipa
,將其解壓
使用
codesign
命令,查看應用的簽名信息codesign -vv -d WeChat.app ------------------------- Executable=/Users/zang/Zang/Spark/LG/11/wx7.0.8/Payload/WeChat.app/WeChat Identifier=com.tencent.xin Format=app bundle with Mach-O thin (arm64) CodeDirectory v=20400 size=972531 flags=0x0(none) hashes=30383+5 >location=embedded Signature size=4864 Authority=iPhone Distribution: Tencent Technology (Shenzhen) Company Limited (88L2Q4487U) Authority=Apple Worldwide Developer Relations Certification Authority Authority=Apple Root CA Signed Time=Oct 16, 2019 at 17:54:10 Info.plist entries=68 TeamIdentifier=88L2Q4487U Sealed Resources version=2 rules=10 files=1470 Internal requirements count=1 size=212
案例2:
查看鑰匙串里可簽名的證書
security find-identity -v -p codesigning ------------------------- 1) E972414310363E12F223F4AB36027459EB2XXXXX "iPhone Distribution: XXX1 (ZH6L374XXX)" 2) 9671D2A6816E643601A25DE66FA1E7F64F9XXXXX "iPhone Developer: XXX2 (79DN9L6XXX)" 3) DE19F59CD715AB8E727F492126BA8064E60XXXXX "iPhone Developer: XXX3 (XM33C3GXXX)" 4) ABD73916998A2CC8FF65BAB19F5C127B66DXXXXX "iPhone Distribution: Beijing XXX XXX Information Technology Co., Ltd. (BD69S49XXX)" 4 valid identities found
案例3:
查找
MachO
中的cryptid
關鍵字otool -l WeChat | grep cryptid -A 1 -B 5 ------------------------- Load command 12 cmd LC_ENCRYPTION_INFO_64 cmdsize 24 cryptoff 16384 cryptsize 101695488 cryptid 0 pad 0
cryptid
為加密算法的id
,cryptid
為0
表示當前可執行文件是未加密的,俗稱:脫殼在
MachO
中,最重要的就是代碼段和數據段,而加密和簽名僅針對代碼段
案例4:
在未越獄設備上,直接安裝砸殼后的
wx7.0.8.ipa
打開
Xcode
,選擇Window -> Devices and Simulators
點擊
+
,選擇安裝wx7.0.8.ipa
提示
Unable to install
未越獄設備,安裝
App
需要進行簽名驗證,直接安裝提示Unable to install
。要想成功安裝到設備上,需要對其進行重簽名
codesign
重簽名步驟:1、刪除插件和帶有插件的
.app
包(比如Watch
)2、對
Frameworks
里面的庫進行重簽名3、給可執行文件
+x
可執行權限4、新建工程,真機編譯并運行,將描述文件安裝到手機。將描述文件拷貝到
.app
包中5、
info.plist
文件中替換BundleID
。BundleID
要和描述文件中的ID
保持一致6、通過授權文件(
Entitlements
)重簽.app
包
- 查看描述文件
security cms -D -i embedded.mobileprovision
- 將描述文件中
Entitlements
拷貝出來,生成plist
文件。文件名稱entitlements.plist
- 用權限文件簽名
App
包codesign -fs "Apple Development: XX(XX)" --no-strict --entitlements=entitlements.plist WeChat.app
7、最后通過
Xcode
安裝
案例5:
使用
codesign
對App
重簽名右鍵
.app
文件,選擇顯示包內容
,進入App
目錄
刪除插件和帶有插件的
.app
包,刪除PlugIns
目錄和Watch
目錄
對
Frameworks
里面的庫進行重簽名
進入
Frameworks
目錄cd Frameworks
對
.framework
文件依次重簽名codesign -fs "iPhone Developer: XXX2 (79DN9L6XXX)" andromeda.framework codesign -fs "iPhone Developer: XXX2 (79DN9L6XXX)" mars.framework codesign -fs "iPhone Developer: XXX2 (79DN9L6XXX)" marsbridgenetwork.framework codesign -fs "iPhone Developer: XXX2 (79DN9L6XXX)" matrixreport.framework codesign -fs "iPhone Developer: XXX2 (79DN9L6XXX)" OpenSSL.framework codesign -fs "iPhone Developer: XXX2 (79DN9L6XXX)" ProtobufLite.framework ------------------------- andromeda.framework: replacing existing signature mars.framework: replacing existing signature marsbridgenetwork.framework: replacing existing signature matrixreport.framework: replacing existing signature OpenSSL.framework: replacing existing signature ProtobufLite.framework: replacing existing signature
回到上級目錄
cd ..
對應用重簽名,可執行文件必須有可執行權限
chmod +x WeChat
添加描述文件。使用重簽名的
賬號
新建工程
真機編譯并
運行
,將描述文件安裝到手機
將描述文件拷貝到
.app
包中
info.plist
文件中替換BundleID
。BundleID
要和描述文件中的ID
保持一致
在項目中創建授權文件(
Entitlements
)
命名
entitlements.plist
查看描述文件,找到權限信息
security cms -D -i embedded.mobileprovision
將
<dict>...</dict>
的內容,復制到entitlements.plist
文件中
將項目中的
entitlements.plist
文件,拷貝到.app
文件的平級目錄下
使用重簽名的
賬號
和權限文件簽名App
包codesign -fs "iPhone Developer: XXX2 (79DN9L6XXX)" --no-strict --entitlements=entitlements.plist WeChat.app ------------------------- WeChat.app: replacing existing signature
使用
codesign
命令,查看應用的簽名信息codesign -vv -d WeChat.app ------------------------- Executable=/Users/zang/Zang/Spark/LG/11/wx7.0.8/Payload/WeChat.app/WeChat Identifier=com.feng.drivingtrain Format=app bundle with Mach-O thin (arm64) CodeDirectory v=20400 size=972537 flags=0x0(none) hashes=30383+5 location=embedded Signature size=4793 Authority=iPhone Developer: XXX2 (79DN9L6XXX) Authority=Apple Worldwide Developer Relations Certification Authority Authority=Apple Root CA Signed Time=Apr 21, 2021 at 13:38:17 Info.plist entries=68 TeamIdentifier=ZH6L37455T Sealed Resources version=2 rules=10 files=1143 Internal requirements count=1 size=184
- 確認簽名已成功替換
將重簽名后的
App
安裝到手機
案例6:
勾選
Automatically manage signing
選項的差異當項目勾選
Automatically manage signing
選項,查看描述文件中的權限信息security cms -D -i embedded.mobileprovision
application-identifier
:ZH6L37455T.*
- 在
案例5
中,未勾選Automatically manage signing
,顯示為ZH6L37455T.com.feng.drivingtrain
繼續后面的流程,將重簽名后的
App
安裝到手機
- 問題出現了,覆蓋安裝,提示
Unable to install
這種情況,需要先刪除手機中的
App
再次安裝,重簽名后的
App
可以順利的安裝到手機上
復制權限信息的步驟,一定要檢查
application-identifier
ZH6L37455T.*
:無法覆蓋安裝ZH6L37455T.com.feng.drivingtrain
:可覆蓋安裝
案例7:
Debug
重簽名App
在手機上運行
App
選擇
Debug -> Attach to Process
,找到對應App
- 出現重復
App
,選擇進程號較大的使用
Debug View Hierarchy
開始調試
Xcode重簽名
Xcode
重簽名步驟:1、刪除插件和帶有插件的
.app
包(比如Watch
)2、對
Frameworks
里面的庫進行重簽名3、給可執行文件
+x
可執行權限4、
info.plist
文件中替換BundleID
。BundleID
要和描述文件中的ID
保持一致5、將
App
包拷貝到Xcode
工程目錄中,剩下的交給Xcode
案例1:
利用
Xcode
重簽名創建和重簽名
App
同名工程
真機編譯并運行
刪除插件和帶有插件的
.app
包,刪除PlugIns
目錄和Watch
目錄對
Frameworks
里面的庫進行重簽名給可執行文件
+x
可執行權限
info.plist
文件中替換BundleID
將修改后的
App
包,替換項目中的包
直接通過
Xcode
運行項目即可
Shell腳本
Shell
是一種特殊的交互式工具,它為用戶提供了啟動程序、管理文件系統中文件以及運行在系統上的進程的途徑。Shell
一般是指命令行工具。它允許你輸入文本命令,然后解釋命令,并在內核中執行。
Shell
腳本,也就是用各類命令預先放入到一個文本文件中,方便一次性執行的一個腳本文件。
.bashrc
、.bash_profile
和.zshrc
作用與區別在使用命令行工具時,我們可能會遇到一些教程,可能需要你把一些配置寫入到
.bashrc
、.bash_profile
或者.zshrc
等。那么這幾個文件到底有什么作用和區別?從文件名稱判斷
.bashrc
、.bash_profile
是給bash
來使用的。而.zshrc
是給zsh
來使用的查看
bash
版本:bash ------------------------- The default interactive shell is now zsh. To update your account to use zsh, please run `chsh -s /bin/zsh`. For more details, please visit https://support.apple.com/kb/HT208050. bash-3.2$
查看
zhs
的安裝路徑:which zsh ------------------------- /bin/zsh
查看
bash
的安裝路徑:which bash ------------------------- /bin/bash
zsh
切換bash
,重新打開終端即可chsh -s /bin/bash
bash
切換zsh
,重新打開終端即可chsh -s /bin/zsh
配置建議
bash
:
- 將配置選項放到
~/.bashrc
中,然后在~/.bash_profile
中通過source
調用
zsh
:
- 建議仍然將配置選項放到
~/.bashrc
,~/.bash_profile
中通過source
調用,最后在~/.zshrc
中source
調用~/.bash_profile
運行方式
$source x.sh
:
- 在當前
Shell
環境中讀取并執行x.sh
中的命令- 命令可以強行讓一個腳本去立即影響當前的環境(一般用于加載配置文件)
- 命令會強制執行腳本中的全部命令,而忽略文件的權限
$bash x.sh
、$zsh x.sh
:
- 重新建立一個子
Shell
,在子Shell
中執行腳本里面的句子
$./x.sh
:
- 讀取并執行文件中的命令。但有一個前提,腳本文件需要有可執行權限
用戶、組、權限
Unix
和Linux
都是多用戶、多任務的系統,所以這樣的系統里面就擁有了用戶、組的概念。那么同樣文件的權限也就有相應的所屬用戶和所屬組了。
windows
和macOS
,不同系統的目錄結構
windows
,偽多用戶模式,目錄分為不同磁盤,所有用戶都可以訪問到macOS
,真正的多用戶模式,在home
目錄下分為不同的用戶,每個用戶都有自己獨立的桌面、文檔、下載
macOS
下不同用戶還可以進行分組,所以它的文件權限設置就會相對復雜
查看文件屬性
ls -l ------------------------- total 412368 -rw-r--r--@ 1 zang staff 210766049 11 26 2019 wx7.0.8.ipa drwxr-xr-x 2 zang staff 64 4 21 17:21 未命名文件夾
- [權限] [連接] [所有者] [所屬組] [文件大小] [最后修改日期] [文件名稱]
文件類型與權限(
permission
)
第一個字母:文件類型,常見:
d
:目錄(directory
)-
:文件一個文件的完整權限,總共分為三組:
- 第一組:文件所有者的權限
- 第二組:這一組其他用戶的權限
- 第三組:非本組用戶的權限
每一組文件權限的
rwx-
表示:
r
:讀(read
)w
:寫(write
)x
:執行(execute
)- 這三個權限的位置不會變,依次是
rwx
- 出現
-
在對應位置,代表沒有此權限
修改權限
文件權限的改變使用
chmod
命令設置方法有兩種:
- 數字類型
- 符號類型
文件權限分為三種身份:
[user] [group] [other]
三種權限分別為:
[read] [write] [execute]
數字類型:
各個權限數字對照:
r
:4
,1
左移2
位w
:2
,1
左移1
位x
:1
,1
左移0
位轉為二進制:
r
:0100
w
:0010
x
:0001
使用這種設計方式,不同權限可以按位或,哪一位為1表示有該權限存在。在開發中,適用于多個選項的位移枚舉,使用按位或就能得到最終結果
例如:一個文件權限為
-rwxr-xr-x
User
:4 + 2 + 1 = 7
Group
:4 + 0 + 1 = 5
Other
:4 + 0 + 1 = 5
使用命令:
chmod 755 file
例如:刪除所有用戶組的所有權限
chmod 000 file
符號類型:
chmod `[u、g、o、a]` `[+、-、=]` `[r、w、x]` file
用戶組:
u
:User
g
:Group
o
:Other
a
:All
,不設置默認為a
操作:
+
:加入-
:除去=
:設置權限:
r
:讀w
:寫x
:執行例如:對文件所有用戶組增加可執行權限
chmod a+x file
例如:刪除其他用戶的所有權限
chmod o=- file
例如:當前用戶具有所有權限,組用戶有讀寫權限,其他用戶只有讀權限
chmod u=rwx,g=rw,o=r file
腳本自動重簽名
案例1:
搭建
在項目根目錄,創建
rsign.sh
文件
為
rsign.sh
文件增加可執行權限chmod a+x rsign.sh
在項目根目錄,創建
APP
文件夾
將
wx7.0.8.ipa
拷貝到APP
文件夾
打開
rsign.sh
文件,寫入以下代碼:【準備工作】:定義變量
TEMP_PATH="${SRCROOT}/Temp" ASSETS_PATH="${SRCROOT}/APP" TARGET_IPA_PATH="${ASSETS_PATH}/*.ipa"
${SRCROOT}
:工程文件所在的目錄TEMP_PATH
:臨時目錄,將ipa
包解壓到Temp
目錄ASSETS_PATH
:資源文件夾,提前在工程目錄下新建一個APP
文件夾,里面放ipa
包TARGET_IPA_PATH
:目標ipa
包路徑清空
Temp
文件夾rm -rf "${SRCROOT}/Temp" mkdir -p "${SRCROOT}/Temp"
【第一步】:解壓
ipa
包到Temp
目錄unzip -oqq "$TARGET_IPA_PATH" -d "$TEMP_PATH"
拿到解壓的臨時的
App
的路徑TEMP_APP_PATH=$(set -- "$TEMP_PATH/Payload/"*.app;echo "$1")
【第二步】:將解壓出來的
.app
拷貝進入工程下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"
$BUILT_PRODUCTS_DIR
:工程生成的App
包的路徑$TARGET_NAME
:target
名稱
【第三步】:刪除
Extension
和WatchApp
rm -rf "$TARGET_APP_PATH/PlugIns" rm -rf "$TARGET_APP_PATH/Watch"
- 個人證書無法簽名
Extention
【第四步】:更新
info.plist
文件CFBundleIdentifier
/usr/libexec/PlistBuddy -c "Set :CFBundleIdentifier $PRODUCT_BUNDLE_IDENTIFIER" "$TARGET_APP_PATH/Info.plist"
- 格式:
"Set :KEY Value" "目標文件路徑"
【第五步】:給
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"
APP_BINARY
:拿到MachO
文件的路徑
【第六步】:重簽名第三方
FrameWorks
TARGET_APP_FRAMEWORKS_PATH="$TARGET_APP_PATH/Frameworks" if [ -d "$TARGET_APP_FRAMEWORKS_PATH" ]; then for FRAMEWORK in "$TARGET_APP_FRAMEWORKS_PATH/"* do
【第七步】:用權限文件簽名
App
包/usr/bin/codesign --force --sign "$EXPANDED_CODE_SIGN_IDENTITY" "$FRAMEWORK"
來到項目,點擊
Target
,選擇Build Phases
,在Run Script
中輸入:./rsign.sh
真機運行項目,
App
安裝成功
Xcode
配合腳本實現自動重簽名,App
在非越獄設備上也能正常運行
案例2
安裝更高版本
App
從某人越獄設備上導出砸殼后的
wx8.0.2.ipa
,拷貝到APP
文件夾
真機運行項目,
App
安裝成功,但運行時報錯
解壓
ipa
包,進入App
目錄,打開info.plist
文件
- 由于砸殼后
ipa
做了瘦身,一些支持的設備在info.plist
里顯示不全,只需要刪除info.plist
的UISupportedDevices
節點即可刪除
UISupportedDevices
節點后,將解壓后的Payload
文件夾,重新打包成ipa
包zip -ry wx8.0.2.ipa Payload
再次運行項目,
App
運行成功
總結
codesign
重簽名
- 刪除不能簽名的文件:
Extention
和Watch
(包含了Extention
)- 重簽名
Frameworks
里面的庫- 給可執行文件
+x
可執行權限- 新建工程,真機編譯并運行,將描述文件安裝到手機。將描述文件拷貝到
.app
包中- 修改
info.plist
文件的BundleID
- 通過授權文件重簽
.app
包- 最后通過
Xcode
安裝
Xcode
重簽名
- 刪除不能簽名的文件:
Extention
和Watch
(包含了Extention
)- 重簽名
Frameworks
里面的庫- 給可執行文件
+x
可執行權限- 修改
info.plist
文件的BundleID
- 將
App
包拷貝到Xcode
工程目錄中,剩下的交給Xcode
Shell
- 切換
Shell
使用chsh -s Shell路徑
命令- 現在
macOS
中默認Shell
是zsh
,早期是bash
Shell
啟動時初始化的配置文件:
zsh
:.zshrc
bash
:.bash_profile
文件權限和用戶組
- 每個文件都有所屬的用戶、組、其他
- 文件權限歸屬:用戶、組、其他
- 權限:寫、讀、執行
修改權限
- 使用
chmod
命令- 數字類型:
r
:4
w
:2
x
:1
- 符號類型:
用戶組:u
:用戶,g
:組,o
:其他,a
:所有
操作:+
:添加,-
:去掉,=
:設置
權限:r
:讀,w
:寫,x
:執行