在测试该应用时,我们不得不“绕过”地理位置验证。
虽然 Android 提供了许多简便的伪造地理位置的方法——包括仅需安装一个应用(模拟地理位置)——但检测这种伪造的方法同样不胜枚举。在 Android 平台上,开发者通常并不认为地理位置本身是一个非常可靠的验证因素。
但在 iOS 平台上,地理位置被认为更为可靠;至少,普通 iOS 用户不会特意注册开发者账号并安装 9 GB 大的 Xcode。但如果这其实并没有看起来那么困难——甚至比在 Android 上还要简单呢?
对比
让我们先来看看 iOS 和 Android 上可用的安全方法之间的差异:
| 名称 | Android | iOS | 描述 |
|---|---|---|---|
| 检查当前 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>
现在您可以打开任意应用,它将在选定的位置显示您的地理位置。
结语
我们绕过了安全措施,并获得了本不应在此设备上可用的一些功能。我们已就如何提升安全性并防范特定场景提出了建议。
感谢阅读,最后我想补充一点:不要依赖用户环境——它随时都可能被伪造。