了解了iOS應用簽名之后尺锚,發(fā)現(xiàn)蘋果就是通過簽名來驗證我們的證書能否能簽名我們的App
纱注,那我們能不能用我們的證書對別人的App
進行簽名呢腮猖?理論上只要我們有了這個證書就能對這個App
進行簽名,那么我們就可以用我們的證書對其他App
進行簽名身害。
1味悄、App的簽名是由誰簽的?
平常我們使用Xcode
開發(fā)塌鸯,我們基本上沒有關注過這些侍瑟,其實App
的簽名是由我們Mac系統(tǒng)
里面的CodeSign
工具完成的,只不過Xcode
幫我們干了這些事情而已丙猬。
2涨颜、準備工作
首先我們需要一個砸過殼的App
,砸過殼的App
就是越獄應用茧球,可以前往PP助手
下載庭瑰。
使用otool -l WeChat | grep cry
可以查看是否砸過殼
localhost : ~/Documents/SecurityProducts/003-CodeSign應用重簽名/ipa/微信-7.0.5(越獄應用)/Payload/WeChat.app : otool -l WeChat | grep cry
cryptoff 16384
cryptsize 100237312
cryptid 0
注意:cryptid
0代表未加密(也就是說砸過殼的)
1代表加密的
3、如何使用CodeSign
進行重簽名抢埋?
注意此方式安裝的微信登錄后會被封號
下方有詳細流程截圖弹灭。
步驟如下:
- 需要一個砸過殼的
WeChat.ipa
- 解壓
WeChat.ipa
- 找到
WeChat.app
拷貝到一個新建文件夾WeChatCodeSign
下- 右鍵
顯示包內容
刪除無法簽名的插件(PlugIns
和Watch
)- 終端輸入
security find-identity -v -p codesigning
尋找證書,拷貝需要使用的證書名稱
- 進入
WeChat.app/FrameWork
文件夾羹令,然后對文件夾下面的所有Framework
簽名 鲤屡,終端進入當前目錄,輸入簽名代碼codesign -fs "證書名稱" xxx.framework
- 新建一個
Xcode
項目WeChatDemo
福侈,并且運行到手機上一次- 在
WeChatDemo
中找到WeChatDemo.app
- 右鍵顯示包內容酒来,拷貝描述文件
embedded.mobileprovision
到WeChatCodeSign
下,并且拷貝到WeChat.app
中一份肪凛。- 在
WeChatDemo
中堰汉,新建一個plist
文件ent.plist
(命名隨意)- 終端輸入
security cms -Di embedded.mobileprovision
打開embedded.mobileprovision
- 拷貝
embedded.mobileprovision
下key
為Entitlements
的Value
(簽名信息)到ent.plist
- 拷貝
ent.plist
到WeChatCodeSign
下- 進入
WeChat.app
下找到info.plist
更改成WeChatDemo
的bundle id
- 最后進入
WeChatCodeSign
目錄下,對App
包進行簽名伟墙,終端輸入codesign -fs "證書名稱" --no-strict --entitlements=ent.plist WeChat.app
Command + Shift + 2
安裝
詳細流程截圖
下載好的越獄的 WeChat.ipa
包
我們下載好了這樣一個 WeChat.ipa
包后翘鸭,解壓 ipa
包然后找到 WeChat.app
拷貝到一個新建文件夾WeChatCodeSign
下
對WeChat.app
右鍵顯示包內容
刪除無法簽名的插件(PlugIns
和 Watch
)
終端輸入 security find-identity -v -p codesigning
尋找證書,拷貝需要使用的證書名稱
("Apple Development: ZZZZZZ (ABENW7IAHK)"
),
注意:這里有一個坑戳葵,如果你有多個同名證書就乓,但是證書前面的編號不同,記得刪除無用的證書拱烁,不然簽名時候會報:簽名時使用了模棱兩可的證書生蚁。
終端輸入codesign -fs "證書名稱" xxx.framework
,依次對WeChat.app/FrameWork
下的xxx.frameWork
簽名
新建工程WeChatDemo
,真機編輯或運行一次戏自,找到WeChatDemo.app
拷貝embedded.mobileprovision
到WeChatCodeSign
下邦投,并且拷貝到WeChat.app中一份。
在WeChatDemo
中擅笔,新建一個plist
文件ent.plist
(命名隨意)
終端輸入security cms -Di embedded.mobileprovision
打開 embedded.mobileprovision
并拷貝embedded.mobileprovision
下 key
為Entitlements
的Value
(簽名信息)到ent.plist
拷貝ent.plist
到WeChatCodeSign
下志衣,然后進入WeChat.app
下找到info.plist
更改成WeChatDemo
的bundle id
屯援,最后進入WeChatCodeSign
目錄下,終端輸入 codesign -fs "證書名稱" --no-strict --entitlements=ent.plist WeChat.app
對App
包進行簽名
Command + Shift + 2
安裝WeChat
4念脯、使用Xcode
進行重簽名
使用Xcode
重簽名的方式其實和我們手動簽名基本差不多狞洋,只是Xcode
幫我們完成了將描述文件拷貝到.app
包里,然后生成ent.plist
和最后對App
包的簽名而已和二,下方的工作還是需要做的徘铝。
- 上述同樣的準備工作
- 刪除該刪除的文件
- 簽名FrameWork包
- 然后將
WeChat.app
覆蓋我們新建工程的.app
包 - 運行就可以了
注意:
這有一個坑:使用Xcode
重簽名的時候耳胎,新建的功能一定要和WeChat
同名惯吕,不然Xcode
讀取WeChat
的MacOView
文件時會因為找不到而不執(zhí)行替換的包。
5怕午、使用Shell
進行重簽名
使用Shell
(關于Shell)重簽名也就是把上面繁瑣的步驟寫成一個腳本讓Xcode
去執(zhí)行一步到位废登。
重簽名腳本如下:
# ${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文件上執(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
#簽名
/usr/bin/codesign --force --sign "$EXPANDED_CODE_SIGN_IDENTITY" "$FRAMEWORK"
done
fi
拷貝上述內容堡距,打開終端輸入touch appShell.sh
新建一個Shell
文件,再輸入vim appShell.sh
打開文件,按i
后再粘貼內容兆蕉,最后按Esc
輸入:wq
保存并退出羽戒。
然后將我們的appShell.sh
拷貝到我們剛才的WeChatDemo
下,在WeChatDemo
下新建App
文件夾將WeChat.ipa
放入虎韵。
在WeChatDemo
下添加New Run Script Phase
我們運行一下真機易稠,咦,報錯了包蓝,告訴我們運行appShell.sh
權限不足
那我們使用終端ls -l
看看權限
tancheng@localhost ~/Documents/SecurityProducts/003-CodeSign應用重簽名/代碼/WeChatDemo : ls -l
total 8
drwxr-xr-x 3 tancheng staff 96 10 17 11:07 APP
drwxr-xr-x 13 tancheng staff 416 10 19 10:21 WeChatDemo
drwxr-xr-x 5 tancheng staff 160 10 19 10:50 WeChatDemo.xcodeproj
drwxr-xr-x 4 tancheng staff 128 10 19 10:02 WeChatDemoTests
drwxr-xr-x 4 tancheng staff 128 10 19 10:02 WeChatDemoUITests
-rw-r--r-- 1 tancheng staff 1979 10 19 10:40 appShell.sh
看明白了權限說明驶社,搞清楚了改變權限的方法,我們終端試一下测萎,
這樣我們看到了權限已經更改了亡电,我們再試試運行一下剛才的代碼發(fā)現(xiàn)我們就成功的運行了WeChat
。
以上就是iOS應用重簽名的所有內容了硅瞧。