在测试该应用时,我们不得不“绕过”地理位置验证。

虽然 Android 提供了许多简便的伪造地理位置的方法——包括仅需安装一个应用(模拟地理位置)——但检测这种伪造的方法同样不胜枚举。在 Android 平台上,开发者通常并不认为地理位置本身是一个非常可靠的验证因素。

但在 iOS 平台上,地理位置被认为更为可靠;至少,普通 iOS 用户不会特意注册开发者账号并安装 9 GB 大的 Xcode。但如果这其实并没有看起来那么困难——甚至比在 Android 上还要简单呢?

对比

让我们先来看看 iOS 和 Android 上可用的安全方法之间的差异:

名称AndroidiOS描述
检查当前 SSID/BSSID+±在 Android 上,访问取决于权限和位置限制。在 iOS 上,只有满足 Apple 的要求后才能通过 NEHotspotNetwork.fetchCurrent,但无法获取附近网络列表。
扫描附近 Wi-Fi SSID+-Android 历来允许进行 Wi-Fi 扫描,但受权限、速率限制和位置限制的约束。 在 iOS 上,普通应用无法获取附近 SSID 的列表;苹果明确表示,没有用于获取附近 Wi-Fi 列表的通用 API。
基站+-Android 可通过 TelephonyManager.getAllCellInfo(),包括已注册/服务中的基站和邻近基站,并 ACCESS_FINE_LOCATION 并支持语音通话无线电功能。根据设备、运营商、操作系统版本及权限的不同,结果可能被缓存、受速率限制、不可用或部分不可用。iOS 未提供符合 App Store 安全标准的公开 API 来获取服务基站/邻近基站 ID、LAC/TAC、信号强度或附近基站列表。 CoreTelephony 仅公开有限的运营商/服务提供商信息,而不提供基站级无线扫描数据。

基于此,几乎所有 Android 应用都可以额外请求附近网络,并通过第三方服务将其用于内部地理定位。这些数据可能被伪造,因此并非可靠的定位指标。

在 iOS 平台上,情况略有不同,对应用的要求也略有差异。iOS 还明确禁止将此类数据用于地理定位。无论如何,通过让设备充当网络接入点,这些数据均可被伪造。

两个平台均无直接检测开发者模式的方法,但在 Android 系统上存在用于检测“模拟位置”的检测工具。

Location.isMock() — 在 Android 上。

CLLocation.sourceInformation?.isSimulatedBySoftware — 在 iOS 上。

在 Android 系统中,若设备未获取 root 权限,任何被选中用于模拟位置的应用都会设置 location.isMock=true 标志。不过,结合 deviceIntegrity 机制,理论上可以规避这一情况,或者使其实现难度大幅增加。

但在 iOS 上,情况则有所不同。 CLLocation 可以由应用自身生成;也就是说,如果你使用的是 Xcode 以外的第三方工具包,你可以移除 isSimulatedBySoftware=true

这就是我们要利用的漏洞。此外,我们不会使用任何专有软件——仅使用开源工具。因此,不使用 Xcode、iTools 或 3uTools。

解决方案pymobiledevice3

安装

你必须已安装 Python 3.9 或更高版本。

0. 在终端中运行: python3 -m pip install -U pymobiledevice3

1. 解锁设备

2. 通过 USB 将其连接到计算机并授权访问

3. 点击“信任”此台电脑

4. 启用开发者模式: pymobiledevice3 amfi enable-developer-mode

如果第一次操作未成功,您可能需要重启设备并重复步骤 1–4。

5. 检查“设置” -> “安全与隐私” -> “安全” -> “开发者模式”

6. 让我们检查设备是否被识别: pymobiledevice3 usbmux list

此时应显示:

[
    {
        "BuildVersion": "23F84",
        "ConnectionType": "USB",
        "DeviceClass": "iPhone",
        "DeviceName": "******",
        "Identifier": "0000000-00000000000000",
        "ProductType": "iPhone17",
        "ProductVersion": "26.5.2",
        "UniqueDeviceID": "0000000-00000000000000"
    }
]

已检测到设备。

7. 选择并挂载 iPhone 开发者磁盘映像

pymobiledevice3 mounter auto-mount

挂载成功后,我们可以发送以下命令:

pymobiledevice3 developer dvt simulate-location set --userspace -- <LAT> <LONG>

现在您可以打开任意应用,它将在选定的位置显示您的地理位置。

结语

我们绕过了安全措施,并获得了本不应在此设备上可用的一些功能。我们已就如何提升安全性并防范特定场景提出了建议。

感谢阅读,最后我想补充一点:不要依赖用户环境——它随时都可能被伪造。