iOS-逆向10-應用重簽名

《iOS底層原理文章匯總》

1.codesign

Xocde提供了簽名工具,codesign,我們通過幾個命令就可以完成重簽名

I.終端命令

  • $security find-identity -v -p codesigning 列出鑰匙串里可簽名的證書

  • $Codesign –fs “證書串” 文件名 強制替換簽名

  • $Chmod +x 可執行文件 給文件添加權限

  • $security cms -D -i ../embedded.mobileprovision 查看描述文件

  • $codesign -fs “證書串” --no-strict --entitlements=權限文件.plist APP包

  • $Zip –ry 輸出文件 輸入文件 將輸入文件壓縮為輸出文件

II.重簽名步驟

1.刪除插件和帶有插件的.app包(比如Watch)

2.對Frameworks里面的庫進行重簽名

3.給可執行文件 +x(可執行)權限

4.添加描述文件(新建工程,真機編譯得到,而且要運行,將描述文件安裝到手機)

5.替換BundleID(info.plist 文件。 BundleID要和描述文件中的ID保持一致)

6.通過授權文件(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

7.最后通過Xcode安裝

III.重簽名微信7.0.8版本

簽名??? 原始數據--->HASH--->加密
重簽名???原始數據--->HASH--->加密
重簽名并沒有改原始數據

  • 1.解壓微信.ipa包能看到Payload文件夾下有一個WeChat應用程序
圖片.png
  • 2.codesign -vv -d WeChat.app,此時發現WeChat具有簽名信息
圖片.png
  • 3.查看Mac上自己的證書,security find-identity -v -p codesigning


    image
  • 4.通過otool -l WeChat查看MachO文件的詳細信息,太多一個屏幕占用不下,可以輸出到txt文檔中otool -l WeChat > ~/Desktop/123.txt,cryptid為0表示此MachO文件未加密


    圖片.png
圖片.png
  • 5.用普通賬號對WeChat進行重簽名,并安裝到手機上,若直接通過Xcode安裝微信7.0.8.ipa會安裝失敗,此時會驗證簽名信息,無法安裝
    WeChat.app包里面的WeChat可執行文件,Frameworks,plugins,watch是需要重簽名的,免費賬號無法對plugins,watch進行重簽名,直接刪除
    framework中也含有簽名信息
image
圖片.png
圖片.png

圖片.png

image

image

framework挨個進行重簽名


image

可執行文件要想重簽名,必須要有x可執行權限,否則簽名不成功

ls -l WeChat
-rwxr-xr-x@ 1 cloud  staff  126048560 10 16  2019 WeChat
image
  • 6.描述文件,用剛剛重簽的個人賬號新建WeChatDemo,編譯,在Product下生成WeChatDemo包中存在描述文件,運行到手機上,同時將描述文件embedded.mobileprovision拷貝到WeChat.app包中,描述文件與Bundle identifier(com.cloud.WeChatDemo)綁定了,在WeChat包中找到info.plist文件將Bundle identifier由com.tencent.xin替換為com.cloud.WeChatDemo
image
image
image
image
  • 7.描述文件信息修改,描述文件中有一個Entitlements,拷貝此Key對應的字典到123.plist文件中,并將123.plist文件名改為entitlements.plist,重簽時需要設置權限,拷貝entitlements.plist到WeChat同一級目錄


    image
image
image
圖片.png

以描述文件entitlements.plist的這一段描述來對WeChat.app這個包設置權限

codesign -fs "Apple Development: 785144130@qq.com (L694845PVL)" --no-strict --entitlements=entitlements.plist WeChat.app

簽名信息變更codesign -vv -d WeChat.app

image
  • 8.通過Xcode安裝WeChat.app,Cmd + Shift + 2打開Xcode安裝頁,安裝WeChat.app
image

image

圖片.png

image

image

IV.Xcode重簽名微信7.0.8版本

  • 1.新建和微信同名的工程WeChat,運行,Products下生成一個WeChat.app包,將前面替換好的已經重簽名的WeChat.app包替換掉此包,再次運行,能成功運行


    圖片.png
image
  • 2.從零開始,運行和微信同名空工程WeChat,
  • A.將微信-7.0.8中的WeChat.app顯示包內容,刪掉Watch,Plugins文件夾
  • B.重簽名Frameworks中的6個framework
  • C.info.plist中的Bundle identifier由com.tencent.xin改為com.cloud.WeChat123
  • D.用修改后的WeChat.app包替換Xcode中Products目錄下的WeChat.app,Xcode發現Products中有WeChat.app,會默認為是已經編譯完成的,運行
image

V.指令切換bash和zsh

chsh -s /bin/bash
chsh -s /bin/bash

VI.Shell

shell是一種特殊的交互式工具,它為用戶提供了啟動程序、管理文件系統中文件以及運行在系統上的進程的途徑。Shell一般是指命令行工具。它允許你輸入文本命令,然后解釋命令,并在內核中執行。
Shell腳本,也就是用各類命令預先放入到一個文本文件中,方便一次性執行的一個腳本文件。

快速新建文件夾和腳本文件的四種方式

  • 1.mkdir shell,cd shell,touch 123.txt,三句代碼是新建文件夾和txt文件


    image
  • 2.新建123.sh,后綴為.sh為腳本文件,執行以下三句其一都能執行,source 123.sh和bash 123.sh,zsh 123.sh的區別是source 123.sh會進入shell目錄中,bash,zsh執行會停留在當前目錄下,source停留在腳本執行完畢的目錄下
bash 123.sh
zsh 123.sh
source 123.sh

執行./123.sh會發現沒有執行權限,ls -l 123.sh,chmod +x 123.sh授權

$source FileName
意思:在當前shell環境中讀取并執行FileName中的命令
特點:
命令可以強行讓一個腳本去立即影響當前的環境(一般用于加載配置文件)。
命令會強制執行腳本中的全部命令,而忽略文件的權限。

bash FileName 、zsh FileName
意思:重新建立一個子shell,在子shell中執行腳本里面的句子。

$./FileName
意思:讀取并執行文件中的命令。但有一個前提,腳本文件需要有可執行權限。

圖片.png

圖片.png

Mac中有多少個shell,shell在bin目錄下


圖片.png
/bin/bash    Mac老系統中,新Mac系統使用zsh
/bin/csh     已經被tcsh替換了
/bin/dash    比bash小很多,效率更高,Ubantu,unix下使用較多
/bin/ksh     AT&T發張,兼容bash
/bin/sh     已經被bash替換
/bin/tcsh   整合cshell,提供更多功能
/bin/zsh    新版Mac自帶

VII.用戶、組、權限

Unix和Linux都是多用戶、多任務的系統,所以這樣的系統里面就擁有了用戶、組的概念。那么同樣文件的權限也就有相應的所屬用戶和所屬組了。

image
圖片.png
image
image

不指定用戶組,默認是所有用戶a


圖片.png

VIII.腳本實現重簽名

  • 1.新建APP和Temp文件夾,拷貝微信-7.0.8.ipa到APP文件夾中
  • 2.新建腳本123.sh,給腳本授予執行權,chmod +r 123.sh
image
  • 3.Xcode中新增運行腳本選項,./123.sh
image
image
圖片.png

執行完腳本WeChat.app已經被拷貝到Temp目錄下

image
# ${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文件上執行權限
# 拿到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"



#----------------------------------------
# 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

VIV.腳本重簽名安裝WeChat8.0.2

8.0.2的包直接運行會崩潰
8.0.2的包中需要刪掉info.plist中的UISupportedDevices,重新打包zip -ry WeChate.ipa Payload/

image
image

運行程序


圖片.png
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容