首先理解一件事:簽名是可以被替換的。
簽名:原始數(shù)據(jù)->hash->加密
重簽名:原始數(shù)據(jù)->hash->加密
這也就是簽名可以被替換的原因。
一阅签、codesign重簽名
codesign
安裝Xcode
就有霉撵,Xcode
也是用的這個(gè)工具芹助。
簽名包含:
資源文件
macho文件
framework
...
1.1終端命令
1.1.1查看簽名信息
codesign -vv -d xxx.app
1.1.2列出鑰匙串里可簽名的證書
security find-identity -v -p codesigning
1.1.3otool
分析macho
文件信息并導(dǎo)出到指定文件
otool -l xxx > ~/Desktop/machoMessage.txt
其中cryptid
為0
表示沒有用到加密算法(也就是脫殼的), 其它則表示加密挟纱。
也可以直接過濾查看是否砸殼:
otool -l xxx | grep cryptid
1.1.4強(qiáng)制替換簽名
codesign –fs “證書串” 文件名
codesign -fs "Apple Development: xxx@qq.com (9AN9M5S786)" andromeda.framework
1.1.5給文件添加權(quán)限
chmod +x 可執(zhí)行文件
1.1.6查看描述文件
security cms -D -i ../embedded.mobileprovision
1.1.7macho簽名
codesign -fs “證書串” --no-strict --entitlements=權(quán)限文件.plist APP包
1.1.8將輸入文件壓縮為輸出文件
zip –ry 輸出文件 輸入文件
1.1.9越獄的手機(jī)dump app
包
// 建立連接
sh usbConnect.sh
//連接手機(jī)
sh usbX.sh
//查看進(jìn)程
ps -A
//找到微信進(jìn)程羞酗,拿到路徑
ps -A | grep WeChat
//進(jìn)入目標(biāo)文件夾拷貝微信(這里是沒有砸殼的)
scp -r -p 12345 root@localhost:微信路徑 ./
1.2codesign命令重簽名
這里以砸過殼的微信(7.0.8
)為例,使用免費(fèi)開發(fā)者賬號(hào)重簽名微信紊服,然后安裝到非越獄手機(jī)上檀轨。
解壓縮
.ipa
包,Payload
中找到.app
顯示包內(nèi)容欺嗤。
??由于免費(fèi)證書沒有辦法簽名PlugIns
和Watch
参萄,直接將這兩個(gè)文件夾刪除。簽名
Frameworks
逐個(gè)簽名Frameworks
目錄下的framework
(使用自己本機(jī)的免費(fèi)證書)
codesign -fs "Apple Development: xxx@qq.com (9AN9M5S786)" andromeda.framework
- 確保要簽名的
app
的macho
文件的可執(zhí)行權(quán)限
? WeChat.app ls -l WeChat
-rwxr-xr-x@ 1 zaizai staff 126048560 10 16 2019 WeChat
-
獲取免費(fèi)賬號(hào)對(duì)應(yīng)的描述文件
創(chuàng)建空工程使用免費(fèi)賬號(hào)&真機(jī)編譯獲運(yùn)行取描述文件煎饼。
這個(gè)時(shí)候描述文件已經(jīng)拷貝到手機(jī)中去了讹挎,并且已經(jīng)信任設(shè)備。
將獲取到的描述文件拷貝到 WeChat
app包中吆玖。
5.修改bundleId
找到WeChat info.plist
修改BundleId
為我們生成描述文件的BundleId
- 獲取描述文件的權(quán)限
security cms -D -i embedded.mobileprovision
找到對(duì)應(yīng)的權(quán)限Entitlements
:
<dict>
<key>application-identifier</key>
<string>S48J667P47.com.guazai.TestWeChat</string>
<key>keychain-access-groups</key>
<array>
<string>S48J667P47.*</string>
</array>
<key>get-task-allow</key>
<true/>
<key>com.apple.developer.team-identifier</key>
<string>S48J667P47</string>
</dict>
創(chuàng)建一個(gè).plist
文件筒溃,將權(quán)限內(nèi)容粘貼進(jìn)去:
內(nèi)容如下:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<!--
Entitlements.plist
TestWeChat
Created by ZP on 2021/4/19.
Copyright (c) 2021 ___ORGANIZATIONNAME___. All rights reserved.
-->
<plist version="1.0">
<dict>
<key>application-identifier</key>
<string>S48J667P47.com.guazai.TestWeChat</string>
<key>keychain-access-groups</key>
<array>
<string>S48J667P47.*</string>
</array>
<key>get-task-allow</key>
<true/>
<key>com.apple.developer.team-identifier</key>
<string>S48J667P47</string>
</dict>
</plist>
將權(quán)限文件(Entitlements.plist
)拷貝到和Payload
中WeChat.app
同一目錄
- 簽名
Wechat
codesign -fs "Apple Development: xxx@qq.com (9AN9M5S786)" --no-strict --entitlements=entitlements.plist WeChat.app
這里entitlments
參數(shù)需要和上一步生成的權(quán)限文件名稱對(duì)應(yīng)上。
這個(gè)時(shí)候簽名信息就已經(jīng)替換了:
這個(gè)時(shí)候通過Xcode
將WeChat.app
包安裝到手機(jī)就已經(jīng)能正常安裝了沾乘。
通過debug->attach to process->WeChat
就可以調(diào)試微信了:
??這個(gè)時(shí)候不要用自己的常用賬號(hào)登錄重簽名的微信(有可能被封號(hào))怜奖。
重簽名步驟:
- 刪除插件以及帶有插件的
.app
包(如:watch
)
PlugIns
和Watch
文件夾 - 對(duì)
Frameworks
中的庫重簽名
codesign -fs "Apple Development: xxx@qq.com (9AN9M5S786)" andromeda.framework
- 對(duì)可執(zhí)行文件
+X
(可執(zhí)行)權(quán)限
chmod +x WeChat
- 添加描述文件(創(chuàng)建工程,真機(jī)編譯得到意鲸,并且需要運(yùn)行將描述文件安裝到手機(jī))
- 替換
info.plist BundleId
(BundleId
要和描述文件中的一致) - 通過授權(quán)文件(
entitlments
)重簽名.app
包
a.獲取描述文件權(quán)限內(nèi)容security cms -D -i embedded.mobileprovision
b.將描述文件權(quán)限內(nèi)容拷貝生成plist
文件Entitlements.plist
c.用全線文件簽名App
包:codesign -fs "Apple Development: xxx@qq.com (9AN9M5S786)" --no-strict --entitlements=entitlements.plist WeChat.app
二烦周、利用Xcode重簽名調(diào)試三方應(yīng)用
1.新建和微信同名工程WeChat
2.將空工程運(yùn)行到真機(jī)上。
3.解壓.ipa
包怎顾,并且刪除Watch
和PlugIns
文件夾
4.重簽名Frameworks
5.修改BundleId
6.將修改后的WeChat.app
替換空工程的Products
中.app
7.運(yùn)行
這個(gè)時(shí)候Products
工程中有WeChat.app
读慎,Xcode
認(rèn)為有就直接使用這個(gè)了。這個(gè)時(shí)候就可以調(diào)試了(不需要attach
)
??在某些系統(tǒng)下會(huì)出現(xiàn)啟動(dòng)重簽名微信黑屏槐雾,建議通過腳本重簽名夭委。
三、SHELL腳本
shell
是一種特殊的交互式工具募强,它為用戶提供了啟動(dòng)程序株灸、管理文件系統(tǒng)中文件以及運(yùn)行在系統(tǒng)上的進(jìn)程的途徑。Shell
一般是指命令行工具擎值。它允許你輸入文本命令慌烧,然后解釋命令,并在內(nèi)核中執(zhí)行鸠儿。
Shell
腳本屹蚊,也就是用各類命令預(yù)先放入到一個(gè)文本文件中厕氨,方便一次性執(zhí)行的一個(gè)腳本文件。
腳本切換
chsh -s /bin/zsh
執(zhí)行腳本的幾種方式:
有如下腳本:
mkdir shell1
cd shell1
touch test.txt
source FileName
作用:在當(dāng)前shell
環(huán)境中讀取并執(zhí)行FileName
中的命令
特點(diǎn):命令可以強(qiáng)行讓一個(gè)腳本去立即影響當(dāng)前的環(huán)境(一般用于加載配置文件)汹粤。
命令會(huì)強(qiáng)制執(zhí)行腳本中的全部命令命斧,而忽略文件的權(quán)限。bash FileName
嘱兼、zsh FileName
作用:重新建立一個(gè)子shell
(進(jìn)程)国葬,在子shell
中執(zhí)行腳本里面的句子。當(dāng)前環(huán)境沒有變化芹壕。./FileName
作用:讀取并執(zhí)行文件中的命令汇四。但有一個(gè)前提,腳本文件需要有可執(zhí)行權(quán)限哪雕。
MAC中shell種類
cd /private/etc
cat shells
-
bash
:macOS
默認(rèn)shell
(老系統(tǒng))船殉,新系統(tǒng)切換為zsh
了。 -
csh
:被tcsh
替換了 -
dash
:比bash
小很多斯嚎,效率高利虫。 -
ksh
:兼容bash
-
sh
:已經(jīng)被bash
替換了 -
tcsh
:整合了csh
提供了更多功能 -
zsh
:替換了bash
四、用戶組&文本權(quán)限
Unix
和Linux
都是多用戶堡僻、多任務(wù)的系統(tǒng)糠惫,所以這樣的系統(tǒng)里面就擁有了用戶、組的概念钉疫。那么同樣文件的權(quán)限也就有相應(yīng)的所屬用戶和所屬組硼讽。
與windows
不同的是unix
、linux
牲阁、macOS
都是多用戶的系統(tǒng):
4.1mac文件屬性
4.2權(quán)限
權(quán)限有10
位:
drwx-r-xr-x
- 第
1
位文件類型d/-
:
d
目錄(directory)
-
文件 - 后面
9
位,文件權(quán)限:
[r]
:read
固阁,讀
[w]
:write
,寫
[x]
:execute
城菊,執(zhí)行
??這三個(gè)權(quán)限的位置不會(huì)變备燃,依次是rwx
。出現(xiàn)-
對(duì)應(yīng)的位置代表沒有此權(quán)限凌唬。- 一個(gè)文件的完整權(quán)限分為三組:
第一組:文件所有者權(quán)限
第二組:這一組其它用戶權(quán)限
第三組:非本組用戶的權(quán)限
- 一個(gè)文件的完整權(quán)限分為三組:
4.3權(quán)限改變chmod
文件權(quán)限的改變使用chmod
命令并齐。
設(shè)置方法有兩種:數(shù)字類型改變 和 符號(hào)類型改變。
文件權(quán)限分為三種身份:[user][group][other]
三個(gè)權(quán)限:[read] [write] [execute]
4.3.1數(shù)字類型
各個(gè)權(quán)限數(shù)字對(duì)照:r:4(0100)
w:2(0010)
x:1(0001)
客税,這么設(shè)計(jì)的好處是可以按位或况褪。與我們開發(fā)中位移枚舉同理。
如果一個(gè)文件權(quán)限為[!–rwxr-xr-x]
更耻,則對(duì)應(yīng):
User : 4+2+1 = 7
Group: 4+0+1 = 5
Other: 4+0+1 = 5
命令為:chmod 755 文件名
數(shù)字與權(quán)限對(duì)應(yīng)表:
0
代表沒有任何權(quán)限测垛。
4.3.2符號(hào)類型
chmod [u(User)、g(Group)秧均、o(Other)赐纱、a(All)]
[+
(加入)脊奋、-
(除去)、=
(設(shè)置)] [r疙描、w、x]
文件名稱
例:
chmod a+x test.txt
默認(rèn)是all
讶隐。
五起胰、通過shell腳本自動(dòng)重簽名
腳本實(shí)現(xiàn)邏輯和codesign
邏輯相同。
完整腳本如下:
#臨時(shí)解壓目錄
TEMP_PATH="${SRCROOT}/Temp"
#資源文件夾巫延,我們提前在工程目錄下新建一個(gè)APP文件夾效五,里面放ipa包(砸殼后的)
ASSETS_PATH="${SRCROOT}/APP"
#目標(biāo)ipa包路徑
TARGET_IPA_PATH="${ASSETS_PATH}/*.ipa"
#清空&創(chuàng)建Temp文件夾
rm -rf TEMP_PATH
mkdir -p TEMP_PATH
# 1. 解壓IPA到Temp目錄下
unzip -oqq "$TARGET_IPA_PATH" -d "$TEMP_PATH"
# 拿到解壓后的臨時(shí)的APP的路徑
TEMP_APP_PATH=$(set -- "$TEMP_PATH/Payload/"*.app;echo "$1")
#2. 將解壓出來的.app拷貝進(jìn)入工程下
#2.1拿到當(dāng)前工程目標(biāo)Target路徑
# BUILT_PRODUCTS_DIR 工程生成的APP包的路徑
# TARGET_NAME target名稱
TARGET_APP_PATH="$BUILT_PRODUCTS_DIR/$TARGET_NAME.app"
echo "app path:$TARGET_APP_PATH"
#2.2刪除工程本身的Target,將解壓的Target拷貝到工程本身的路徑
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)文件路徑"畏妖,PlistBuddy是蘋果自帶的。
/usr/libexec/PlistBuddy -c "Set :CFBundleIdentifier $PRODUCT_BUNDLE_IDENTIFIER" "$TARGET_APP_PATH/Info.plist"
#刪除UISupportedDevices設(shè)備相關(guān)配置(越獄手機(jī)dump ipa包需要?jiǎng)h除相關(guān)配置)
/usr/libexec/PlistBuddy -c "Delete :UISupportedDevices" "$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
#簽名 --force --sign 就是-fs
/usr/bin/codesign --force --sign "$EXPANDED_CODE_SIGN_IDENTITY" "$FRAMEWORK"
done
fi
使用方式
1.創(chuàng)建空工程疼阔,編譯運(yùn)行空工程至真機(jī)上(信任證書)戒劫。
2.將appResign.sh
腳本拷貝到工程根目錄(要有可執(zhí)行權(quán)限)。
3.在工程根目錄創(chuàng)建APP
文件夾婆廊,并將微信.ipa
拷貝到APP
文件夾迅细。
4.配置腳本
5.運(yùn)行工程
這個(gè)時(shí)候就可以調(diào)試微信了
六、如何調(diào)試一個(gè)任意app?
6.1獲取對(duì)應(yīng)ipa
包
使用越獄手機(jī)dump ipa
包
下載舊版本
ipa
包可以通過抓取iTunes
的下載鏈接改版本號(hào)(后綴是app
的版本淘邻,直接改版本)
iTunes
6.2砸殼
砸殼后由于是dump
越獄手機(jī)上的正版包茵典,所以需要將info.plist
中支持的設(shè)備信息(UISupportedDevices
)刪除。(當(dāng)然可以寫在腳本中)
#刪除UISupportedDevices設(shè)備相關(guān)配置(越獄手機(jī)dump ipa包需要?jiǎng)h除相關(guān)配置)
/usr/libexec/PlistBuddy -c "Delete :UISupportedDevices" "$TARGET_APP_PATH/Info.plist"
刪除完畢保存重新打包ipa
:
zip -ry WeChat1.ipa Payload/
總結(jié)
- 重簽名
-
codesign
重簽名- 刪除不能簽名的文件:
Extension
和watch
(包含了Extension
) - 重簽名
Frameworks
(里面的庫) - 給
MachO
添加可執(zhí)行權(quán)限 - 修改
Info.plist
文件(BundleID
) - 拷貝描述文件(該描述文件要在
iOS
真機(jī)中信任過) - 利用描述文件中的權(quán)限文件簽名整個(gè)
App
包
- 刪除不能簽名的文件:
-
Xcode
重簽名- 刪除不能簽名的文件:
Extension
和watch
(包含了Extension
) - 重簽名
Frameworks
(里面的庫) - 給
MachO
添加可執(zhí)行權(quán)限 - 修改
Info.plist
文件(BundleID
) - 將
App
包拷貝進(jìn)入Xcode
工程目錄中(剩下的交給Xcode
)
- 刪除不能簽名的文件:
-
-
shell
- 切換
shell
$chsh -s shell路徑
- 現(xiàn)在
macOS
中shell
默認(rèn)zsh
(早期bash
) - 配置文件
zsh
:.zshrc
bash
:.bash_profile
- 文件權(quán)限&用戶組
- 每個(gè)文件都有所屬的用戶宾舅、組统阿、其它
- 文件權(quán)限
- 歸屬:用戶、組筹我、其它
- 權(quán)限 :寫扶平、讀、執(zhí)行
- 修改權(quán)限
chmod
- 數(shù)字:
r:4
w:2
x:1
-
chmod 751 文件名
-
user
:4+2+1 = 7
-
group
:4+0+1 = 5
-
other
:0+0+1 = 1
-
-
- 字符
- 歸屬:
u
(用戶)g
(組)o
(其它)a
(所有) -
+
(添加)-
(去掉)=
(設(shè)置) - 默認(rèn)
a
:chmod + x
- 歸屬:
- 數(shù)字:
- 切換