1. 程式人生 > >iOS非越獄逆向——ipa重簽名

iOS非越獄逆向——ipa重簽名

在iOS逆向開發時需要把下載的ipa檔案安裝到iOS裝置上,才能進行動態分析,才能更好的玩別人的App。但是有經驗的同學是知道的,下載的ipa(AppStore 和自己釋出的除外) 檔案是不能直接安裝到自己的iPhone (未越獄)上的。為什麼?因為蘋果爸爸作了一個比較複雜的加密—簽名。那又有同學問了什麼是簽名呢?為什麼要簽名呢?來看看這裡

為了把下載的ipa 安裝到我們自己的iPhone 上要先對ipa 進行重簽名。

常見的 ipa 重簽名方式

  • 完全重簽名
    證書,mobileprovision、Bundle ID 三者資訊對應一致,這種重簽名方式基本上與直接對程式碼進行簽名的效果是一樣的;
    優點

    :有效期長、穩定性高;
    缺點:維護成本較高,每一個重簽名的ipa都必須修改Bundle ID 並且獨享一套證書和mobileprovision檔案;
    適用範圍:對簽名效果穩定性有要求的公司和團隊;

  • 不完全重簽名
    只保證證書和mobileprovision對應一致,至於這兩者與原ipa的Bundle ID 等資訊是否一致則不考慮;
    優點:看起來較方便維護;
    缺點:實際上並沒有對原ipa的簽名進行完全替換,很容易重簽名失敗,穩定性不高,多則一兩個月,少則三五天就可能發生簽名失效,需要重新簽名,慎用!!
    適用範圍:市面上出售企業證書進行重簽名的個人賣家;

常見的 ipa 重簽名工具

  1. 終端 使用命令列
    需要記憶的命令比較多,步驟比較繁瑣,效率比較低。但是顯得逼格夠高,裝 X 利器。

  2. MonkeyDev
    大牛寫的工具外掛,配置好就能直接用。效率比較高,跟自己建立新的Xcode 專案差不多。但是比較依賴工具,萬一哪一天大牛不開心,不維護或者是需要收費了就比較尷尬

  3. Xcode 自動化重籤
    Xcode 簡單易操作( 我就不信蘋果爸爸會把Xcode 放棄或收費),可以達到類似MonKeyDev 的效果(想想自己可以寫一個自動化重籤的外掛是不是也很牛X)。 前期需要寫一些指令碼可能會比較繁瑣,但要是你指令碼寫的夠好幾乎是一勞永益的。以後直接拿來用就好了。

ipa 重簽過程中需要注意的地方

  1. 由於個人證書不能重籤 Extension 檔案,所以要刪除 ipa 包中的 Extension 檔案。包括 Watch 裡邊的 Extension。為了方便我們一般直接把 Watch 檔案刪除。
    以微信為例:

Watch

PlugIns

  1. ipa 檔案中的第三方 framework 需要我們手動重籤。

Frameworks

  1. 更新下 info.plist 主要是修改 CFBundleIdentifier
  2. 一定要給MackO 檔案更改下執行許可權。

操作一下(以Xcode 自動化重籤為例)

  1. 建立一個新的 Xcode 工程 這裡不用解釋了
  2. 在Xcode 工程裡新增一個指令碼 TARGETS –>Build Phases –> +號 –>New Run Script Phse

New Run Script Phse

接下來指令碼開擼:

先屢一下思路
  1. 在Xcode 工程資料夾裡邊 建立一個App 資料夾(用來存放需要重籤的ipa 檔案),
  2. 將ipa 檔案解壓到本地的Temp 資料夾裡邊
  3. 將解壓出來的.app拷貝進入工程下工程生成的APP包的路徑下並將名稱命名為當前工程的名字(覆蓋掉之前的.app檔案)。
  4. 刪除extension和WatchAPP檔案。
  5. 更新info.plist檔案 CFBundleIdentifier
  6. 給MachO檔案上執行許可權
  7. 重簽名第三方 FrameWorks
  8. 執行簽名命令
上指令碼
# ${SRCROOT} 它是工程檔案所在的目錄
TEMP_PATH="${SRCROOT}/Temp"
#資原始檔夾
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

指令碼寫完了,可以儲存到本地 下次用的時候可以直接匯入本地指令碼路徑就好了。

接下來就搞一下。
直接編譯執行 就可以將微信跑到手機上了,完美實現微信雙開。

當然實現微信雙開不是我們逆向開發的目的,我們額目的是沒有蛀牙 — 咳咳,是為了修改別人的東西,更是為了學好iOS的防護,讓自己的App 更安全。

注意:這裡需要自己下載砸殼了的ipa包,PP助手就可以下。如果有越獄裝置的話也可以選擇自己砸殼。

逆向是為了學習怎麼做才能使自己的app 更安全,而不是為了其他灰色的東西。

特別鳴謝