iOS 设备 GPS 位置模拟

未越狱 iOS 设备通过 Xcode 修改 GPS 定位信息。

0x01. GPS 坐标简介

GPS 坐标使用经纬度来表示,有几种不同的规范:

  1. WGS-84,World Geodetic System,定义于 1984 年,最后修改定于 2004 年,是被 GPS 所使用的国际规范
  2. GCJ-02,国测局坐标系、火星坐标系,基于 WGS-84 但是会在经纬度中加入看似随机的偏移
  3. BD-09,百度坐标系,在 GCJ-02 的基础上增加了一次变换

《中华人民共和国测绘法》要求地图提供商使用 GCJ-02 坐标系统:

使用 GCJ-02 记录下的地点在 GCJ-02 的地图中会显示在正确位置,然而换成 WGS-84 的地图或地点记录就可能造成 100 - 700 米不等的偏移。据测量,Google.com 的地图与真实坐标相差约 50 - 500 米,而中国区的 Google.cn 地图则与卫星图无偏差

实际测试发现 Google.cn 迁移到 Google.com.hk 之后,使用的是 WGS-84 坐标系,其卫星图与地图存在一定的偏移:

火星坐标系偏移

0x02. Xcode 真机调试

在 Xcode 中新建一个 iOS App,并在 iOS Deployment Target 设置好对应的系统版本。

iOS Deployment Target 设置

首次在 iPhone 上调试,会提示如下错误:

Could not launch “PhoneDemo”
Domain: IDEDebugSessionErrorDomain
Code: 3
Failure Reason: Security
User Info: {
DVTRadarComponentKey = 855031;
RawUnderlyingErrorMessage = Security;
}

DVTRadarComponentKey=855031 RawUnderlyingErrorMessage=Security

在 iPhone 的设置里面信任对应的开发者即可。

0x03. GPS 位置模拟

  1. 通过 高德地图 API 获取目标位置的 GCJ-02 坐标,比如“深圳市腾讯大厦”的坐标为 113.934497,22.540517
  2. 通过 转换工具 将坐标转换为 WGS-84 坐标,这里转换后为 113.92962958,22.54354674
  3. 在 iOS App 工程中新建一个 location.gpx 文件并设置好 WGS-84 经纬度坐标
<?xml version="1.0" encoding="UTF-8" ?>
<gpx version="1.1"
creator="GMapToGPX 6.4j - http://www.elsewhere.org/GMapToGPX/"
xmlns="http://www.topografix.com/GPX/1/1"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.topografix.com/GPX/1/1 http://www.topografix.com/GPX/1/1/gpx.xsd">
<wpt lat="22.54354674" lon="113.92962958">
</wpt>
</gpx>

此时,需要修改 iOS App 工程设置,选择 Edit Scheme...,在 Run - Options - Core Location 中选中 Allow Location Simulation,其中 Default Location 选中前面添加的 gpx 文件。

在连接的 iPhone 上运行该 iOS App,即可临时修改 GPS 位置信息。

深圳市腾讯大厦

当然,这种模拟 GPS 位置的方法弊端也很明显,之前看到有人在 HITB 上讲过 PhantomGPS,相对来说方便和灵活了很多,二代售价 400 块。

0x04. 参考文档

  1. World Geodetic System - Wikipedia
  2. GCJ-02 - Wikipedia
  3. BD-09 - Wikipedia
  4. 妙用 Xcode 修改 iPhone 的当前定位位置
请作者喝杯咖啡☕