前言
本篇文章繼續(xù)逆向準(zhǔn)備
的另一個(gè)基礎(chǔ)知識(shí)點(diǎn) ?? 應(yīng)用重簽名枷邪。首先介紹相關(guān)的概念,然后利用工具
和腳本自動(dòng)化
2種方式诺凡,結(jié)合示例執(zhí)行一次
重簽名的過程东揣。
一、重簽名
上篇文章09-應(yīng)用簽名詳細(xì)介紹了簽名的整個(gè)過程腹泌,簡(jiǎn)而言之嘶卧,簽名(signature)
是蘋果公司的一種安全機(jī)制
,APP
只有簽名有效
才被iOS系統(tǒng)
允許執(zhí)行凉袱。
1.1 重簽名的概念
重簽名芥吟,就是在APP原來的基礎(chǔ)上,用現(xiàn)有的簽名
替換原來的簽名
专甩。
1.2 為什么要重簽名
- 在
沒有源代碼
的情況下钟鸵,你已經(jīng)對(duì)某個(gè)應(yīng)用進(jìn)行了資源修改
(比如修改了啟動(dòng)圖
或圖標(biāo)
等)。修改完成以后涤躲,如果想要讓APP
可以正常使用
棺耍,該APP
一定要重新簽名
然后壓縮成IPA文件。 - 如果你想讓你的
APP
不經(jīng)過蘋果審核种樱,就可以私自發(fā)布
到HTTPS服務(wù)器
上烈掠,不越獄也能安裝
,且沒有設(shè)備臺(tái)數(shù)限制缸托,那么你就要把個(gè)人開發(fā)者簽名
,替換成企業(yè)開發(fā)者In-House證書簽名
瘾蛋,之后OTA發(fā)布
就行了俐镐。 -
一個(gè)開發(fā)者
的應(yīng)用,需要在另一個(gè)開發(fā)者
帳號(hào)下發(fā)布到App Store
哺哼。上傳的ipa包佩抹,是重簽名
后的包。 -
過期或者失效
簽名的應(yīng)用取董,正常使用需要重新簽名
棍苹。
二、重簽名工具-CodeSign
codesign
安裝Xcode
就有茵汰,Xcode
也是用的這個(gè)工具完成的簽名
的流程枢里。簽名改動(dòng)的文件
包含??
- 資源文件
- macho文件
- framework
- ...其它
2.1 終端命令
在利用codesign
工具重簽名之前,我們先來了解下關(guān)于簽名
的一些終端指令??
1. 查看簽名信息
codesign -vv -d xxx.app
2. 列出鑰匙串里可簽名的證書
security find-identity -v -p codesigning
3. otool分析macho文件信息并導(dǎo)出到指定文件
otool -l xxx > ~/Desktop/machoMessage.txt
其中cryptid
為0
表示沒有
用到加密
算法(也就是脫殼
的), 其它
則表示加密
栏豺。
也可以直接過濾查看是否砸殼??
otool -l xxx | grep cryptid
4. 強(qiáng)制替換簽名
codesign –fs “證書串” 文件名
codesign -fs "Apple Development: xxx@qq.com (9AN9M5S786)" andromeda.framework
5. 給文件添加權(quán)限
chmod +x 可執(zhí)行文件
6. 查看描述文件
security cms -D -i ../embedded.mobileprovision
7. macho簽名
codesign -fs “證書串” --no-strict --entitlements=權(quán)限文件.plist APP包
8. 將輸入文件壓縮為輸出文件
zip –ry 輸出文件 輸入文件
2.2 codesign命令重簽名
這里以砸過殼
的微信(7.0.8)
為例彬碱,使用免費(fèi)開發(fā)者賬號(hào)重簽名微信,然后安裝到非越獄手機(jī)上奥洼。(文章末尾會(huì)附上微信(7.0.8)ipa包
)
- 解壓縮
.ipa
包巷疼,Payload
中找到.app
,右鍵顯示包內(nèi)容
灵奖。
需將后綴
.ipa
改為.zip
嚼沿,才能解壓縮??
??由于免費(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
- 獲取免費(fèi)賬號(hào)對(duì)應(yīng)的描述文件
創(chuàng)建空工程
使用免費(fèi)賬號(hào)
&真機(jī)編譯
獲運(yùn)行取描述文件
瓷患。
在【設(shè)置】-【通用】-【描述文件】信任該描述文件骡尽。
接著將獲取到的描述文件
拷貝到 WeChat
app包中。
- 修改
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>J7C267M8SE.com.xl.-XFAlgorithmPrj.testWeChat</string>
<key>keychain-access-groups</key>
<array>
<string>J7C267M8SE.*</string>
</array>
<key>get-task-allow</key>
<true/>
<key>com.apple.developer.team-identifier</key>
<string>J7C267M8SE</string>
</dict>
接著創(chuàng)建一個(gè)Entitlements.plist
文件尉尾,將權(quán)限內(nèi)容粘貼
進(jìn)去??
將權(quán)限文件(Entitlements.plist)
拷貝到和Payload
中WeChat.app同一目錄
??
- 簽名
Wechat
codesign -fs "Apple Development: xxx@qq.com (9AN9M5S786)" --no-strict --entitlements=entitlements.plist WeChat.app
再查看WeChat.app
的簽名信息爆阶,就已經(jīng)替換了??
這個(gè)時(shí)候通過Xcode
將WeChat.app
包安裝到手機(jī),應(yīng)該能正常安裝了??
然后通過debug->attach to process->WeChat
就可以調(diào)試微信
了??
??注意:這個(gè)時(shí)候不要用自己的
常用賬號(hào)
登錄重簽名的微信(有可能被封號(hào)
)沙咏。
小結(jié)
以上重簽名
的步驟??
- 刪除插件以及帶有插件的.app包
-
PlugIns
和Watch
文件夾
-
- 對(duì)
Frameworks
文件夾中的庫(kù)重簽名codesign -fs "Apple Development: xxx@mail.com (xxxxxxxxxx)" andromeda.framework
- 對(duì)可執(zhí)行文件+X(可執(zhí)行)權(quán)限
chmod +x WeChat
- 添加
描述文件
- 創(chuàng)建
空殼
工程辨图,真機(jī)運(yùn)行,將描述文件安裝到手機(jī) - 系統(tǒng)設(shè)置中
信任
該描述文件
- 創(chuàng)建
- 替換
WeChat.app
包中的info.plist
的 BundleId(BundleId要和描述文件中的一致) - 通過授權(quán)文件(entitlments)重簽名.app包
-
security cms -D -i embedded.mobileprovision
獲取描述文件的權(quán)限 - 新建
Entitlements.plist
文件肢藐,將權(quán)限dict部分
粘貼進(jìn)來 - 用權(quán)限文件簽名App包:
codesign -fs "Apple Development: xxx@mail.com (xxxxxxxxxx)" --no-strict --entitlements=entitlements.plist WeChat.app
-
- XCode安裝
WeChat.app
包故河,debug->attach to process->WeChat
調(diào)試微信。
大功告成吆豹!????????????????????????????
三鱼的、利用Xcode重簽名調(diào)試三方應(yīng)用
以上是通過attach to process
的方式調(diào)試微信的,那能不能像我們平時(shí)開發(fā)一樣痘煤,直接debug聯(lián)調(diào)
呢凑阶?當(dāng)然能!請(qǐng)看下面步驟??
- 新建和微信同名工程
WeChat
-
真機(jī)運(yùn)行
該空工程 - 解壓微信的
.ipa
包衷快,并且刪除Watch
和PlugIns
文件夾 - 重簽名
Frameworks
- 修改
BundleId
- 將修改后的
WeChat.app
替換空工程的Products
中WeChat.app
- 運(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è)腳本文件。
最常用的相關(guān)指令??
4.1 腳本切換
chsh -s /bin/zsh
4.2 執(zhí)行腳本的幾種方式
首先新建一個(gè)shell腳本文件shell.sh
诈闺,里面輸入終端指令??
可以先建一個(gè)
.txt
文檔渴庆,再把后綴名改為.sh
mkdir shell1
cd shell1
touch test.txt
上圖中可知??
-
bash FileName
、zsh FileName
- 作用:重新建立一個(gè)
子shell(進(jìn)程)
雅镊,在子shell中執(zhí)行腳本里面的句子襟雷。當(dāng)前環(huán)境沒有變化
。
- 作用:重新建立一個(gè)
-
source FileName
- 作用:在
當(dāng)前shell環(huán)境
中讀取并執(zhí)行FileName中的命令 - 特點(diǎn):命令可以強(qiáng)行讓一個(gè)腳本去立即影響當(dāng)前的環(huán)境(一般用于加載配置文件)仁烹。
命令會(huì)強(qiáng)制執(zhí)行
腳本中的全部命令耸弄,而忽略文件的權(quán)限
。
- 作用:在
-
./FileName
- 作用:讀取并執(zhí)行文件中的命令卓缰。但有一個(gè)前提计呈,
腳本文件
需要有可執(zhí)行權(quán)限
。
- 作用:讀取并執(zhí)行文件中的命令卓缰。但有一個(gè)前提计呈,
4.3 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)限
剛才我們利用chmod +x
修改了shell.sh
的權(quán)限,那么我們來看看權(quán)限具體是個(gè)什么概念摄闸。
Unix
和Linux
都是多用戶善镰、多任務(wù)
的系統(tǒng),所以這樣的系統(tǒng)里面就擁有了用戶
年枕、組
的概念炫欺。那么同樣文件的權(quán)限
也就有相應(yīng)的所屬用戶
和所屬組
。
與windows
不同的是熏兄,unix
竣稽、linux
、macOS
都是多用戶
的系統(tǒng)??
5.1 Mac文件屬性
Mac系統(tǒng)中可以通過ls -l
指令查看當(dāng)前文件目錄下
的所有文件
的屬性
霍弹,例如??
最左側(cè)紅框就是【權(quán)限】
,往右依次是【鏈接】【所有者】【所屬組】【文件大小】【最后修改日期】【文件名稱】
5.2 權(quán)限
權(quán)限有10位??
上圖中??
-
第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)限
5.3 chmod
-
文件權(quán)限的改變
使用chmod
命令。 - 設(shè)置方法有兩種 ??
數(shù)字類型
改變 和符號(hào)類型
改變防嗡。 - 文件權(quán)限分??
- 三種
身份
??[user][group][other]
- 三個(gè)
權(quán)限
??[read] [write] [execute]
- 三種
5.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)限
。
5.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
使用方式
- 創(chuàng)建
空工程
(例如shellTestWeChat
)蓉媳,編譯運(yùn)行空工程至真機(jī)
上(信任
證書)。 - 將
appResign.sh
腳本拷貝到工程根目錄
(要有可執(zhí)行
權(quán)限)锅铅。 - 在
工程根目錄
創(chuàng)建APP文件夾
蓬衡,并將微信.ipa
拷貝到APP文件夾
。 - 配置腳本
- 運(yùn)行工程
補(bǔ)充: 如何調(diào)試一個(gè)任意app?
1. 獲取對(duì)應(yīng)ipa包
使用越獄
手機(jī)dump
ipa包
??
下載舊版本
ipa
包可以通過抓取iTunes
的下載鏈接改版本號(hào)(后綴是app
的版本萝招,直接改版本)
iTunes
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é)
應(yīng)用重簽名
可以說是逆向
的第一步
準(zhǔn)備工作贼邓,希望大家能夠跟著本篇文章的順序阶冈,實(shí)際操作一遍,都說實(shí)踐是檢驗(yàn)真理的唯一標(biāo)準(zhǔn)
塑径,這點(diǎn)很重要女坑!
- 重簽名
- codesign重簽名
-
刪除
不能簽名的文件:PlugIns
和Watch
(包含了Extension) - 重簽名Frameworks里面的庫(kù)
- 給MachO添加
可執(zhí)行權(quán)限
- 修改
Info.plist
文件(BundleID
) - 拷貝
描述文件
(該描述文件要在iOS真機(jī)中信任過) - 利用描述文件中的權(quán)限文件
簽名整個(gè)App包
-
- Xcode重簽名
-
刪除
不能簽名的文件:PlugIns
和Watch
(包含了Extension) - 重簽名Frameworks里面的庫(kù)
- 給MachO添加
可執(zhí)行權(quán)限
- 修改
Info.plist
文件(BundleID
) - 拷貝
描述文件
(該描述文件要在iOS真機(jī)中信任過) - 將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
-
- chmod
- 字符
- 歸屬 ??
u
(用戶)g
(組)o
(其它)a
(所有) -
+
(添加)-
(去掉)=
(設(shè)置) - 默認(rèn)
a
??chmod + x
- 歸屬 ??
- 數(shù)字:
- 每個(gè)文件都有所屬的
- 切換shell
- codesign重簽名