方式1:Codesign重簽名
在iOS中挑胸,Xcode為我們提供了簽名工具谍椅,即codesign
辰狡,通過一些命令即可完成重簽名迹蛤,如下所示
$
security find-identity -v -p codesigning
: 列出鑰匙串里可簽名的證書$
Codesign –fs
“證書串” 文件名 :強制替換簽名$
Chmod +x
可執(zhí)行文件 : 給文件添加權限$
security cms -D -i ../embedded.mobileprovision
:查看描述文件$
codesign -fs
“證書串” --no-strict --entitlements=權限文件.plist APP包$
Zip –ry
輸出文件 輸入文件 將輸入文件壓縮為輸出文件
如何獲取越獄手機的ipa包
1谬晕、建立鏈接:
sh usbConnect.sh
2爹脾、連接手機:
sh usbX.sh
3岩遗、查看進程:
ps -A
4吩坝、篩選進程驾诈,找到微信進程:
ps -A | grep WeChat
5缠诅、拷貝:
scp -r -P 12345 root@localhost:路徑 ./
6、查看拷貝的app包:
cd WeChat.app
7乍迄、查看可執(zhí)行文件:
otool -l WeChat | grep crypt
(此時的cryptid 是 1管引,表示加密過的)8、查看app的權限:
codesign -vv -d WeChat.app
(有簽名權限)
準備工作
-
1褥伴、準備一個微信的越獄包,這里準備的是通過
MyZip
解壓微信-7.0.8.ipa
-
其中的
WeChat.app
包含兩個東西:app + app簽名信息
-
-
2漾狼、查看app包的簽名信息(CMD+G):
codesign -vv -d WeChat.app
3重慢、查看鑰匙串的證書:
security find-identity -v -p codesigning
4、查看可執(zhí)行文件詳細信息:
otool -l WeChat > ~/Desktop/123.txt
邦投。其中有cryptid
加密id(0表示沒有使用加密算法)
codesign重簽名步驟
給應用重簽名的步驟如下:
1伤锚、刪除插件和帶有插件的.app包(例如Watch、plugins)
2志衣、對
Frameworks
里面的庫進行重簽名
3屯援、給可執(zhí)行文件
+x(可執(zhí)行)權限
4、新建一個空工程
5念脯、添加描述文件(4中的空工程通過真機編譯得到狞洋,且要運行,因為需要將描述文件安裝到手機)
6绿店、替換.app包中
BundleID
(.app包中info.plist文件的BundleID要和描述文件中的BundleID保持一致)-
7吉懊、通過授權文件(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
8、最后通過Xcode安裝
注:mach-o最重要的兩塊:
代碼塊 + 數據塊
转培,其中加密主要是加密代碼
codesign重簽名演示
-
前提:
需要簽名:wechat可執(zhí)行文件(即
Mach-O文件
) +Frameworks
需要刪除:
Plugins
(免費普通賬戶無法簽名恶导,可以刪除) +Watch
(也無法簽名,刪除)
-
1浸须、查看Frameworks惨寿,也是有簽名信息的:
codesign -vv -d andromeda.framework
2邦泄、重簽名Frameworks:
codesign -fs "Apple Development: 916770982@qq.com (565XXC9ZYA)" andromeda.framework
? Frameworks codesign -fs "Apple Development: 916770982@qq.com (565XXC9ZYA)" andromeda.framework
andromeda.framework: replacing existing signature
? Frameworks codesign -fs "Apple Development: 916770982@qq.com (565XXC9ZYA)" mars.framework
mars.framework: replacing existing signature
? Frameworks codesign -fs "Apple Development: 916770982@qq.com (565XXC9ZYA)" marsbridgenetwork.framework
marsbridgenetwork.framework: replacing existing signature
? Frameworks codesign -fs "Apple Development: 916770982@qq.com (565XXC9ZYA)" matrixreport.framework
matrixreport.framework: replacing existing signature
? Frameworks codesign -fs "Apple Development: 916770982@qq.com (565XXC9ZYA)" OpenSSL.framework
OpenSSL.framework: replacing existing signature
? Frameworks codesign -fs "Apple Development: 916770982@qq.com (565XXC9ZYA)" ProtobufLite.framework
ProtobufLite.framework: replacing existing signature
然后執(zhí)行退出 cd ..
- 3、查看可執(zhí)行文件:
ls -l WeChat
ls -l WeChat
-rwxr-xr-x@ 1 xxx staff 126048560 10 16 2019 WeChat
注:重簽名必須要有可執(zhí)行權限裂垦,即
- x
4顺囊、新建一個工程,運行 蕉拢,進入得到的包中特碳,獲取
Apple Development: 916770982@qq.com (565XXC9ZYA)
對應的描述文件 ,例如xxx xxx(Personal Team)
獲取可執(zhí)行文件中的描述文件企量,拷貝至WeChat包
5测萎、描述文件和BundleID有關系亡电,需要修改WeChat的BundleID
com.tencent.xin
為xxx.com.test
-
6届巩、查看描述文件的權限:
security cms -D -i embedded.mobileprovision
查看
Entitlements
(權限),是一個plist文件將其拷貝至一個plist文件(名稱為
entitlements
,需要新建)(路徑:propertyList - open sourceCode - 拷貝 <dict></dict>)將其拷貝至payload文件夾中
7份乒、簽名app(即mach-o簽名):
codesign -fs "Apple Development: xxxxxxxxx@qq.com (565XXC9ZYA)" --no-strict --entitlements=Entitlements.plist WeChat.app
8恕汇、查看WeChat簽名:
codesign -vv -d WeChat.app
, 此時簽名信息已經替換
? Payload codesign -vv -d WeChat.app
Executable=/Users/jiangshicheng/Desktop/邏輯進階IOS/逆向/010--應用重簽名原理/資料/微信-7.0.8/Payload/WeChat.app/WeChat
Identifier=com.jsc.weChatDemo
Format=app bundle with Mach-O thin (arm64)
CodeDirectory v=20400 size=972598 flags=0x0(none) hashes=30383+7 location=embedded
Signature size=4819
Authority=Apple Development: 916770982@qq.com (565XXC9ZYA)
Authority=Apple Worldwide Developer Relations Certification Authority
Authority=Apple Root CA
Signed Time=Jun 2, 2021 at 2:36:45 PM
Info.plist entries=68
TeamIdentifier=99EJLR3Y3N
Sealed Resources version=2 rules=10 files=1470
Internal requirements count=1 size=184
-
9或辖、安裝
10瘾英、調試:Debug - Attach to process - WeChat
Codesign重簽名缺點:過程太繁瑣
方式2:Xcode重簽名
下面我們通過Xcode來進行重簽名,步驟如下:
1颂暇、刪除Plugins缺谴、Watch
2、重簽名Frameworks
3耳鸯、創(chuàng)建并運行一個空工程
4湿蛔、修改
Info.plist
中的BundleID改為空工程的BundleID
5、利用修改后的app包县爬,替換空工程的app包
6阳啥、直接運行
與CodeSign重簽名相比:少了其中的3(執(zhí)行文件權限)、5(添加描述文件)财喳、7(通過授權文件重簽.app包)
xcode重簽名演示
-
1察迟、將product中的WeChat替換成 需要我們之前重簽名的WeChat
2、CMD+R再次運行
方式3:Shell腳本
shell重簽名演示
準備工作
首先跑一遍空項目獲得簽名信息
- 項目中配置shell:
Build Phase -> + Run Script
耳高,會在編譯時執(zhí)行
-
./
表示工程目錄 -
SRCROOT
(環(huán)境變量)-- 根目錄
-
shell重簽名演示
1扎瓶、根目錄下創(chuàng)建shell文件:
touch 123.sh
2、添加執(zhí)行權限:
chmod +x 123.sh
3泌枪、Run Script 中直接執(zhí)行 123.sh :
./123.sh
其中123.sh中的重簽名腳本如下所示概荷,主要有以下幾步:
1、解壓
IPA
到Temp
下2工闺、將解壓出來的.app拷貝進入工程下
3乍赫、
刪除extension
和WatchAPP
瓣蛀,因為個人證書沒法簽名Extention4、
更新
info.plist文件CFBundleIdentifier
5雷厂、給
Mach-O
文件上執(zhí)行權限
6惋增、重簽名第三方
FrameWorks
7、替換簽名
# ${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" "目標文件路徑"
# PlistBuddy工具修改info.plist文件中的BundleID為工程的BundleID
/usr/libexec/PlistBuddy -c "Set :CFBundleIdentifier $PRODUCT_BUNDLE_IDENTIFIER" "$TARGET_APP_PATH/Info.plist"
#----------------------------------------
# 5\. 給MachO文件上執(zhí)行權限
# 拿到MachO文件的路徑
APP_BINARY=`plutil -convert xml1 -o - $TARGET_APP_PATH/Info.plist|grep -A1 Exec|tail -n1|cut -f2 -d\>|cut -f1 -d\<`
#上可執(zhí)行權限
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 替換簽名
# EXPANDED_CODE_SIGN_IDENTITY 當前工程的證書
/usr/bin/codesign --force --sign "$EXPANDED_CODE_SIGN_IDENTITY" "$FRAMEWORK"
done
fi