使用 Brook 下载任意 iOS App 的旧版本

https://www.txthinking.com/talks/
Updated at: 2023-03-16
cloud@txthinking.com

x

Text to Image 生成

English

目的

从 AppStore 下载旧版本的 App,这里以 YouTube v17.15.1 为例

需要软件

😉 理论上在 macOS 也行,但我没找到对应版本 iTunes 的下载地址

登录 iTunes 并设置下载无需密码

  1. 断开 Brook
  2. iTunes 菜单 -> 账户 -> 登录
  3. iTunes 菜单 -> 编辑 -> Preferences -> Store -> Purchases: Never Require. Free Downloads: Never Require

😡 因为苹果的认证服务端会屏蔽很多商业 IP,所以我们提前登录和设置以避免未来的认证请求。

我们需要找到两个东西

找到 App ID 和历史版本 ID 列表

  1. Brook:开启 Fake DNS;关闭 Bypass;开启 Programmable;开启 TUN;Script 填入:

    https://raw.githubusercontent.com/txthinking/bypass/master/ipa/history.tengo

    text := import("text")
    f := func(){
        if in_address {
            if in_address.domainaddress && text.has_suffix(in_address.domainaddress, "-buy.itunes.apple.com:443") {
                return {
                     mitm:true,
                     mitmprotocol: "https",
                     mitmwithbody: true,
                     mitmautohandlecompress: true
                }
            }
            return
        }
        if in_httprequest && !in_httpresponse {
            return in_httprequest
        }
        if in_httprequest && in_httpresponse {
            return in_httpresponse
        }
    }
    out := f()
    

  2. 连接 Brook。然后从 iTunes 里下载 YouTube iPhone App。

  3. MITM 日志里,你应该能看到一个 POST https://p52-buy.itunes.apple.com/WebObjects/MZBuy.woa/wa/buyProduct,body 里即是。

    😉 域名不一定和上面完全一样

  4. appid: body 里的 songId 即是。这里是 544007664

  5. versionid: body 里的 softwareVersionExternalldentifiers 即是

    😉 这是个列表,你可以先全部保存下来

从历史版本 ID 列表找到指定的版本 ID

历史版本 ID ,是这样的 848374799,怎么知道哪个版本 ID 对应的是 v17.15.1 呢?

历史版本 ID 列表是顺序排列的,自己跳跃着下载下来看看,相信以你的聪明才智一会就能找到想要的版本。视频里有我找的过程。

下载旧版本 App

  1. Brook:开启 Fake DNS,关闭 Bypass,开启 Programmable,开启 TUN,Script 填入:

    😡 注意:请自己 fork 修改脚本内的 appidversionid 两个变量

    https://raw.githubusercontent.com/txthinking/bypass/master/ipa/downgrade.tengo

    appid := "544007664" // YouTube
    versionid := "848374799" // v17.15.1
    
    text := import("text")
    f := func(){
        if in_address {
            if in_address.domainaddress && text.has_suffix(in_address.domainaddress, "-buy.itunes.apple.com:443") {
                return {
                     mitm:true,
                     mitmprotocol: "https",
                     mitmwithbody: true,
                     mitmautohandlecompress: true
                }
            }
            return
        }
        if in_httprequest && !in_httpresponse {
            if in_httprequest["Method"] == "POST" && text.contains(in_httprequest["URL"], "/WebObjects/MZBuy.woa/wa/buyProduct") {
                s := string(in_httprequest["Body"])
                if text.contains(s, "<string>"+appid+"</string>") {
                    in_httprequest["Body"] = bytes(text.re_replace(`<key>appExtVrsId</key>\s*<string>\d+</string>`, s, "<key>appExtVrsId</key>\n<string>"+versionid+"</string>"))
                }
            }
            return in_httprequest
        }
        if in_httprequest && in_httpresponse {
            return in_httpresponse
        }
    }
    out := f()
    

  2. 断开 Brook,重新连接。

  3. 从 iTunes 资料库 Library 右键删除刚才下载 YouTube App。重新下载 YouTube iPhone App。从资料库 Library 能看到已经下载的旧版本 YouTube,右键可以查看 ipa 位置。

安装 ipa 文件到手机

这里使用 ideviceinstaller,macOS 有 brew 可以直接安装。Windows 不想自己编译的话,这里有编译好的,用这个吧先。

😡 必须是同一个 Apple ID

  1. 先卸载 iPhone 上的 YouTube
  2. 把 iPhone USB 连线到 Windows
  3. 我用的是 GitBash

    git clone https://github.com/iFred09/libimobiledevice-windows.git
    cd libimobiledevice-windows
    ./ideviceinstaller.exe --install ~/Music/iTunes/iTunes\ Media/Mobile\ Applications/YouTube\ 17.15.1.ipa
    

遇到的情况分享一下:

视频

https://www.youtube.com/watch?v=JtjIz-DldhA

也可以无需服务端

这里 往下看