fairplay-decrypt:取出一次憑證,在電腦上離線解密你買的所有 IPA
目錄 👇
從 App Store 下載的 IPA,主程式是被 FairPlay DRM 加密的。過去想解密只有一條路:在越獄裝置上把 App 跑起來,等 iOS 把程式頁解密載入記憶體,再用 frida-ios-dump 之類工具逐個 dump——每個 App 都要在裝置上重跑一次。Ethan Arbuckle 的 fairplay-decrypt 換了個思路:金鑰推導搬到電腦上離線做。
專案:EthanArbuckle/fairplay-decrypt | 10 月 19 日開源,五天累積 1600+ stars
深度:它是怎麼做到的?
關鍵在 IPA 裡本來就帶著的兩份授權紀錄:SINF 與 SUPF。它們包含加密過的金鑰材料,與購買帳號綁定。fairplay-decrypt 的流程是:
- 取憑證(只需一次):用隨附的 credential-retrieval 工具,從一台越獄裝置(iOS 10+、需 root SSH)讀出該帳號的 16-byte FairPlay 憑證,存成
credential.bin。裝置上需至少裝一個 App Store App 供讀取授權 - 離線解密(無限次):在 macOS / Linux 上跑
decrypt.py,工具讀 IPA 的 SINF/SUPF 紀錄,結合憑證推導出每一頁的 page key,逐頁解密 arm64 Mach-O,最後把cryptid旗標清掉,輸出標準的未加密 IPA
推導核心是一支 C 寫的 transform(transform.c + 常數表),用 make 編譯;主程式是 Python 3.9+。
換句話說:憑證是帳號級的,一次取出、重複使用。同一帳號買的 IPA,之後都能在電腦上批量解密,不必再逐個上裝置 dump。
支援範圍
- SUPF v3 與 v5
- SINF
priv紀錄 448-byte 與 440-byte 兩種(440-byte 者尾端須為八個零位元組) - 加密的 arm64 Mach-O 切片
- 取憑證端:主機需 Python、
idevice_id、iproxy與 USB SSH;在 Mac 上建置需 Xcode 與ldid - 指定帳號:可用
--ipa或--sinf選擇授權來源;IPA 有多個 license selector 時用--sinf-member指定
冷思考
- 不是免越獄:第一次取憑證仍需要一台越獄裝置。它省的是「之後每一個 App」,不是「第一次」
- 憑證等同你整個購買庫的主金鑰:
credential.bin只有 16 bytes,但誰拿到它,就能解密你帳號買的所有 IPA。請當成密碼保管,不要上傳、不要分享 - 只能解自己帳號的 IPA:這是密碼學層面的綁定,不是君子協定——別人的 IPA 用你的憑證推不出正確金鑰
- 法律灰色地帶:解密自己購買的 App 做研究、相容性分析是一回事;把解密後的 IPA 散佈出去就是盜版。另外,部分法域的反規避條款(如 DMCA §1201)連「解密自己買的東西」都可能觸法,使用前請自行評估
- 只解 FairPlay 這一層:App 自帶的加密、越獄偵測、完整性校驗不在處理範圍;另外目前只有原始碼(無 Releases),且需要電腦,純手機用戶暫時用不上
結語
fairplay-decrypt 的價值不在「又一個解密工具」,而在它把 FairPlay 的金鑰推導完整實作了出來:從此解密 IPA 從「裝置上的手工活」變成「電腦上的批次作業」。對 iOS 安全研究者來說,這會是繼 frida-ios-dump 之後,工具箱裡的另一個標準選項。