使用 ipatool 下載、解壓與驗證 App Store IPA
需要保存 App Store 的 .ipa 檔案時,可以使用 ipatool 以自己的 Apple Account 取得授權並下載,再用 unzip -q -o -d 解壓到指定目錄。下載結果是官方加密 IPA ;能正常解壓、讀取 Info.plist 或瀏覽資產,不代表 Mach-O 已經解密。
最短流程如下:
以 Homebrew 安裝
ipatool,互動式登入 Apple Account。使用 App Store 的數字 App ID 下載 IPA。
用
unzip -t驗證封裝,再以unzip -q -o ... -d ...解壓。從
Info.plist核對版本,並用otool -l檢查每個目標 Mach-O 的cryptid。
實測案例
以下使用 hololive Dreams 台灣 App Store 頁面 作為範例。App Store URL 中的數字 App ID 是 6756641249 ;本次實測日期為 2026-08-05。
項目 | 實測值 |
|---|---|
App | hololive Dreams |
App ID |
|
Bundle ID |
|
Marketing version |
|
|
|
External version ID |
|
最低系統版本 | iOS 16.0 |
IPA 大小 | 533,056,312 bytes,約 508 MiB |
IPA SHA-256 |
|
主程式 | arm64, |
| arm64, |
簽章 metadata | Apple iPhone OS Application Signing,Team ID |
SHA-256 只代表這次取得的檔案,不應假設不同帳號、地區或下載時間會得到完全相同的雜湊。
前置條件
macOS 與 Homebrew。
已能正常使用 App Store 的 Apple Account。
該 Apple Account 所屬商店區域能取得目標 App。
足夠的磁碟空間;解壓後通常會比 IPA 更大。
密碼與 2FA 驗證碼應只在本機互動式提示中輸入,不要寫進 shell history、腳本、環境變數或文件。
安裝與登入 ipatool
安裝 ipatool:
登入 App Store:
依提示輸入密碼與 2FA 驗證碼。登入完成後可以確認目前帳號狀態:
ipatool 的參數可能隨版本變動;實際操作前先查看目前安裝版本的說明:
下載官方加密 IPA
使用 App Store URL 中的 App ID 下載最新版:
參數用途:
--app-id:App Store 的數字 App ID。--purchase:帳號尚未取得授權時,先取得免費或付費 App 的授權。--platform iphone:下載 iPhone 平台套件。--output:指定輸出 IPA 路徑。
沒有指定 --external-version-id 時會下載當前可取得的最新版。因此即使輸出檔名包含預期版本,仍應從解壓後的 Info.plist 再確認實際版本。
驗證並解壓到指定目錄
先設定這次操作使用的檔案與目錄:
驗證 ZIP 結構與 SHA-256:
解壓到指定目錄:
這三個參數分別表示:
-q:quiet,減少一般解壓輸出。-o:overwrite,直接覆寫目的地中的同名檔案。-d:directory,指定輸出目錄。
解壓後,App bundle 通常位於:
IPA 也可能包含 iTunesMetadata.plist、 META-INF/ ,以及 App bundle 內的 SC_Info/、 _CodeSignature/、 Frameworks/ 與 Data/。
核對 Bundle ID 與版本
設定 App bundle 路徑:
使用 macOS 內建的 PlistBuddy 讀取必要欄位:
本次輸出為:
如果 IPA 根目錄含有 iTunesMetadata.plist ,還可以讀取 external version ID,但不要把整份 plist 直接貼到公開文件,避免意外帶出帳號相關 metadata:
檢查 cryptid
cryptid 要逐一檢查,不能只看主程式後就假設所有 framework 狀態相同。對 Unity IL2CPP 遊戲,原生遊戲程式碼常在 UnityFramework:
本次兩個檔案都顯示:
判讀方式:
狀態 | 意義 |
|---|---|
| 該 Mach-O slice 未標示加密,可以繼續靜態分析;仍要另外確認來源與簽章。 |
| 執行內容仍受保護,可先盤點 plist、資產、依賴與簽章,但不能把它當成已解密 Mach-O。 |
沒有 encryption command | 記錄為未知或不適用,不要直接推論成官方原版或已解密。 |
因此這次成功下載與解壓,代表已取得完整官方封裝;不代表主程式或 UnityFramework 已能直接交給 IL2CPP dumper 做完整原生分析。
查看簽章 metadata
讀取 Identifier、簽章鏈與 TeamIdentifier:
本次可看到:
簽章 metadata、ZIP 完整性與 cryptid 是不同檢查面向,不能互相替代。若 codesign --verify 顯示 resource envelope、封裝或簽章錯誤,應保存原始訊息並結合乾淨樣本判讀,不要只靠單一錯誤下結論。
下載指定舊版
先列出 App Store 仍提供的版本:
取得目標 external version ID 後再下載:
Marketing version、 CFBundleVersion 與 external version ID 是不同欄位。版本列表中出現某個項目,也不保證所有帳號、平台或商店區域都仍能下載。
常見問題
為什麼 Apple Configurator 安裝成功,卻找不到 IPA
Apple Configurator 的正式操作是把 App 加入連接裝置或 Blueprint。若目標是取得有明確輸出路徑的 .ipa 檔案,直接使用 ipatool ,不要依賴可能隨版本改變的暫存 cache 路徑。
解壓成功是否代表已解密
不是。ZIP 層、資產檔與 Mach-O 加密狀態是不同層次。以這次樣本為例,IPA 可以完整解壓,但主程式與 UnityFramework 都是 cryptid 1。
為什麼 IPA 大小與 App Store 顯示不同
App Store 顯示的大小、實際下載套件大小與解壓後磁碟占用可能採用不同計算方式,也可能受裝置平台與商店回傳內容影響。記錄時要明確標示是商店顯示值、IPA bytes 還是解壓後大小。